NSURLIsExcludedFromBackupKey se bloque avant iOS 5.1

Comme la plupart des développeurs iOS, j'ai rencontré le problème avec l'écrasement de l'application sur le système avant 5.1 lors de l'utilisation de NSURLIsExcludedFromBackupKey .

Il a été bien décrit comment évaluer l'existence de cette key sur ce fil:

Utilisez NSURLIsExcludedFromBackupKey sans planter sur iOS 5.0

Un des commentaires de samvermette dit qu'il y a un bug dans le simulateur iOS.

Néanless, j'ai rencontré le même problème avec une version Release , même dans 2 applications distinctes. Après quelques searchs, j'ai découvert que l'application plantait même avant que la méthode main () ne soit appelée. Ce qui m'a fait penser que cela est lié à

NSSsortingng * const NSURLIsExcludedFromBackupKey;

évaluation au lancement de l'application.

Je ne suis pas un expert dans ce domaine, mais j'ai découvert que, si n'importe quelle reference à la valeur de const se produit dans le code (même si elle n'est pas réellement accédée en exécution) ce const est évalué au lancement très d'application. Et cela provoque simplement ce crash que beaucoup d'entre nous connaissent.

Je voudrais vous requestr de l'aide. Peut-être connaissez-vous un moyen de faire reference «faiblement» à une valeur const, ou peut-être qu'il existe un indicateur de compilateur spécifique. (En utilisant Apple LLVM 3.1).

Merci d'avance.

S'il vous plaît ne faites pas de commentaires pour mettre directement la valeur de ce const qui est @ "NSURLIsExcludedFromBackupKey" dans ce cas. Je suis conscient de cette solution, reson pour cette histoire est de find une solution générale.

Vous pouvez utiliser ce code sur les systèmes <5.0.1

 #include <sys/xattr.h> - (BOOL)addSkipBackupAtsortingbuteToItemAtURL:(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; } 

Lire la suite ici .

modifier

Si vous requestz seulement comment vérifier la disponibilité d'une constante externe, vous pouvez comparer son adresse à NULL ou nulle. C'est la manière recommandée de le faire.

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

J'ai trouvé une solution, grâce à https://stackoverflow.com/a/9620714/127493 !

 NSSsortingng * const NSURLIsExcludedFromBackupKey; 

n'est PAS faiblement lié, même si Base SDK est défini sur iOS 5.1, contrairement au Guide de compatibilité du SDK .

L'astuce consiste à utiliser le résultat de cette const.
Si je fais

 NSLog(@"%@", NSURLIsExcludedFromBackupKey); 

le résultat est @"NSURLIsExcludedFromBackupKey"

Donc, mon code résultant est

 #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]; }