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 Documentscom.apple.metadata:com_apple_backup_excludeItem: com.apple.MobileBackup

以上是关于Phonegap-iOS 防止 iCloud 上的 Documents 文件夹备份的主要内容,如果未能解决你的问题,请参考以下文章

如何防止应用程序备份到 iCloud

iOS - 防止使用相机拍摄的照片进入 iCloud

防止 iCloud 同步数据(使用 .nosync?)

忘记Apple ID密码,如何从iPhone/iPad上移除 iCloud账号?

防止在 OS X 中启动时出现 iCloud 打开文件对话框 [重复]

iOS7.0防止数据库(核心数据)同步到iCloud和备份到iTunes