我的iphone应用程序被拒绝了,原因是“我们发现您的应用程序没有遵循iOS数据存储指南,......”

时间:2012-01-07 06:51:50

标签: iphone ios storage ios5

我的iphone应用程序最近遭到拒绝&出于以下原因:

“我们发现您的应用不符合iOS数据存储指南,该指南不符合App Store审核指南。”

对于这个应用程序,我将数据库(sqlite文件)存储在iOS 5.0.1&的/ Documents /目录中。以上&适用于iOS 5.0&以下版本我使用了Library / Cache目录。

其他数据,如PDF&我从服务器下载的艺术作品图片我采用了与上述相同的方法: iOS 5.0.1&稍后:将这些数据保存到/ Documents /目录中 iOS 5.0&早期版本:将数据保存到库/缓存目录。

这种做法是否正确?

根据Apple指南: 重要:新的“请勿备份”属性仅供iOS 5.0.1或更高版本使用。在iOS 5.0及更早版本中,应用程序需要将其数据存储在/ Library / Caches中以避免备份。由于旧系统会忽略此属性,因此您需要确保您的应用符合您的应用支持的所有iOS版本上的iOS数据存储指南。

对于为iOS 5.0.1&存储的数据存储的“不备份”属性分配也非常困惑。后来。我需要为哪些文件分配这个标志?我可以将它用于数据库吗?。

需要摆脱这些拒绝,因为它已经发生过两次。请提供一些存储我的应用程序数据的指导。提前致谢。期待积极的回应。

3 个答案:

答案 0 :(得分:17)

检查https://developer.apple.com/icloud/documentation/data-storage/

具体是:

  

将此属性与可以重新创建但需要的数据一起使用   即使在低储存条件下也能保持正常运行   应用程序或因为客户希望它在脱机使用期间可用。   此属性适用于标记文件,无论它们是哪个目录   在,包括Documents目录。

将SQLite数据库存储在caches文件夹中并设置donotbackup标志,该标志将停止缓存清理系统删除的文件

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}

我在我的应用程序中使用数据库并将其存储在缓存文件夹中(设置了上面的标志)并且刚刚获得批准没问题。

此外,您可以将数据存储在文档目录的子文件夹中,我相信这些子文件夹不会备份,但会保留。

答案 1 :(得分:6)

我的一个朋友有同样的问题。基本问题是您可能在应用程序文档目录中存储大量数据。

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

您需要将数据存储在其他位置。存储PDF和&其他艺术品档案在其他地方。

此链接可以帮助您。

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

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

答案 2 :(得分:2)

要解决Apple拒绝您的应用程序的申请,请不要遵循iOS数据存储指南,请在您的应用程序中添加以下代码。

   - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
      if (&NSURLIsExcludedFromBackupKey == nil) 
      {
            // iOS <= 5.0.1  
            const char* filePath = [[URL path] fileSystemRepresentation];  
            const char* attrName = "com.apple.MobileBackup";  
            u_int8_t attrValue = 1;  
            int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);  
            return result == 0;  
       } 
       else
        {
             // iOS >= 5.1  
             NSError *error = nil;  
            // if you set YES in Resources value then iTune will not backup that file or folder.
            //  You set FALSE in Resources value then iTune will backup that file or folder.
             [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];  
             return error == nil;
        } 
}

使用此方法(示例)

NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"CDTDatabaseNew" ofType:@"sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
NSURL *guidesURL = [NSURL fileURLWithPath:dbPath];
[self addSkipBackupAttributeToItemAtURL:guidesURL];

在Document目录中创建或复制文件时,必须使用此方法。

注意:-Apple已经更改了数据存储指南,如果您要在Document目录中存储任何内容,那么您必须修改上面的代码,不要错过这部分代码。

如果您不放置该代码,应用程序将被拒绝。所以现在,每当你在文档目录中创建数据库,存储缓存的图像等时,每个人都必须添加那些代码。 希望下次因为这个原因我不会拒绝app。

相关问题