Проблема с предупреждением об открытии настроек в Xcode 6.3: сравнение адреса «UIApplicationOpenSettingsURLString», не равного нулевому указателю, всегда верно

Я не изобретаю велосипед. В iOS8, чтобы открыть настройки из приложения, я использую этот код:

BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);

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

Код находится во множестве ответов и вопросов в stackoverflow.

Проблема возникла с Xcode 6.3, у меня есть предупреждение:

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

Интересно, что Apple использует его в своем примере кода:
https://developer.apple.com/library/ios/samplecode/AppPrefs/Listings/RootViewController_m.html

Некоторая идея о том, как избежать предупреждения и по-прежнему проверять, могу ли я открыть настройки?


person Gabriel.Massana    schedule 10.04.2015    source источник
comment
Столкнулся с аналогичной проблемой после последнего обновления, пока не нашел решения. И пример кода, который вы упомянули, последний раз обновлялся 17 сентября 2014 года. Ну, я просмотрел ответы здесь, stackoverflow.com/q/459743/2713079. Но мне тоже ничего особо не помогло.   -  person itsji10dra    schedule 10.04.2015
comment
Я разместил свой вопрос здесь, stackoverflow.com/q/29560015/2713079, если вы хотите посмотреть :)   -  person itsji10dra    schedule 10.04.2015


Ответы (2)


РЕШЕНО:

Проблема связана с целью развертывания в приложении.

скриншот

Если цель равна 8,0 или выше, сравнение всегда будет верным, потому что вы всегда выше 8,0. Поэтому нам не нужна проверка if:

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

Другой вариант может быть:

NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:settings])
{
    [[UIApplication sharedApplication] openURL:settings];
}
person Gabriel.Massana    schedule 10.04.2015
comment
О да, вашу проблему можно решить таким образом, но моя немного сложнее. - person itsji10dra; 10.04.2015
comment
Что делает это новое предупреждение действительно раздражающим, так это то, что если вы совместно используете код между iOS и OS X, по мере увеличения количества символов, которые вы должны проверить, вероятность того, что вы будете вынуждены терпеть это предупреждение на одной платформе, чтобы избежать сбоя на другая платформа приближается к 1... Вероятно, есть способ убить ее с помощью прагмы или настройки компилятора, но я не знаю, какой настройки. - person dgatwood; 09.07.2015
comment
Мне сказали, что вы можете отключить предупреждение глобально, добавив -Wno-tautological-pointer-compare к флагам вашего компилятора, или разово, заключив &whatever в круглые скобки. - person dgatwood; 14.07.2015
comment
что делать в другом поведении? - person kiran; 20.10.2018

Я считаю, что это связано с тем, что &UIApplicationOpenSettingsURLString в этой версии никогда не равен нулю, поэтому вы можете просто напрямую использовать следующие настройки для запуска:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
person Schemetrical    schedule 10.04.2015