Открытие приложения "Настройки" из другого приложения

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

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

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

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

Ответ 1

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

Пример:

Swift 4.2

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

В Swift 3:

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

В Swift 2:

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

В Objective-C

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

До iOS 8:

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

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

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

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

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

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

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

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

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

Ответ 2

От @Yatheeshaless ответа:

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

Swift:

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

Свифт 4:

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

Swift 4.2 (бета):

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

Objective-C:

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

Ответ 3

ДА!! Вы можете запустить экран настроек устройства, я протестировал на 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!! я got successful update submission and application is available on store without any complain. YES!! я got successful update submission and application is available on store without any complain.

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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

Затем код:

Свифта

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

Objective-c

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

Ответ 6

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

if let url = URL(string: "App-Prefs:root=LOCATION_SERVICES") {
    UIApplication.shared.open(url, completionHandler: .none)
}

Ответ 7

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)
}

Ответ 8

В 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.

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

Ответ 9

UIApplicationOpenSettingsURLString Это будет работать только в том случае, если вы ранее разрешали разрешение. Например, "Расположение", "Фото", "Контакт", "Push". Поэтому, если у вас нет такого разрешения (-ов) от пользователя:

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

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

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

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

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

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

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

Ответ 10

Вы можете использовать для этого код ниже.

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

Ответ 11

SWIFT 4.0

'openURL' устарел в iOS 10.0: используйте openURL: параметры: завершение, а вместо:

UIApplication.shared.open(URL.init(string: UIApplicationOpenSettingsURLString)! , options: [:], completionHandler: nil)

Ответ 12

Swift 4

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

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

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

Ответ 13

Swift Вы можете использовать следующую функцию, чтобы открыть приложение "Настройки" с помощью страницы Bluetooth

func openSettingsApp(){
    if let settings = NSURL(string: "prefs:root=Bluetooth") {
        UIApplication.sharedApplication().openURL(settings)
    }
}

Снова это не откроет настройки приложения. Это откроет приложение настроек с Bluetooth, поскольку это глубокая привязка к Bluetooth.

Ответ 14

Протестировано с iOS 10. Работает

NSArray* urlStrings = @[@"prefs:root=WIFI", @"App-Prefs:root=WIFI"];
for(NSString* urlString in urlStrings){
NSURL* url = [NSURL URLWithString:urlString];
if([[UIApplication sharedApplication] canOpenURL:url]){
    [[UIApplication sharedApplication] openURL:url];
    break;
}
}

Счастливое кодирование:)

Ответ 15

Чтобы добавить к принятому ответу: (из документации Apple для разработчиков) "При открытии URL-адреса, созданного из этой строки (openSettingsURLString), система запускает приложение" Настройки "и отображает пользовательские настройки приложений, если они есть." Итак, если вы хотите открыть настройки для своего приложения, создайте свой собственный файл Settings.bundle.

Ответ 16

Добавьте это в свой класс,

 public class func showSettingsAlert(title:String,message:String,onVC viewController:UIViewController,onCancel:(()->())?){
            YourClass.show2ButtonsAlert(onVC: viewController, title: title, message: message, button1Title: "Settings", button2Title: "Cancel", onButton1Click: {
                if let settingsURL = NSURL(string: UIApplicationOpenSettingsURLString){
                    UIApplication.sharedApplication().openURL(settingsURL)
                }
                }, onButton2Click: {
                    onCancel?()
            })
        }

 public class func show2ButtonsAlert(onVC viewController:UIViewController,title:String,message:String,button1Title:String,button2Title:String,onButton1Click:(()->())?,onButton2Click:(()->())?){
            dispatch_async(dispatch_get_main_queue()) {
                let alert : UIAlertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)

                alert.addAction(UIAlertAction(title: button1Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton1Click?()
                }))

                alert.addAction(UIAlertAction(title: button2Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton2Click?()
                }))

                viewController.presentViewController(alert, animated: true, completion: nil)
            }
        }

Назовите это,

YourClass.showSettingsAlert("App would like to access camera", message: "App would like to access camera desc", onVC: fromViewController, onCancel: {
  print("canceled")
})