iOS应用程序拒绝由于2.23 - iOS数据存储指南

时间:2015-03-01 16:28:20

标签: ios objective-c app-store appstore-approval

以下是Apple关于拒绝的消息:

  

2.23 - 应用必须遵循iOS数据存储指南,否则将被拒绝   2.23详情

     

在启动和内容下载时,您的应用会存储6.5 MB,但不会   遵守iOS数据存储指南。

     

后续步骤

     

请仅验证用户使用您创建的内容   应用程序,例如,文档,新文件,编辑等由iCloud支持   iOS数据存储指南要求。另外,检查一下   您的应用使用的临时文件仅存储在/ tmp中   目录;请记得删除或删除存储的文件   当确定不再需要它们时,这个位置。

     

可以重新创建但必须保持正常运行的数据   您的应用 - 或者因为用户希望它可供离线使用    - 应标有“不备份”属性。对于NSURL对象,添加NSURLIsExcludedFromBackupKey属性以防止   备份相应的文件。对于CFURLRef对象,请使用   对应的kCRUFLIsExcludedFromBackupKey属性。

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

我没有存储任何Core Data数据库或任何其他数据库文件。但我意识到 Google Analytics和Google跟踪代码管理器会在此路径中存储一些sqlite数据:“AppData / Library”。我的意思是它不存储在这条路径上:“AppData / Library / Caches”。这对iOS数据存储指南有什么影响吗?

顺便说一句, iCloud 已被禁用。

此外,我正在使用 SDWebImage 下载图像,它在启动时存储了近3 MB图像,并将图像数据存储在此路径中:“AppData / Library / Caches”

您是否知道如何处理此问题?

3 个答案:

答案 0 :(得分: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];

我今天再次发送我的应用程序以查看是否有效。

希望得到这个帮助。

答案 1 :(得分:7)

最近,我们被Apple Review Team拒绝了同样的问题,

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

他们建议遵循上述问题中提到的后续步骤

在我们的案例中,我们在下载内容时已在代码中设置此NSURLIsExcludedFromBackupKey 。我们告知审核小组我们已经这样做,因此他们将我们重定向到Apple开发人员技术支持(DTS)以更好地解决问题。

DTS回复说我们的 AppIcon 文件导致了这个问题。

AppIcons正在iCloud中备份,因为Apple要求在下载应用程序时在设备上显示图标。事实证明,我们的应用程序的AppIcons文件非常大,导致拒绝,因为它正在向iCloud备份大量数据。 App Review团队没有向我们明确传达这一点,因为他们中的一些人并不知道跟踪AppIcons的这一新工具更改。

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

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

我希望这有助于有同样问题的人。 :)

答案 2 :(得分: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") }