1

根据苹果网站上的开发者文档: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。

4

3 回答 3

4

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

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

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

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

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

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

于 2014-01-29T11:03:14.300 回答
3

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

在我的 AppDelegate 初始化中:

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 中,并且不会备份保存在新子目录中的文件。

于 2012-04-10T12:38:24.260 回答
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);

}
于 2012-06-28T04:09:36.697 回答