根据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。
答案 0 :(得分:4)
从Phonegap 1.9开始,您可以在config.xml中设置:
<preference name="BackupWebStorage" value="none" />
BackupWebStorage(字符串,默认为云):有效值为none,cloud和local。设置为云以允许将Web存储数据备份到iCloud,并设置为本地以仅允许本地备份(iTunes同步)。设置为none以不允许任何Web存储备份。
要检查它是否有效,Apple建议用这种方式检查您在iCloud的支持下放置了多少数据:
请注意,这不能在模拟器中完成。你需要一个真实的设备。
答案 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);
}