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

时间:2012-07-12 05:09:38

标签: ios ipad data-storage

我开发了一个应用程序,可以从网上下载mp3文件(大约6到8 MB的大小)并存储在NSDocumentDirectory中。我的应用程序今天被拒绝并且说

"Apps must follow the iOS Data Storage Guidelines or they will be rejected"


 We found that your app does not follow the iOS Data Storage Guidelines, which is
 required per the App Store Review Guidelines. The iOS Data Storage Guidelines 
 indicate that only content that the user creates using your app, e.g., documents,
 new files, edits, etc., may be stored in the /Documents directory - and backed up
 by iCloud. 

 Temporary files used by your app should only be stored in the /tmp directory; 
 please remember to delete the files stored in this location when the user exits 
 the app. "

我曾经将音乐文件存储在NSDocumentDirectory中。 所以,这是我第一次这样做,我无法弄清楚实际问题。我该怎么做才能重新提交我的应用程序以便接受。

这是我的代码

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);



 NSString *documentsDirectoryPath = [[paths objectAtIndex:0]stringByAppendingPathComponent:[NSString stringWithFormat:@"psalmsMusic%d.mp3",i]];
NSLog(@"ddddddd psalmsMusic%d.mp3",i);
i++;


 NSLog(@"path %@",documentsDirectoryPath);
 [receivedData writeToFile:documentsDirectoryPath atomically:YES];

确实需要一些帮助。

7 个答案:

答案 0 :(得分:7)

由于同样的原因,我的应用程序被拒绝,解决方案非常简单,而不是将下载的文件保存到Documents目录,您必须将它们保存到Cache目录,这是一个临时目录,无法备份到iCloud可以在某些情况下由操作系统随机删除...这是将文件保存到缓存目录的方法

NSString *filePath = [[self applicationCachesDirectory] stringByAppendingPathComponent:fileName];


BOOL flag = [[NSFileManager defaultManager] createFileAtPath:filePath contents: receivedData attributes:nil];

编辑

NSString *filePath = [[self applicationCachesDirectory]  stringByAppendingPathComponent:[NSString stringWithFormat:@"psalmsMusic%d.mp3",i]];
NSLog(@"ddddddd psalmsMusic%d.mp3",i);
i++;
BOOL flag = [[NSFileManager defaultManager] createFileAtPath:filePath contents: receivedData attributes:nil];
if ( flag )
  NSLog("success");

答案 1 :(得分:3)

在Apple实施iCloud后,文档目录数据与iCloud Storage有某种关联。因此,Apple现在拒绝在文档目录中使用大量数据存储的应用程序。

您需要将数据存储在其他位置。存储MP3文件在其他位置。

此链接可以帮助您。

http://www.techotopia.com/index.php/Working_with_Directories_on_iOS_4_%28iPhone%29

我希望它能解决你的问题。

另一个是..........

iOS数据存储指南指出,只有用户使用您的应用创建的内容(例如文档,新文件,编辑等)可以存储在/ Documents目录中 - 并由iCloud备份。

您的应用使用的临时文件只应存储在/ tmp目录中;请记得在用户退出应用程序时删除存储在此位置的文件。 可以重新创建但必须保持应用程序正常运行的数据 - 或者因为客户希望它可供脱机使用 - 应标记为“不备份”属性。对于NSURL对象,请添加NSURLIsExcludedFromBackupKey属性以防止备份相应的文件。对于CFURLRef对象,请使用相应的kCFURLIsExcludedFromBackupKey属性。

有关详细信息,请参阅http://developer.appcelerator.com/question/134926/ipad-app-rejected-ios-data-storage-guidelines

答案 2 :(得分:3)

Apple希望减少备份足迹的大小。

首先,停止使用Documents。这不合适。

如果您能够轻松地再次下载文件,则应将它们存储在不会备份的位置。我建议缓存。如果它们被清除,你应该再次下载它们。

如果难以再次下载它们,则应将它们存储在Library文件夹中的其他位置。

您可以使用以下命令找到Caches目录:

NSArray *paths = NSSearchPathForDirectoriesInDomains(
                        NSCachesDirectory, NSUserDomainMask, YES);

基本上,这就是您现在所拥有的,但您使用NSDocumentDirectory代替NSCachesDirectory

如果您控制文件名,这样就可以了。如果你不这样做,你应该创建一个子目录并从那里开始工作,这样你就不会碰到任何东西。

答案 3 :(得分:1)

您无法存储在NSDocumentDirectory中,因为此目录现在用于与iCloud同步。但您可以使用NSCachesDirectory或使用临时目录作为商店音乐文件的苹果评论状态。

答案 4 :(得分:1)

指南说只有无法从互联网上重新创建(下载)的重要文件才能进入文档目录,因为这是

答案 5 :(得分:1)

根据iOS存储指南(可在http://developer.apple.com/icloud/documentation/data-storage/找到),您应将所有用户生成的内容放在Documents目录中,并将所有可重新下载的内容放在Caches目录中。所以你应该把sqLite数据库放在那里。

背景是从iOS 5开始,Documents目录备份到iCloud。由于很多应用程序倾向于存储他们的完整数据,因此iCloud备份变得相当大,占用了可用空间并创建了网络流量,这反过来又激怒了用户,因为他/她想知道原因。为了缓解这个问题,Apple现在似乎更加仔细地研究了保存在Documents目录中的内容,以及这是否是可重新生成的内容(例如可下载的文件)。

请注意,当设备上的可用空间变低时,操作系统可以并且将在iOS 5上清除Caches目录。因此,您的应用程序不能再像以前一样假设所有内容都存在,而是每次从缓存中访问某些内容时都需要重新检查。

希望这有助于......!

答案 6 :(得分:0)

由于同样的原因,我的应用也被拒绝了 - (2.3)

试试这个 -

NSString * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);

只要您的设备与云同步,此时应用程序数据就不会同步,因为它在NSCachesDirectory中而不是NSDocumentDirectory。

缺点是,无论何时使用设备,设备内存较少。然后CPU可能会清除缓存以获得可用空间。因此,如果您有任何离线使用的数据,您可能会丢失。

2)如果你不能使用NSCachesDirectory(可能是因为你的数据太重要了)那么你可以这样做 -

使用此方法并提供数据库路径 - 'addskipbackupattributetoitematurl'

通过此链接 - How to use addSkipBackupAttributeToItemAtURL API?