iOS应用程序因2.23 - iOS数据存储指南被拒绝

20

以下是苹果公司拒绝应用的信息:

2.23 - 应用必须遵守 iOS 数据存储指南,否则将被拒绝 2.23 详细信息

在启动和内容下载时,您的应用程序会存储6.5 MB的数据,这不符合iOS数据存储指南。

下一步操作

请验证仅用户使用您的应用程序创建的内容,如文档、新文件、编辑等,会按照“iOS数据存储指南”的要求由iCloud进行备份。此外,请检查您的应用程序使用的任何临时文件是否仅存储在 /tmp 目录中;当确定不再需要位于该位置的文件时,请记得删除或删除存储在此处的文件。

可重新创建但必须保持适当运行的应用程序数据,或因用户希望其离线使用而必须存在的数据,应标记为“不备份”。对于 NSURL 对象,请添加 NSURLIsExcludedFromBackupKey 属性以防止相应的文件被备份。对于 CFURLRef 对象,请使用相应的 kCRUFLIsExcludedFromBackupKey 属性。

我检查了我的应用程序在设备和模拟器上的数据文件。我发现,如果应用程序使用一段时间后,其总应用程序数据可以存储5-6 MB,在启动时。但是我卸载并重新安装了应用程序,并再次检查,我看到在应用程序启动时存储了约3MB的数据。

我没有存储任何核心数据数据库或任何其他数据库文件。但是我已经意识到 Google Analytics 和 Google Tag Manager 在此路径上存储了一些 sqlite 数据:"AppData/Library"。我的意思是它不会存储在此路径:"AppData/Library/Caches"。这会对iOS数据存储指南产生影响吗?

顺便说一下,iCloud 已禁用应用程序。

我正在使用SDWebImage下载图片,它在启动时会存储近3 MB的图片,并将图像数据存储在此路径上:"AppData/Library/Caches"

你有什么想法来解决这个问题吗?


1
我最近也收到了苹果的同样信息。你是否将任何数据存储在/Documents/或其他位置? - orkenstein
@orkenstein 是的,Adjust和ad-x(第三方营销库)会在/Documents目录中存储一些文件。这样做的目的是什么? - ersentekin
1
根据苹果规定,/Documents 文件夹中不应包含除用户创建的数据以外的任何内容。否则,必须设置 NSURLIsExcludedFromBackupKey(以防止与 iCloud 同步)。 因此,我的建议是您需要为 /Documents 中的每个文件手动设置 NSURLIsExcludedFromBackupKey。 - orkenstein
1
如果使用iCloud备份,默认情况下为“是”。请查看以下链接: https://dev59.com/j17Va4cB1Zd3GeqPO_kC - orkenstein
1
我认为这是由于您的应用程序大小加上/Documents、/Library/Cache等中的所有文件所致。 - orkenstein
显示剩余6条评论
3个回答

25

我昨天刚刚收到同样的拒绝消息。

我在application:didFinishLaunchingWithOptions:中使用以下代码,以查看我的应用程序内的文档文件夹中有哪些内容,以及每个项目关于iCloud备份的权限:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSArray *documents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:basePath error:nil];
NSURL *URL;
NSString *completeFilePath;
for (NSString *file in documents) {
    completeFilePath = [NSString stringWithFormat:@"%@/%@", basePath, file];
    URL = [NSURL fileURLWithPath:completeFilePath];
    NSLog(@"File %@  is excluded from backup %@", file, [URL resourceValuesForKeys:[NSArray arrayWithObject:NSURLIsExcludedFromBackupKey] error:nil]);
}

我在那个文件夹里有一些正在与iCloud同步的文件。因此,我将NSURLIsExcludedFromBackupKey键的资源值设置为YES,以排除这些文件被iCloud备份,而不是将这些文件保存在其他地方,像这样:

NSURL *URL = [NSURL fileURLWithPath:photoPath];
[URL setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:nil];

我今天再次发送我的应用程序,看看它是否正常工作。

希望这能帮到你。


4
只是想给大家更新一下,经过这次修改后我的应用被接受了。 :) - Glauco Neves
我很好奇审核团队是如何发现应用大小的,因此我按照他们提到的步骤进行了跟踪,我看到的数字只有几KB,而不是100MB。我还在@Glauco Neves的代码片段中检查了application:didFinishLaunchingWithOptions方法,但没有找到问题。我们回复审核团队并附上iCloud的截图,但他们仍然指出在审核iOS数据存储时应用程序存储了134.34 MB。 - Mia
我遇到了同样的问题。他们告诉我我正在使用6Mb。他们确切地说:“在启动和内容下载时,您的应用程序会将6.32MB存储在用户的iCloud上,这不符合iOS数据存储指南。”但是我没有在我的应用中启用iCloud... @Bastet你能解决这个问题吗?使用Glauco Neves的代码,我无法解决它。 - Miguel
@Miguel,在另一次代码审查中,我们发现有一个文件夹我们忘记设置此选项。我们现在已经通过了审查。 - Mia
@Miguel,你修好了吗?我不知道是什么原因导致的问题。是第三方库的问题吗? - KarenAnne

7

最近,我们因为同样的问题被苹果审核团队拒绝了。在启动和内容下载时,您的应用程序会将9.65MB存储在用户的iCloud上,这不符合iOS数据存储指南。

他们建议按照上面提出的同样的下一步操作。

在我们的情况下,在下载内容时,我们已经在代码中设置了NSURLIsExcludedFromBackupKey。我们告诉审查团队,我们已经这样做了,所以他们把我们转到苹果开发者技术支持(DTS) 来更好地解决问题。

DTS回复说,是我们的AppIcon文件引起了问题。

在下载应用程序时,AppIcons会在iCloud上备份,因为Apple需要在设备上显示图标。结果我们应用程序的AppIcons文件如此之大,导致被拒绝,因为它在向iCloud备份大量的数据。由于一些审核团队成员不知道跟踪AppIcons的新工具变化,因此这个问题没有被清楚地传达给我们。

现在我们知道了原因,使用ImageOptim优化了我们的图标,并将其大小缩小到75KB。

我们提交了我们的应用程序,希望在1到2天内获得批准。:)

我希望这能帮助遇到同样问题的人。 :)


我认为我有同样的问题。谢谢你分享! - M.Y.
很高兴能帮助到你。希望这个解决方案对你有用。 :) @M.Y. - KarenAnne
谢谢您发布这个问题。我怀疑我也遇到了同样的问题。他们说我的应用程序使用了6.7 MB的iCloud存储空间,但在iCloud设置中只显示了大约6 KB。然而,我的应用程序图标占用了约10 MB的空间。 - Sigma4Life
好的,如果苹果审核团队在优化应用程序图标后批准了您的应用程序,请告诉我。 :) @Sigma4Life - KarenAnne
@KarenAnne 在优化图标后,我的应用程序已经获得了批准。 - Sigma4Life
@Sigma4Life 很高兴知道。 :) - KarenAnne

5

最近遇到了同样的问题,刚好翻译了Glauco的答案成Swift代码(虽然可能可以更加简洁)

let directories = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true)
    if let documentDirectory = directories.first {
        do {
            let documents = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentDirectory)
            for files in documents {
                let urlForm = NSURL.fileURLWithPath(documentDirectory + "/" + files)
                do {
                    try print("\(files): \(urlForm.resourceValuesForKeys([NSURLIsExcludedFromBackupKey]))")
                } catch {
                    print("can't find key")
                }
            }
        } catch {
            print("can't retrieve contents")
        }
    }

设置setResourceValue的代码

let urlToExclude = NSURL.fileURLWithPath(quoteSavePath!)
    do {
        try urlToExclude.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey)
    } catch { print("failed to set resource value") }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接