2016年農(nóng)歷新年年前,我提交了新版本等待蘋果審核,等待年后上班時新版本上線,但被拒了! 被拒有三個原因,其中前兩個原因很好解決,但最后一個違反了蘋果2.23審核規(guī)則.
被拒原因
先看看被拒的反饋信息:
Apps must follow the iOS Data Storage Guidelines or they will be rejected
On launch and content download, your app stores 27.34MB, which does not comply with the iOS Data Storage Guidelines.
我查閱了相關(guān)資料:一次審核被拒的經(jīng)歷-關(guān)于iCloud到底應(yīng)該備份什么數(shù)據(jù)
了解到幾條重要信息:
只有用戶創(chuàng)建的历造,并且不能被App重現(xiàn)的文檔、數(shù)據(jù)遣疯,才應(yīng)該被保存在“/Documents”路徑下侮腹。
可以重新產(chǎn)生彼念、下載的數(shù)據(jù)可以放在“/Library/Caches”目錄下,如用于緩存的數(shù)據(jù)庫文件。
純粹用于緩存的數(shù)據(jù)可以放在“/tmp”目錄下夺脾。
可以通過對NSURL加參數(shù)芙代,來保證特定的文件夾及其內(nèi)容不被iCloud備份吊奢,也不會被清除,如Document文件夾纹烹。
我打印了所有在Documents目錄下的內(nèi)容:
+ (void)showAllFilesUnderDocumentsDirectory {
NSError*error =nil;
NSString*stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSArray*filePathsArray = [[NSFileManagerdefaultManager]subpathsOfDirectoryAtPath: stringPatherror:&error];
NSLog(@"-------Print File Start-------");
for(inti=0;i<[filePathsArraycount];i++)
{
NSString*strFilePath = [filePathsArrayobjectAtIndex:i];
NSLog(@"[%@]--[%@]",[NSNumbernumberWithInt:i],strFilePath);
NSURL*pathURL = [NSURLfileURLWithPath:[[stringPathstringByAppendingString:@"/"]stringByAppendingString:strFilePath]];
NSError*error =nil;
NSLog(@"[Value For NSURLIsExcludedFromBackupKey]--[%@]",[pathURLresourceValuesForKeys:@[NSURLIsExcludedFromBackupKey]error:&error]);
NSLog(@"error:%@",error);
NSDictionary*fileDictionary = [[NSFileManagerdefaultManager]attributesOfItemAtPath:[[stringPathstringByAppendingString:@"/"]stringByAppendingString:strFilePath]error:&error];
longlongfileSize = [fileDictionaryfileSize];
NSLog(@"FileSize:%@",@(fileSize));
NSLog(@"error:%@",error);
}
NSLog(@"-------Print File End---------");
}
然后采用了Apple官方示例的解決代碼:
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error=nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKeyerror: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent],error);
}
returnsuccess;
}
自以為解決了問題,沒想到一周之后再次被拒! 被拒的原因還是2.23iCloud備份的問題.
于是在找原因,我檢查了Xcode中 iCloud功能開關(guān)是關(guān)閉的,檢查了開發(fā)者中心iCloud功能也是關(guān)閉的.并且在騰訊Bugly交流群里探討了該問題,
再次參考了StackOverFlow iphone - Where should I save data & files I want to keep long term 并且確認(rèn)Documents下全部設(shè)置為YES,不備份到iCloud,再一次信心滿滿的提交.
得到的結(jié)果是再一次被蘋果拒絕,本人心中一萬只草泥馬奔騰而過,已經(jīng)不知道如何解決,于是跟蘋果抗議(si)(bi),蘋果回復(fù)說讓我等等,最后給出建議是我可能存放到Documents的子目錄下了?
但是這不是問題的真正原因,因為設(shè)置是遞歸的页滚,所以其所有子目錄和文件都不用再設(shè)置一次,都會自動不被備份铺呵。(測試有效裹驰,但是不確定=。=片挂,參考:is-nsurlisexcludedfrombackupkey-recursive)
那么真正的原因是什么呢? 經(jīng)過多種測試,以及猜測問題就是自定義字體導(dǎo)致的!
//初始化需要添加字體的PostScript
NSArray*fontPostScriptNames = [NSArrayarrayWithObjects:@"F1--B51-0",@"F2--GBK1-0",@"F3--B51-0",@"F4--GBK1-0",nil];
NSMutableArray*fontsNeedToRegister = [NSMutableArrayarrayWithCapacity:6];
NSMutableArray*fontsFileURL = [NSMutableArrayarrayWithCapacity:6];
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSURL*documentsURL = [[[NSFileManagerdefaultManager]URLsForDirectory:NSLibraryDirectoryinDomains:NSUserDomainMask]firstObject];
以上代碼是字體相關(guān)代碼,存到了NSLibraryDirectory.
LibraryDirectory也需要NSURLIsExcludedFromBackupKey.
我打印了Library下的目錄,輸出的Log,NSURLIsExcludedFromBackupKey都為0,不是1,正驗證了由于字體存入NSLibraryDirectory而導(dǎo)致的備份到iCloud的問題
+ (void)showAllFilesUnderLibraryDirectory {
NSError*error =nil;
NSString*stringPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSArray*filePathsArray = [[NSFileManagerdefaultManager]contentsOfDirectoryAtPath: stringPatherror:&error];
NSLog(@"-------Print File Start-------");
for(inti=0;i<[filePathsArraycount];i++)
{
NSString*strFilePath = [filePathsArrayobjectAtIndex:i];
NSLog(@"[%@]--[%@]",[NSNumbernumberWithInt:i],strFilePath);
NSURL*pathURL = [NSURLfileURLWithPath:[[stringPathstringByAppendingString:@"/"]stringByAppendingString:strFilePath]];
NSError*error =nil;
NSLog(@"[Value For NSURLIsExcludedFromBackupKey]--[%@]",[pathURLresourceValuesForKeys:@[NSURLIsExcludedFromBackupKey]error:&error]);
NSLog(@"error:%@",error);
NSDictionary*fileDictionary = [[NSFileManagerdefaultManager]attributesOfItemAtPath:[[stringPathstringByAppendingString:@"/"]stringByAppendingString:strFilePath]error:&error];
longlongfileSize = [fileDictionaryfileSize];
NSLog(@"FileSize:%@",@(fileSize));
NSLog(@"error:%@",error);
}
NSLog(@"-------Print File End---------");
}
總結(jié):
1.如果遇到Apple2.23因為備份至iCloud而被拒,要檢查Documents,Library目錄,是否設(shè)置了NSURLIsExcludedFromBackupKey為YES.
2.多看蘋果官方文檔.
后續(xù):已經(jīng)通過審核,親測有效,三次被拒換來的慘痛經(jīng)驗 ~~~~(>_<)~~~~