Открытие приложения «Настройки» из другого приложения - PullRequest
155 голосов
/ 14 апреля 2011

Хорошо, я знаю, что есть много вопросов по этому поводу, но все они давно.

Итак. Я знаю, что это возможно, потому что приложение Map делает это.

В приложении «Карта», если я отключаю локализацию для этого приложения, оно отправляет мне сообщение, и если я нажимаю «ОК», откроется «Приложение настроек». И мой вопрос: как это возможно? Как открыть «Настройка приложения» из моего собственного приложения?

По сути, мне нужно сделать то же самое, если пользователь отключит расположение моего приложения, я покажу ему сообщение с сообщением о том, что откроет «Настройка приложения»

Ответы [ 15 ]

249 голосов
/ 14 апреля 2011

Как уже упоминалось Каран Дуа , теперь это возможно в iOS8 с использованием UIApplicationOpenSettingsURLString см. Документация Apple .

Пример:

Swift 4,2

UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)

In Swift 3:

UIApplication.shared.open(URL(string:UIApplicationOpenSettingsURLString)!)

InSwift 2:

UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

В Objective-C

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

До iOS 8:

Ты не можешь.Как вы сказали, это уже освещалось много раз, и всплывающее окно с просьбой включить службы определения местоположения предоставляется Apple, а не самим приложением.Вот почему он может открыть приложение настроек.

Вот несколько связанных вопросов и статей:

можно ли открыть приложение настроек с помощью openURL?

Программно открытое приложение настроек (iPhone)

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

iPhone: открытие панели настроек приложения из приложения

Откройте UIPickerView, нажав на запись в настройках приложения - Как?

Открыть приложение "Настройки"?

iOS: вы неправильно настраиваете

128 голосов
/ 25 июля 2014

От @ Yatheeshaless * ответ :

Приложение настроек можно открывать программно в iOS8, но не в более ранних версиях iOS.

Swift:

   UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

Swift 4:

if let url = NSURL(string: UIApplicationOpenSettingsURLString) as URL? {
    UIApplication.shared.openURL(url)
}

Swift 4.2 (BETA):

if let url = NSURL(string: UIApplication.openSettingsURLString) as URL? {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

Объектив-C:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
56 голосов
/ 14 марта 2016

ДА !! вы можете запустить экран настроек устройства, у меня протестировано на iOS 9.2

Шаг 1. нам нужно добавитьСхемы URL

Перейдите в Настройки проекта -> Информация -> Типы URL -> Добавить новые схемы URL

enter image description here

Шаг 2. Запуск настроек программно Благодаря @ davidcann

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];

Также мы можем запускать подэкраны, такие как Музыка, Местоположение и т. Д., А также просто используя правильное имя

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"]];

См. Полный список имен здесь , опубликованный Анри Нормаком


Обновление:

В соответствии с комментарием каждый хочет знать, что происходит после этого изменения в статусе подачи моей заявки?

Итак YES!! I got successful update submission and application is available on store without any complain.

Просто чтобы подтвердить, яПросто скачал сегодня утром и отключил службы определения местоположения, а затем запустил приложение, которое запрашивало у меня разрешение на определение местоположения, а затем появилось мое всплывающее окно с предупреждением, чтобы отправить мне настройки -> расположение сервераСтраница льдов -> Включено -> Вот и все !!

! [ВНИМАНИЕ: Ваше приложение может быть отклонено ... даже если оно одобрено, оно может быть отклонено в будущемверсия, если вы используете этот метод ...] 4

18 голосов
/ 15 октября 2011

Вы можете использовать это на iOS 5.0 и более поздних версиях: Это больше не работает.

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];
13 голосов
/ 25 мая 2016

Обновление iOS 10

Apple изменила метод открытия асинхронного в главном потоке.Однако теперь можно открывать настройки приложения только в собственных настройках.

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

Обновление iOS 9

Сейчасможно перейти непосредственно в меню дополнительных настроек.Тем не менее, схема URL должна быть создана.Это можно сделать двумя способами:

  1. XCode - вы найдете его в Target, Info, URL Scheme.Затем просто введите prefs.
  2. Непосредственное добавление в * -Info.plist.Добавьте следующее: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>prefs</string> </array> </dict> </array>

Затем код:

Swift

UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General&path=Keyboard")!)

Objective-c

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General&path=Keyboard"]];

4 голосов
/ 21 июня 2017

Swift 3:

guard let url = URL(string: UIApplicationOpenSettingsURLString) else {return}
if #available(iOS 10.0, *) {
  UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
  // Fallback on earlier versions
  UIApplication.shared.openURL(url)
}
4 голосов
/ 29 марта 2017

В Swift 3 / iOS 10+ теперь это выглядит как

if let url = URL(string: "App-Prefs:root=LOCATION_SERVICES") {
    UIApplication.shared.open(url, completionHandler: .none)
}
3 голосов
/ 13 апреля 2017

В Swift 3 все, что мне нужно, это (здесь, например, перенаправление на уведомления моего приложения):

if let url = URL(string: "App-Prefs:root=NOTIFICATIONS_ID&path=your app bundleID") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, completionHandler: .none)
    } else {
        // Fallback on earlier versions
    }
}

Источник: phynet gist .

Это сработалосо мной только когда настройки в фоновом режиме.Он перенаправит вас к настройкам уведомлений вашего приложения, но если настройки не выполнялись в фоновом режиме, он просто перенаправит вас к настройкам уведомлений в целом.

2 голосов
/ 17 января 2017

UIApplicationOpenSettingsURLString это будет работать, только если вы ранее разрешили любое разрешение.Например, Местоположение, Фото, Контакт, Доступ к push-уведомлениям.Поэтому, если у вас нет таких разрешений от пользователя:

Если iOS 10 или выше ,

Это откроет настройки, но затем вылетит.Причина в том, что в настройках вашего приложения ничего нет.

Ниже код откроет настройки вашего приложения в настройках iOS.

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

Из-за недоступности устройства я не смог проверить этоiOS <10. </p>

Кроме того, я мог найти ниже код из некоторого гист, и он прекрасно работает на iOS 10.Но я не уверен, одобрит ли это команда проверки Apple или нет.

https://gist.github.com/johnny77221/bcaa5384a242b64bfd0b8a715f48e69f

1 голос
/ 20 марта 2018

Swift 4

Я предпочитаю открывать настройки безопаснее,

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

    UIApplication.shared.open(settingUrl)
}
else {
    print("Setting URL invalid")
}
...