2015-04-10 14 views
7

Non sto inventando la ruota. In iOS 8, per aprire le Impostazioni da dentro l'applicazione sto usando questo codice:Problema di avviso relativo alle impostazioni aperte in Xcode 6.3: il confronto dell'indirizzo di "UIApplicationOpenSettingsURLString" diverso da un puntatore nullo è sempre true

BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL); 

if (canOpenSettings) 
{ 
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
    [[UIApplication sharedApplication] openURL:url]; 
} 

Il codice è in un sacco di risposte e domande in StackOverflow.

Il problema è venuto fuori con Xcode 6.3, ho un avviso dicendo:

Comparison of address of 'UIApplicationOpenSettingsURLString' not equal to a null pointer is always true

Ciò che è interessante è che Apple sta usando nel loro codice di esempio:
https://developer.apple.com/library/ios/samplecode/AppPrefs/Listings/RootViewController_m.html

Qualche idea su come evitare l'avviso e ancora controllando se posso aprire le Impostazioni?

+0

Di fronte a un problema simile dopo l'ultimo aggiornamento, non è stata ancora trovata alcuna soluzione. E il codice di esempio che hai menzionato è stato aggiornato l'ultima volta il 2014-09-17. Bene, avevo passato attraverso le risposte qui, http://stackoverflow.com/q/459743/2713079. Ma nulla mi ha davvero aiutato. – itsji10dra

+0

Ho postato la mia domanda qui, http://stackoverflow.com/q/29560015/2713079 se vuoi dare un'occhiata :) – itsji10dra

risposta

13

risolto:

Il problema è in relazione con la destinazione di distribuzione in App.

screenshot

Se il bersaglio è 8.0 o superiore, il confronto sarà sempre vero, perché si è sempre sopra 8,0. Quindi non abbiamo bisogno del se la verifica:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
[[UIApplication sharedApplication] openURL:url]; 

Un'altra opzione può essere:

NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
if ([[UIApplication sharedApplication] canOpenURL:settings]) 
{ 
    [[UIApplication sharedApplication] openURL:settings]; 
} 
+1

Oh sì, il tuo problema può essere risolto in questo modo, ma il mio è lil più complesso. – itsji10dra

+0

Ciò che rende davvero fastidioso questo nuovo avviso è che se condividi il codice tra iOS e OS X, al crescere del numero di simboli da controllare, la probabilità che sarai costretto a tollerare questo avviso su una piattaforma per evitare un arresto anomalo sull'altra piattaforma si avvicina a 1 ... C'è probabilmente un modo per ucciderlo con un pragma o un'impostazione del compilatore, ma non so quale impostazione. – dgatwood

+0

Mi è stato detto che è possibile disabilitare l'avviso globalmente aggiungendo -Wno-tautological-pointer-compare ai propri flag del compilatore, o su una tantum avvolgendo "& qualunque" tra parentesi. – dgatwood

1

Credo che questo sia perché & UIApplicationOpenSettingsURLString non è mai nullo in questa versione in modo da poter semplicemente utilizzare direttamente il seguente alla impostazioni di avvio:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
[[UIApplication sharedApplication] openURL:url]; 
+2

oh dio non mi ero reso conto che questo era già risolto .-. – Schemetrical