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

nsurlisecludedfrombackupkey-应用程序必须遵循iOS数据存储指南,否则将被拒绝,ios,iphone,icloud,appstore-approval,Ios,Iphone,Icloud,Appstore Approval,我的应用被拒绝,因为似乎7 mb存储在documents文件夹中,并自动发送到icloud。因此,我通过以下方法循环所有将写入documents文件夹的文件: - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { const char* filePath = [[URL path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileB

我的应用被拒绝,因为似乎7 mb存储在documents文件夹中,并自动发送到icloud。因此,我通过以下方法循环所有将写入documents文件夹的文件:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {   

   const char* filePath = [[URL path] fileSystemRepresentation];
   const char* attrName = "com.apple.MobileBackup";
   if (&NSURLIsExcludedFromBackupKey == nil) {
   // iOS 5.0.1 and lower
   u_int8_t attrValue = 1;
   int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
   return result == 0;
 }
  else {
   // First try and remove the extended attribute if it is present
   int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0);
   if (result != -1) {
       // The attribute exists, we need to remove it
       int removeResult = removexattr(filePath, attrName, 0);
       if (removeResult == 0) {
           NSLog(@"Removed extended attribute on file %@", URL);
       }
   }

   // Set the new key
   NSError *error = nil;
   [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
   return error == nil;
  }
执行此代码后,我的应用程序的1.1版获得批准。上周,我尝试发送同一应用程序的1.2版(文件管理中没有任何更改,存储在documents文件夹中的所有文件都通过AddSkipBackupAttributeToItemAttribute方法循环)。我的应用程序由于同样的原因再次被拒绝。我无法将文件移动到临时文件夹或缓存文件夹,因为我的应用程序无法完全还原文件(其中一个文件是db,还原db意味着丢失任何用户插入的数据),因此此文件不能作为解决方案。无论如何,我在代码中发现了一个问题,以下是我调用该方法的方式:

[self-AddSkipBackupAttributeToItemAttribute:[NSURL fileURLWithPath:fullPath]]

在ios 5.1中使用[NSURL fileURLWithPath:fullPath]设备会返回一个错误,并且似乎无法创建该属性。如果我使用[nsurl URLWithString:defaultStorePath]更改nsurl的初始化,则5.1版本的设备似乎正确添加了该属性

在ios 5.0.1中,所有内容都是反向的,[NSURL URLWithString:defaultStorePath]在[NSURL fileURLWithPath:fullPath]工作时返回错误

也许我可以检查ios版本并设置适当的nsurl初始化,但它仍然是一个问题。我在解释中读到:

特别是,我们发现,在发布和/或内容下载时,您的应用程序存储了7mb。要检查应用程序存储的数据量,请执行以下操作:

  • 安装并启动你的应用程序
  • 进入设置>iCloud>存储和备份>管理存储
  • 如有必要,点击“显示所有应用”
  • 检查应用程序的存储空间

如果我尝试检查这个值,我会看到7 mb也具有正确的nsurl初始化(当所有属性设置正确时)。正确的行为是什么?有人有这个问题吗?在苹果建议的应用程序存储检查之前,我是否需要做一些特定的事情才能使其变得重要?

在我从设备上删除我的应用程序并重新安装之前,我和你有过同样的问题。我还必须通过进入设置->存储和备份->管理存储,从iCloud备份中删除现有的缓存数据

这似乎奏效了。 另外,我添加skip属性的代码有点不同:

-(BOOL)addSkipBackupAttributeToItemAttribute:(NSURL*)URL
{
断言([[NSFileManager defaultManager]fileExistsAtPath:[URL路径]]);
如果(&nsurlisecludedfrombackupkey==nil){//iOS=5.1
n错误*错误=nil;
[URL setResourceValue:[NSNumber numberWithBool:YES]forKey:nsurliseCludedFromBackupKey错误:&error];
返回错误==nil;
}
}

我认为诀窍在于添加nsurlisecludedfrombackupkey,并确保该目录位于documents目录之外。为此,我将文档移动到库/应用程序支持文件夹(因为在/tmp或/Caches文件夹中没有意义):

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
   assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

   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;
      [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
      return error == nil;
   }


}
// store in /Library/Application Support/BUNDLE_IDENTIFIER/Reference
// make sure Application Support folder exists
NSURL *applicationSupportDirectory = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory
                                                                            inDomain:NSUserDomainMask
                                                                   appropriateForURL:nil
                                                                              create:YES
                                                                               error:&error];
if (error) {
    NSLog(@"KCDM: Could not create application support directory. %@", error);
    return nil;
}

NSURL *referenceFolder = [applicationSupportDirectory URLByAppendingPathComponent:@"Reference" isDirectory:YES];
if (![[NSFileManager defaultManager] createDirectoryAtPath:[referenceFolder path]
                               withIntermediateDirectories:YES
                                                attributes:nil
                                                     error:&error]) {
    NSLog(@"KCDM: Error creating Reference folder to store model %@: %@", modelName, error);
    return nil;
}

BOOL success = [referenceFolder setResourceValue:@YES forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
    NSLog(@"KCDM: Error excluding %@ from backup %@", referenceFolder, error);
}