Open Settings warning issue in Xcode 6.3: Comparison of address of 'UIApplicationOpenSettingsURLString' not equal to a null pointer is always true
Asked Answered
T

2

7

I'm not inventing the wheel. In iOS8, to open Settings from inside the app I'm using this code:

BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);

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

The code is in a lot of answers and questions in stackoverflow.

The problem came out with Xcode 6.3, I've got a warning saying:

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

What is interesting is that Apple is using it in their example code:
https://developer.apple.com/library/ios/samplecode/AppPrefs/Listings/RootViewController_m.html

Some idea about how to avoid the warning and still checking if I can open Settings?

Tiepolo answered 10/4, 2015 at 10:44 Comment(2)
Facing similar issue after last update, haven't yet found any solution to it. And example code you mentioned was last updated on 2014-09-17. Well, i had gone through answers over here, https://mcmap.net/q/49329/-is-null-always-false/2713079. But nothing really helped me too.Frontward
I have posted my question over here, https://mcmap.net/q/997661/-xcode-6-3-warning-comparison-of-address-of-39-myobject-39-not-equal-to-null-pointer-is-always-true/2713079 if you want to have a look :)Frontward
T
14

SOLVED:

The problem is related with the Deployment Target in the App.

screenshot

If the Target is 8.0 or above, the comparison will be always true because you are always over 8.0. So we do not need the if verification:

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

Another option can be:

NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:settings])
{
    [[UIApplication sharedApplication] openURL:settings];
}
Tiepolo answered 10/4, 2015 at 11:5 Comment(4)
Oh yes, your problem can be solved this way, but mine is lil more complex.Frontward
What makes this new warning really annoying is that if you share code between iOS and OS X, as the number of symbols you have to check increases, the probability that you'll be forced to tolerate this warning on one platform to avoid a crash on the other platform approaches 1.... There's probably a way to kill it with a pragma or a compiler setting, but I don't know what setting.Charters
I'm told that you can disable the warning globally by adding -Wno-tautological-pointer-compare to your compiler flags, or on a one-off basis by wrapping the "&whatever" in parentheses.Charters
what to do in else behaviour?Maladapted
P
1

I believe this is because &UIApplicationOpenSettingsURLString is never nil in this version so you can just directly use the following to launch settings:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
Penis answered 10/4, 2015 at 11:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.