2012-05-17 44 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]; 
}