从iCloud备份中排除:NSURLIsExcludedFromBackupKey [英] Exclude from iCloud backup: NSURLIsExcludedFromBackupKey

查看:173
本文介绍了从iCloud备份中排除:NSURLIsExcludedFromBackupKey的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序第二次遭到拒绝,我失去了3周:(

My app had been rejected the 2nd times and I lost 3 weeks :(

第一次提交,我排除了只有DIRECTORIES在iCloud中备份.Apple拒绝...

The first submit, I excluded ONLY DIRECTORIES from being backed-up in iCloud. Apple rejected...

第二次提交,我排除了从iCloud备份下载的DIRECTORIES& PICTURES。Apple又拒绝了...... Apple也抱怨我有我的应用程序内购买没有恢复功能,而事实上,我确实有一个恢复按钮,当我测试它时,它有效。

The second submit, I excluded DIRECTORIES & PICTURES downloaded from being backed-up in iCloud. Apple again rejected... Apple also complaint that I have no "Restore" feature for my In-App purchase, while in fact, I do have a "Restore" button and it worked when I tested it.

我是按照Apple的建议完成,将文件排除在使用NSURLIsExcludedFromBackupKey进行备份.Macmade在 stackoverflow here:

I've done as Apple had suggested by excluding the file from being backedup using NSURLIsExcludedFromBackupKey. There was an interesting comment made by Macmade's on stackoverflow here:


有时Apple审核人员认为您的数据可以重新生成
它不是。然后你必须解释为什么数据必须备份

sometimes Apple reviewers think your data can be re-generated, when it's not. Then you'll have to explain why the data has to be backed-up

审稿人多久误解一次,我们必须向他们解释内容是否需要离线和&不可重新生成?

How often do the reviewer misunderstood and we have to explain to them that the content is required offline & not re-generateable?

这是我用来排除文件和代码的代码。来自iCloud的目录。你发现任何问题吗?

Here is the code I used to exclude my files & directories from iCloud. Do you spot any problems?

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    // There's a chance the download failed, but don't assert here
    //assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES]
                                  forKey:NSURLIsExcludedFromBackupKey
                                   error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}

//Download picture from Google and exclude it from being backed-up in iCloud
- (void)downloadFetcher:(GTMHTTPFetcher *)fetcher
       finishedWithData:(NSData *)data
                  error:(NSError *)error
{

    if (error == nil) {

        // successfully retrieved this photo's data; save it to disk
        GDataEntryPhoto *photoEntry = [fetcher propertyForKey:@"photo entry"];

        // Create album directory if it doesn't already exist
        NSString *path = [self findOrCreateApplicationSupportSubPath:[photoEntry albumTitle]];
        path = [path stringByAppendingPathComponent:[[photoEntry title] stringValue]];

        if (path != nil) {

            // Write to disk
            BOOL didSave = [data writeToFile:path
                                     options:NSDataWritingAtomic
                                       error:&error];
            if (didSave) {

                // Exclude file from being backed up in iCloud
                NSURL *url = [NSURL fileURLWithPath:path];
                BOOL excludeBackupResult = [self addSkipBackupAttributeToItemAtURL:url];

                if (excludeBackupResult == NO) {
                    NSLog(@"Error excluding FILE from iCloud: %@", path);
                }

                // Update the download progress bar
                _downloadedFileCounter = _downloadedFileCounter + 1;
                float progress = _downloadedFileCounter / kMaleWireframeImagesTotal;
                [self updateProgress:progress];

                // The download completed. -2 just incase a package is lost, but let the user move on...
                if (_downloadedFileCounter >= _downloadableFilesTotal -2) {
                    [_panel6 downloadCompleted];
                }

            } else {
                // error saving file.  Perhaps out of space?  Write permissions error?
                NSLog(@"Save anatomy picture failed: %@", error.localizedDescription);
            }

        } else {
            NSLog(@"downloadFetcher: Cannot create directory");
        }
    } else {
        NSLog(@"downloadFetcher failed: %@", error);
    }
}

//Create directory and exclude it from being backed-up in iCloud
-(NSString*)findOrCreateApplicationSupportSubPath:(NSString*)subPath
{

    NSString *resolvedPath;
    NSArray *appSupportDir = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);

    if ([appSupportDir count] != 0) {

        resolvedPath = [appSupportDir objectAtIndex:0];

        // Append the name of this application
        NSString *executableName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleExecutable"];
        resolvedPath = [resolvedPath stringByAppendingPathComponent:executableName];
        resolvedPath = [resolvedPath stringByAppendingPathComponent:subPath];

        NSFileManager *manager = [NSFileManager defaultManager];
        if (![manager fileExistsAtPath:resolvedPath]) {

            // Path doesn't exist, creates it
            NSError *error;
            BOOL successful = [manager createDirectoryAtPath:resolvedPath withIntermediateDirectories:YES attributes:nil error:&error];

            if(!successful) {
                NSLog(@"ERROR creating APP Support Sub-Directory: %@", error.localizedDescription);
                return nil;
            } else {

                // Exclude path from backing-up in iCloud
                NSURL *url = [NSURL fileURLWithPath:resolvedPath];
                BOOL excludeBackupResult = [self addSkipBackupAttributeToItemAtURL:url];

                if(!excludeBackupResult){
                    NSLog(@"Error excluding DIRECTORY from iCloud backup. This is a violation to their guideline.");
                    return  nil;
                }
            }
        }

    } else {
        NSLog(@"No Application Support Path available");
        return  nil;
    }

    return resolvedPath;
}


推荐答案

我认为诀窍是添加NSURLIsExcludedFromBackupKey或确保该目录位于文档目录之外。我通过将文档移动到Library / Application Support文件夹(因为它在/ tmp或/ Caches文件夹中没有意义)来完成此操作:

I think the trick is to add the NSURLIsExcludedFromBackupKey OR make sure the directory is outside the documents directory. I did this by moving my documents to the Library/Application Support folder (since it didn't make sense in the /tmp or /Caches folders):

- (void)createNewRefFolder
{
    NSError *error;

    // 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);
    }

    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: %@ ...", error);
    }

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

这篇关于从iCloud备份中排除:NSURLIsExcludedFromBackupKey的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆