PhoneGap / Cordova 1.5 iOS“不备份”文件属性

时间:2012-04-10 08:48:46

标签: ios cordova icloud phonegap-build

根据Apple网站上的开发人员文档:https://developer.apple.com/library/ios/#qa/qa1719/_index.html

  

从iOS 5.0.1开始,引入了一个新的“不备份”文件属性,允许开发人员清楚地指定应备份哪些文件。 (com.apple.MobileBackup)

我想知道PhoneGap / Cordova是否支持这项功能,因为我希望能够存储一些离线数据(可以下载或以其他方式重新创建的数据,但用户希望在离线时可靠地使用)没有在iCloud上备份。

在PhoneGap网站上明确记录了持久性(LocalFileSystem.PERSISTENT - http://docs.phonegap.com/en/1.5.0/phonegap_file_file.md.html#LocalFileSystem),但似乎无法确保保存的文件不会备份到iCloud。

3 个答案:

答案 0 :(得分:4)

从Phonegap 1.9开始,您可以在config.xml中设置:

 <preference name="BackupWebStorage" value="none" />

BackupWebStorage(字符串,默认为云):有效值为none,cloud和local。设置为云以允许将Web存储数据备份到iCloud,并设置为本地以仅允许本地备份(iTunes同步)。设置为none以不允许任何Web存储备份。

要检查它是否有效,Apple建议用这种方式检查您在iCloud的支持下放置了多少数据:

  • 安装并启动您的应用
  • 转到设置&gt; iCloud&gt;存储&amp;备份&gt;管理存储
  • 如有必要,请点按“显示所有应用”
  • 检查应用的存储空间

请注意,这不能在模拟器中完成。你需要一个真实的设备。

答案 1 :(得分:3)

我仍然坚持在PhoneGap / Cordova中寻求解决方案,但作为临时工作......

在我的AppDelegate init中:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

// Get documents directory
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *formularyPath = [documentsDirectory stringByAppendingPathComponent:@"OfflineData"];

if (![[NSFileManager defaultManager] fileExistsAtPath:formularyPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:formularyPath withIntermediateDirectories:NO attributes:nil error:nil];

// Prevent iCloud backup
u_int8_t b = 1;
setxattr([formularyPath fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);

不要忘记 #import“sys / xattr.h”

这会在文档下创建一个新文件夹,并设置无备份属性。

然后,您可以使用持久化本地文件存储选项将文件保存在PhoneGap中,并且不会备份保存在新子目录中的文件。

答案 2 :(得分:3)

这是一个利用Cordova框架的正常运行的JS代码示例,我相信它可以解决Apple正在寻找的问题。

document.addEventListener("deviceready",onDeviceReady,false);

function onSetMetadataSuccess() {
    console.log("success setting metadata - DONE DONE DONE!")
}
function onSetMetadataFail() {
    console.log("error setting metadata")
}
function onGetDirectorySuccess(parent) {
    console.log("success getting dir");
    parent.setMetadata(onSetMetadataSuccess, onSetMetadataFail, { "com.apple.MobileBackup": 1});
}
function onGetDirecotryFail() {
    console.log("error getting dir")
}

function onFileSystemSuccess(fileSystem) {
    console.log("onFileSystemSuccess()")

    var dirEntry = fileSystem.root;
    dirEntry.getDirectory('Backups', {create: true, exclusive: false},
            onGetDirectorySuccess, onGetDirecotryFail);

}

function onFileSystemFail(evt) {
    console.log("!!!!! onFileSystem fail...")
    console.log(evt.target.error.code);
}

/* When this function is called, PhoneGap has been initialized and is ready to roll */
function onDeviceReady()
{

    // this and subsequent callbacks tells iOS not to store our data in iCloud.
    // without it they rejected our app because of the way PG 1.8 does local->tem storage
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onFileSystemFail);

}