2012-05-17 43 views
4

与许多iOS开发者一样,我遇到了使用NSURLIsExcludedFromBackupKey之前应用程序在5.1之前系统崩溃的问题。NSURLIsExcludedFromBackupKey在iOS 5.1之前崩溃

它是很好的描述如何评价在此线程这个键值存在:

Use NSURLIsExcludedFromBackupKey without crashing on iOS 5.0

一个samvermette's评论说,存在的iOS模拟器中的错误。

不过我也遇到同样的问题,以发行的身材,即使在2级独立的应用程序。 经过一番调查后,我发现即使在调用main()方法之前应用程序也会崩溃。这暗示我,这与在应用程序启动

NSString * const NSURLIsExcludedFromBackupKey;

评价相连。

我不是这方面的专家,但我发现,如果在代码中出现任何对const值的引用(即使它在运行时没有实际访问),const在非常应用程序启动时会被评估。这只会导致我们很多人遇到的崩溃。

我想问你一些帮助。也许你知道如何'弱'引用一个const值,或者可能有特定的编译器标志。 (使用Apple LLVM 3.1)。

在此先感谢。

请不要评论,直接把这个const的值,这是@“NSURLIsExcludedFromBackupKey”在这种情况下。我意识到这个解决方法,这个故事的共同点是找到一个通用的解决方案。

+0

我觉得你的问题得到了解决[这里] [这里]:HTTP:/ /stackoverflow.com/questions/13498752/how-to-use-addskipbackupattributetoitematurl-api –

回答

1

您可以使用系统的代码< 5.0.1

#include <sys/xattr.h> 

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
{ 
    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; 
} 

更多here

编辑

如果你只问如何检查您可以比较其地址为NULL或零外部常数的可用性。这是做这件事的recommended way

if (&NSURLIsExcludedFromBackupKey) { 
    // The const is available 
} 
+1

请仔细阅读这里的问题。问题不在于iOS 5.1之前如何排除文件在iCloud上的备份。 – lukewar

+0

对,更新了我的答案。 – hwaxxer

+0

谢谢你的帮助,但这不是问题。正如我所描述的(并与其他故事相关)我知道这个问题已知的解决方案。我所描述的问题更多的是关于应用程序启动时的常量评估,这会导致应用程序在启动时崩溃。 (发布版本) – lukewar

1

我找到了一个解决方案,感谢https://stackoverflow.com/a/9620714/127493

NSString * const NSURLIsExcludedFromBackupKey; 

不是弱链接的,即使Base SDK设置为iOS 5.1,也不像SDK Compatibility Guide说的那样。

诀窍是使用此const的结果。
如果我做

NSLog(@"%@", NSURLIsExcludedFromBackupKey); 

结果是@"NSURLIsExcludedFromBackupKey"

所以我最终的代码

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

NSError * error = nil; 
BOOL success; 
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.1")) { 
    success = [storeURL setResourceValue:[NSNumber numberWithBool:YES] forKey:@"NSURLIsExcludedFromBackupKey" error:&error]; 
}