L'app iCloud per iPhone si arresta in modo anomalo durante la compilazione su iOS 4
-
27-10-2019 - |
Domanda
Vorrei utilizzare un iCloud, ma quando compilo l'app sul simulatore iOS 4.3 si blocca.
dyld: Simbolo non trovato: _OBJC_CLASS _ $ _ NSMetadataQuery
Cosa devo fare per farlo funzionare su iOS 3, 4 e 5?
Soluzione
Queste API sono state lanciate con ios5, quindi non puoi eseguirle sul simulatore 4 o inferiore, ma per la pubblicazione puoi impostare l'obiettivo di distribuzione minimo della famiglia ios che dovrebbe supportare.
Altri suggerimenti
la mia impressione è:
Dove NSMetadataQuery cambia in id: ex
normale: - (void) loadData: (NSMetadataQuery *) query; cambia in: - (void) loadData: (id) query;
normale: query NSMetadataQuery * @property (ritenzione, non atomica); cambia in: @property (keep, nonatomic) id query;
e controlla iCloud disponibile:
if ([[NSFileManager defaultManager] respondsToSelector:@selector(URLForUbiquityContainerIdentifier:)]) {
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
// Code for access iCloud here
}
}
Quando si utilizza NSMetadataQuery:
id _query = [[NSClassFromString(@"NSMetadataQuery") alloc] init];
// Some code here
[_query startQuery];
Buon divertimento (^_^)
Il modo usuale sarebbe compilarlo con iOS 5 SDK e impostare l'obiettivo di distribuzione sulla versione iOS più vecchia con cui desideri che funzioni.Sta a te però controllare in fase di esecuzione su quali classi e metodi sono disponibili per il sistema corrente.Un utente su iOS 4, ad esempio, non sarà in grado di utilizzare le funzioni fornite solo con iOS 5.
Per verificare la disponibilità delle classi fare:
if ( NSClassFromString(@"NSMetadataQuery") != nil ) {
//do stuff with NSMetadataQuery here
}
Per verificare la disponibilità dei metodi fare:
if ( [myObject respondsToSelector:@selector(doSomething)] ) {
//call doSomething on myObject
}