iOS 阻止文件备份到 iCloud

Posted

技术标签:

【中文标题】iOS 阻止文件备份到 iCloud【英文标题】:iOS prevent files from being backed up to iCloud 【发布时间】:2014-05-27 06:50:42 【问题描述】:

在我的应用程序中,我必须存储核心数据数据库。我在 xcode 项目导航器中有一些包含默认数据(音频文件、地图块等)的组和文件夹。

我发现了很多关于防止文件被备份的信息,例如: 我做了什么:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

    if (_persistentStoreCoordinator != nil) 
        return _persistentStoreCoordinator;
    

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db.sqlite"];
    NSLog(@"%@", storeURL.path);

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    //NSDictionary *options = @NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES;
    /*NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];*/

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    

    [self addSkipBackupAttributeToItemAtURL:storeURL];

    return _persistentStoreCoordinator;


- (NSURL *)applicationDocumentsDirectory

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

预防方法:

    - (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;

(最低目标iOS版本为7.0)

这就够了吗?如何检查应用程序现在是否阻止备份核心数据数据库?

在我添加 addSkipBackupAttributeToItemAtURL 方法之前,我检查了应用程序的存储,并在文档和数据下找不到任何内容。我只在备份下找到 3.1 MB -> 我的 iphone

- Install and launch your app
- Go to Settings > iCloud > Storage & Backup > Manage Storage 
- If necessary, tap "Show all apps" 
- Check your app's storage

【问题讨论】:

【参考方案1】:

你做得对。 在 Apple Technical Q&A 1719: How do I prevent files from being backed up to iCloud and iTunes? 之后,您应该使用“不备份”属性进行标记。

对于NSURL对象,添加NSURLIsExcludedFromBackupKey属性,防止对应文件被备份。对于CFURLRef 对象,使用相应的kCFURLIsExcludedFromBackupKey 属性。

要知道哪个文件夹更适合存储您的 Core Data 数据库,您可以查看ios Data Storage Guidelines。

【讨论】:

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

IOS 5.1 从文档目录备份/恢复应用程序文件到/从 iCloud

ios应用, 设置不自己主动备份到iCloud

ios应用, 设置不自己主动备份到iCloud

如何设置我的iOS应用程序以使用自动iCloud备份?

Phonegap-iOS 防止 iCloud 上的 Documents 文件夹备份

iOS 5.0.1:如何验证文件夹是不是标记为 iCloud 的“不备份”?