Phonegap-iOS 防止 iCloud 上的 Documents 文件夹备份
Posted
技术标签:
【中文标题】Phonegap-iOS 防止 iCloud 上的 Documents 文件夹备份【英文标题】:Phonegap-iOS Prevent Documents folder backup on iCloud 【发布时间】:2014-05-05 12:49:31 【问题描述】:我有一个应用程序因为 iCloud 备份使用不当而被拒绝。
简而言之,我在 Documents 文件夹中存储了一个预填充的数据库,我需要将其从 iCloud 备份中排除。
我的问题是:
1) config.xml 中的 BackupWebStorage 设置是否设置为“none”?或者它只是阻止备份 WebKit 文件夹?
2) 如果它不起作用,我知道我应该使用以下代码:
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success)
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
return success;
但是(脸红),我不知道我应该如何在这段代码中指定文件,假设路径是:
文档/0000000000000001.db
我要在哪里注明?
真的,每一种帮助都将不胜感激。
提前致谢
麦芽酒
【问题讨论】:
【参考方案1】:你试过我在 phonegap 的 google 群里告诉你的吗?
您可以在 .db 文件上使用 setMetadata 函数,类似这样
// Wait for device API libraries to load
//
document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available
//
function onDeviceReady()
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
function gotFS(fileSystem)
fileSystem.root.getFile("0000000000000001.db", null, gotFileEntry, fail);
function gotFileEntry(fileEntry)
// Set the metadata
fileEntry.setMetadata(success, fail, "com.apple.MobileBackup": 1);
function success()
console.log("The metadata was successfully set.");
function fail()
alert("There was an error in setting the metadata");
【讨论】:
宾果游戏!它有效,文件被标记:iMac-xxxxxxxx:Documents xxxxxxxx$ xattr -l 0000000000000001.db com.apple.metadata:com_apple_backup_excludeItem: com.apple.MobileBackup
- 只是一个疑问:com.apple.MobileBackup 仍然有效还是已弃用? - Objective-c 的方式是我会继续努力的。不幸的是,我很着急,需要在 AppStore 上踢它
当你使用 com.apple.MobileBackup 设置文件元数据时,它在内部与 Lee Crossley 提出的objective-c 方式相同,它不被弃用【参考方案2】:
我认为该设置仅适用于网络存储(虽然这不清楚)。
在过去,我已经完全确定没有使用我去年写的这个要点在 Document 或 Library 目录中备份到 iCloud:
https://gist.github.com/leecrossley/4130115
【讨论】:
太棒了!只是几个问题:我必须把它放在 appDelegate.m 中吗? 是的,我就是这样做的 非常感谢,我会尽快尝试【参考方案3】:我尝试添加以下代码:
NSString* doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* lib = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version < 5.1)
NSLog(@"************ ios 5.0");
u_int8_t b = 1;
setxattr([doc fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
setxattr([lib fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
else
NSLog(@"************ iOS 5.1");
NSURL* url = [NSURL fileURLWithPath:doc];
[url setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: Nil];
url = [NSURL fileURLWithPath:lib];
[url setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: Nil];
NSLog(@"************ FILES FLAGGED");
紧接着
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
在 AppDelegate.m 中
它运行顺利,但是当我使用终端测试结果时:
在新的终端窗口中打开 Simulator App 的 Documents 文件夹
检查文件属性(我的数据库路径是 Documents/0000000000000001.db):
xattr -l 0000000000000001.db
我没有得到任何回应,这(至少我认为)意味着该文件尚未被标记。
有什么我错过的吗?
感谢您的耐心等待
亚历山德罗
【讨论】:
您尝试的代码为 Documents 和 Library 文件夹设置了 nobackup 标志。这将阻止 iCloud 备份其中的所有文件。我使用此代码后检查了属性:xattr -l Documents
com.apple.metadata:com_apple_backup_excludeItem: com.apple.MobileBackup
以上是关于Phonegap-iOS 防止 iCloud 上的 Documents 文件夹备份的主要内容,如果未能解决你的问题,请参考以下文章
忘记Apple ID密码,如何从iPhone/iPad上移除 iCloud账号?