0

由于我如何在 iPhone 上保存一些下载的文件,我正在与应用程序拒绝作斗争。

我已经实现了NSURLIsExcludedFromBackupKey,但我不清楚我是否正确地执行了它。我应该应用NSURLIsExcludedFromBackupKey到代表服务器上文件的 NSURL,还是以某种方式将其应用到 iPhone 上保存文件的目录?

这是我现在创建的,在应用程序被拒绝后:

// Get / Create the File Directory on the iPhone 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"MyDirectory"];

if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
[[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; 

// Setup the NSURL where the PNG is located
NSURL *imageURL = [NSURL URLWithString:@"http://www.myserver.com/image.png"];

NSError *err = nil; // Exclude This Image from the iCloud backup system
BOOL excluded = [imageURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&err];

if (!excluded) {
        //NSLog(@"Failed to exclude from backup");
} else {
    //NSLog(@"Excluding from backup"); // this works...
}
// Create the UIImage
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];

// Data about the downloaded image
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];

if ([data1 writeToFile:pngFilePath atomically:YES] && [data1 writeToFile:pngFilePathRetina atomically:YES]) {
        // Saved to phone
} else {        
        // Did not save to phone
}
4

2 回答 2

1

以下是我最终对其进行编码以使其获得批准的方式。这可能有点矫枉过正,但总比花一个月的时间去猜测究竟如何获得批准要好。

 // Get / Create the File Directory on the iPhone 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"MyDirectory"];

// if the directory does not yet exist on the phone, create it
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; 


    // Assign NSURLIsExcludedFromBackupKey to the directory at dataPath, so is does not backup to iCloud
    NSURL *directoryUrl = [NSURL fileURLWithPath:dataPath isDirectory:YES];
    NSError *err1 = nil;
    BOOL excluded1 = [directoryUrl
                         setResourceValue:[NSNumber numberWithBool:YES]
                         forKey:NSURLIsExcludedFromBackupKey
                         error:&err1];

    if (!excluded1) {
            //NSLog(@"Failed to exclude directory from backup");
    } else {
            //NSLog(@"Excluding directory from backup");
    }



    // Setup the NSURL where the PNG, which will be downloaded, is located 
    NSURL *imageURL = [NSURL URLWithString:@"http://www.myserver.com/image.png"];

    NSError *err2 = nil; // Exclude This Image from the iCloud backup system, Not sure if I need this or not…
    BOOL excluded2 = [imageURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&err2];

    if (!excluded2) {
        //NSLog(@"Failed to exclude from backup");
    } else {
        //NSLog(@"Excluding from backup"); // this works...
    }


   // Create the UIImage
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];

    // Data about the downloaded image
    NSData *downloadedImageData = [NSData dataWithData:UIImagePNGRepresentation(image)];

    // Path for where we are going to save the image
    NSString *storePath = [NSString stringWithFormat:@"%@/myimage.png", dataPath]; 

    if ([downloadedImageData writeToFile:storePath atomically:YES]) {

  // the Image is saved to the phone

  // NSURL representing the image that is now saved on the phone          
  NSURL *imageOnPhone = [NSURL fileURLWithPath:storePath isDirectory:YES];

        // Exclude this image, which is now stored on the phone, from iCloud Backup
        NSError *err3 = nil;
        BOOL excluded3 = [imageOnPhone
                                  setResourceValue:[NSNumber numberWithBool:YES]
                                  forKey:NSURLIsExcludedFromBackupKey
                                  error:&err3];
            if (!excluded3) {
                //NSLog(@"Failed to exclude from backup (standard)");
            } else {
                //NSLog(@"Excluding from backup (standard)");
            }

    } else {        
            // Did not save to phone
    }
于 2013-11-15T18:43:07.333 回答
0

为了更简洁地回答您的原始问题:

你应该向NSURLIsExcludedFromBackupKey目的地申请。即您不想备份的文件或目录。

iPhone 不知道您的应用程序可能正在使用哪些远程文件,因此不可能尝试备份它们。更重要的是,如果您尝试NSURLIsExcludedFromBackupKey在此类 URL 上进行设置,您很快就会发现由于 URL 不受支持而失败。

于 2014-01-14T10:36:55.123 回答