2015-04-10 2 views
7

Ich erfinde das Rad nicht. In iOS8, zu öffnen Einstellungen aus dem Innern des App verwende ich diesen Code:Open Settings Warnung Problem in Xcode 6.3: Vergleich der Adresse von 'UIApplicationOpenSettingsURLString' ungleich einem Nullzeiger ist immer wahr

BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL); 

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

Der Code ist in vielen Antworten und Fragen in Stackoverflow.

Das Problem mit Xcode 6.3 herauskam, habe ich eine Warnung bekommt sagen:

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

Was interessant ist, ist, dass Apple es in ihrem Beispielcode verwendet:
https://developer.apple.com/library/ios/samplecode/AppPrefs/Listings/RootViewController_m.html

Eine Idee, wie man die Warnung vermeidet und trotzdem prüft, ob ich Einstellungen öffnen kann?

+0

Angesichts ähnlicher Problem nach dem letzten Update, habe noch keine Lösung gefunden. Und der von Ihnen erwähnte Beispielcode wurde zuletzt am 2014-09-17 aktualisiert. Nun, ich hatte die Antworten hier durchgegangen, http://stackoverflow.com/q/459743/2713079. Aber nichts half mir auch wirklich. – itsji10dra

+0

Ich habe meine Frage hier, http://Stackoverflow.com/q/29560015/2713079, wenn Sie einen Blick haben wollen :) – itsji10dra

Antwort

13

GELöST:

Das Problem wird mit dem Implementierungsziel in der App zusammen.

screenshot

Wenn das Ziel ist 8,0 oder höher, wird der Vergleich immer wahr, weil Sie immer über 8,0 sind. So brauchen wir nicht die, wenn die Überprüfung:

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

kann eine weitere Option:

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

Oh ja, Ihr Problem kann auf diese Weise gelöst werden, aber meine ist lil komplexer. – itsji10dra

+0

Was diese neue Warnung wirklich ärgerlich macht, ist, dass wenn Sie Code zwischen iOS und OS X teilen, die Wahrscheinlichkeit, dass Sie diese Warnung auf einer Plattform tolerieren müssen, um einen Absturz zu vermeiden, da die Anzahl der zu überprüfenden Symbole zunimmt auf der anderen Plattform nähert sich 1 .... Es gibt wahrscheinlich eine Möglichkeit, es mit einem Pragma oder einer Compiler-Einstellung zu töten, aber ich weiß nicht, welche Einstellung. – dgatwood

+0

Mir wurde gesagt, dass Sie die Warnung global deaktivieren können, indem Sie -Wno-tautological-pointer-compare zu Ihren Compilerflags hinzufügen, oder auf einer einmaligen Basis, indem Sie das "& whatever" in Klammern umschließen. – dgatwood

1

Ich glaube, das liegt daran, dass & UIApplicationOpenSettingsURLString nie in dieser Version nil so können Sie einfach direkt die Verwendung folgendes Starteinstellungen:

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

oh Gott ich wusste nicht, dass das schon gelöst wurde .-. – Schemetrical

Verwandte Themen