我的应用程序第二次被拒绝,我失去了3周:(
第一次提交,我排除了只有DIRECTORIES在iCloud中备份。苹果拒绝了......
第二次提交,我排除了DIRECTORIES&从iCloud备份下载的PICTURES。苹果公司再次拒绝了......苹果公司还抱怨我没有“恢复”#34;我的应用内购买的功能,而事实上,我确实有一个"恢复"按钮,它在我测试时起作用了。
我已经完成了Apple的建议,将文件排除在使用NSURLIsExcludedFromBackupKey进行备份。 Macmade在stackoverflow here上发表了一篇有趣的评论:
有时Apple审核人员认为您的数据可以在何时重新生成 不是。然后,您必须解释为什么必须备份数据
审稿人多久误解一次,我们必须向他们解释内容是否需要离线和&不能重新生成?
以下是我用来排除文件和代码的代码。来自iCloud的目录。你发现任何问题吗?
- (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;
}
答案 0 :(得分:8)
我认为诀窍是添加NSURLIsExcludedFromBackupKey或确保目录在文档目录之外。我通过将文档移动到Library / Application Support文件夹(因为它在/ tmp或/ Caches文件夹中没有意义)来完成此操作:
- (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);
}
}
答案 1 :(得分:0)
以前的答案很少更新。
您必须检查文件是否存在。否则,您将收到此错误,
Error excluding [FileName] from backup:
Error Domain=NSCocoaErrorDomain Code=4 "The file “[FileName]” doesn’t exist."
...
我不确定是否应检查值是否已更新。 例如如果API重置已经设置了值。如果它试图再次更新文件系统以获得更耗时的设置值,我猜。
更新方法......
+ (BOOL)addSkipBackupAttributeToURLAtPath:(NSURL *)url
{
if (!url) return NO;
if (![[NSFileManager defaultManager] fileExistsAtPath:url.path]) return NO;
NSError *error = nil;
NSNumber *value = nil;
BOOL success = [url getResourceValue:&value forKey:NSURLIsExcludedFromBackupKey error:&error];
if (value.boolValue == YES) return YES;
success = [url setResourceValue:[NSNumber numberWithBool:YES]
forKey:NSURLIsExcludedFromBackupKey error:&error];
if(!success){
NSLog(@"Error excluding %@ from backup: %@", [url lastPathComponent], error);
}
return success;
}
+ (BOOL)addSkipBackupAttributeToFileAtPath:(NSString *)path
{
if (!path) return NO;
return [self addSkipBackupAttributeToURLAtPath:[NSURL fileURLWithPath:path]];
}