IOS:不备份属性吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (76)

我们的应用程序最近因违反iOS Data Storage Guidelines关于备份 iCloud 上的文件。

我必须用do not back up属性。

我将所有重要数据存储在 SQLite 数据库中,用户首选项存储在 UserDefaults.plist 中。我是否必须将数据库标记为do no back up?

我问审查员我是否要禁用iCloud。

下面是评审员的回答:

您的应用程序不遵循 iOS 数据存储指南,这是 AppStore 评论指南所要求的。

特别是,我们发现在启动和/或内容下载时,应用程序存储了 4MB。要检查应用程序存储了多少数据:

  • 安装并启动应用程序
  • 转到 Settings>iCloud>Storage&Backup>ManageStorage
  • 如有必要,点击“显示所有应用程序”
  • 检查应用程序的存储空间

IOS 数据存储指南指出,只有用户使用应用程序创建的内容,例如文档、新文件、编辑等,才应该由 iCloud 备份。

应用程序使用的临时文件只应存储在 /tmp 目录中;当用户退出应用程序时,请记住删除存储在此位置的文件。

数据可以重新创建,但必须持久,以便您的应用程序正常运行-或者因为客户期望它可以脱机使用-应该标记为“不备份”属性。对于 NSURL 对象,添加 NSURLIsExcludedFromBackupKey 属性以防止备份相应的文件。对于 CFURLRef 对象,使用相应的kCFURLIsExcludedFromBackupKey属性。

有关更多信息,请参见技术问答1719:如何防止文件被备份到iCloud和iTunes?

有必要修改应用程序以满足IOS数据存储指南的要求。对于离散代码级别的问题,您可能希望咨询苹果开发人员的技术支持。请务必:

  • 包括你的拒绝问题的全部细节。
  • 准备任何象征性的崩溃日志,屏幕截图和步骤,以便在DTS工程师跟进时重现问题。
提问于
用户回答回答于

您可以调用以下函数将“map.sqite”的路径作为NSURL传递:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath];
[self addSkipBackupAttributeToItemAtURL:url];
The function is provided in Apple as:

- (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;
}
用户回答回答于

基本上,这取决于您存储的数据类型。

如果数据可以重新生成(例如,当用户在另一个设备上安装应用程序时),则不应该对其进行备份。

否则,iCloud备份是可以的,因为用户会期望他的数据是可用的,甚至在另一个设备上也是如此。

在第一个场景中,你基本上有两种方法来实现这一点...

要么你用NSURL设置kCFURLIsExcludedFromBackupKey在您的文件中,要么将它们存储在不会备份的位置,比如<Application_Home>/Library/Caches注意,第二个解决方案更好,IMHO。

想了解情况,kCFURLIsExcludedFromBackupKey可以这样使用:

NSURL * fileURL;

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ];

[ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ];

对于第二种情况,有时苹果的评论员认为你的数据可以重新生成。然后你必须解释为什么数据必须被备份。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励