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

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

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

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

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

Я действительно ценю ваши ответы, я имею в виду это.

19 ответов

Решение

Как упомянул Каран Дуа, теперь это возможно в 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: вы делаете настройки неправильно

Из Yatheesha B L:

Вы можете открыть приложение настроек программно в 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]];

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

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

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

введите описание изображения здесь

Шаг 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.

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

Похоже, вы можете использовать prefs:<area>URL-адрес, чтобы открыть настройки и перейти в определенные области. Apple может изменить их и сломать ваше приложение, поэтому всегда проверяйте, можете ли вы их открыть.

В этой статье они перечислили некоторые из них для iOS 13.1:

URL-адреса настроек

iCloud

  • iCloud: prefs:root=CASTLE
  • Резервное копирование iCloud: prefs:root=CASTLE&path=BACKUP

Беспроводное радио

  • Вай фай: prefs:root=WIFI
  • Блютус: prefs:root=Bluetooth
  • Сотовый: prefs:root=MOBILE_DATA_SETTINGS_ID

Персональная точка доступа

  • Персональная точка доступа: prefs:root=INTERNET_TETHERING
  • Личная точка доступа ⇾ Семейный доступ: prefs:root=INTERNET_TETHERING&path=Family%20Sharing
  • Персональная точка доступа ⇾ Пароль Wi-Fi: prefs:root=INTERNET_TETHERING&path=Wi-Fi%20Password

VPN

  • VPN: prefs:root=General&path=VPN

Уведомления

  • Уведомления: prefs:root=NOTIFICATIONS_ID
  • Уведомления ⇾ Предложения Siri: prefs:root=NOTIFICATIONS_ID&path=Siri%20Suggestions

Звуки

  • Звуки: prefs:root=Sounds
  • Рингтон: prefs:root=Sounds&path=Ringtone

Не беспокоить

  • Не беспокоить: prefs:root=DO_NOT_DISTURB
  • Не беспокоить ⇾ Разрешить звонки от: prefs:root=DO_NOT_DISTURB&path=Allow%20Calls%20From

Экранное время

  • Экранное время: prefs:root=SCREEN_TIME
  • Время экрана ⇾ Время простоя: prefs:root=SCREEN_TIME&path=DOWNTIME
  • Время экрана ⇾ Ограничения приложения: prefs:root=SCREEN_TIME&path=APP_LIMITS
  • Экранное время ⇾ Разрешено всегда: prefs:root=SCREEN_TIME&path=ALWAYS_ALLOWED

Генеральная

  • Генеральная: prefs:root=General
  • Общие ⇾ О нас: prefs:root=General&path=About
  • Общие ⇾ Обновление программного обеспечения: prefs:root=General&path=SOFTWARE_UPDATE_LINK
  • Общие ⇾ CarPlay: prefs:root=General&path=CARPLAY
  • Общие ⇾ Обновление фонового приложения: prefs:root=General&path=AUTO_CONTENT_DOWNLOAD
  • Общие ⇾ Многозадачность (только для iPad): prefs:root=General&path=MULTITASKING
  • Общие ⇾ Дата и время: prefs:root=General&path=DATE_AND_TIME
  • Общие ⇾ Клавиатура: prefs:root=General&path=Keyboard
  • Общие ⇾ Клавиатура ⇾ Клавиатуры: prefs:root=General&path=Keyboard/KEYBOARDS
  • Общие ⇾ Клавиатура ⇾ Аппаратная клавиатура: prefs:root=General&path=Keyboard/Hardware%20Keyboard
  • Общие ⇾ Клавиатура ⇾ Замена текста: prefs:root=General&path=Keyboard/USER_DICTIONARY
  • Общие ⇾ Клавиатура ⇾ Одноручная клавиатура: prefs:root=General&path=Keyboard/ReachableKeyboard
  • Общие ⇾ Язык и регион: prefs:root=General&path=INTERNATIONAL
  • Общий ⇾ Словарь: prefs:root=General&path=DICTIONARY
  • Общие ⇾ Профили: prefs:root=General&path=ManagedConfigurationList
  • Общие ⇾ Сброс: prefs:root=General&path=Reset

Центр управления

  • Центр управления: prefs:root=ControlCenter
  • Центр управления ⇾ Настройка элементов управления: prefs:root=ControlCenter&path=CUSTOMIZE_CONTROLS

Дисплей

  • Дисплей: prefs:root=DISPLAY
  • Дисплей ⇾ Автоблокировка: prefs:root=DISPLAY&path=AUTOLOCK
  • Дисплей ⇾ Размер текста: prefs:root=DISPLAY&path=TEXT_SIZE

Доступность

  • Доступность: prefs:root=ACCESSIBILITY

Обои на стену

  • Обои на стену: prefs:root=Wallpaper

Siri

  • Siri: prefs:root=SIRI

Яблочный карандаш

  • Apple Pencil (только для iPad): prefs:root=Pencil

Face ID

  • Face ID: prefs:root=PASSCODE

Экстренный SOS

  • Экстренный SOS: prefs:root=EMERGENCY_SOS

Аккумулятор

  • Аккумулятор: prefs:root=BATTERY_USAGE
  • Аккумулятор ⇾ Состояние аккумулятора (только для iPhone): prefs:root=BATTERY_USAGE&path=BATTERY_HEALTH

Конфиденциальность

  • Конфиденциальность: prefs:root=Privacy
  • Конфиденциальность ⇾ Службы геолокации: prefs:root=Privacy&path=LOCATION
  • Конфиденциальность ⇾ Контакты: prefs:root=Privacy&path=CONTACTS
  • Конфиденциальность ⇾ Календари: prefs:root=Privacy&path=CALENDARS
  • Конфиденциальность ⇾ Напоминания: prefs:root=Privacy&path=REMINDERS
  • Конфиденциальность ⇾ Фото: prefs:root=Privacy&path=PHOTOS
  • Конфиденциальность ⇾ Микрофон: prefs:root=Privacy&path=MICROPHONE
  • Конфиденциальность ⇾ Распознавание речи: prefs:root=Privacy&path=SPEECH_RECOGNITION
  • Конфиденциальность ⇾ Камера: prefs:root=Privacy&path=CAMERA
  • Конфиденциальность ⇾ Движение: prefs:root=Privacy&path=MOTION\

Магазин приложений

  • Магазин приложений: prefs:root=STORE
  • Магазин приложений ⇾ Загрузки приложений: prefs:root=STORE&path=App%20Downloads
  • Магазин приложений ⇾ Автозапуск видео: prefs:root=STORE&path=Video%20Autoplay

Кошелек

  • Кошелек: prefs:root=PASSBOOK

Пароли и учетные записи

  • Пароли и учетные записи: prefs:root=ACCOUNTS_AND_PASSWORDS
  • Пароли и учетные записи ⇾ Получить новые данные: prefs:root=ACCOUNTS_AND_PASSWORDS&path=FETCH_NEW_DATA
  • Пароли и учетные записи ⇾ Добавить учетную запись: prefs:root=ACCOUNTS_AND_PASSWORDS&path=ADD_ACCOUNT

Почта

  • Почта: prefs:root=MAIL
  • Почта ⇾ Предварительный просмотр: prefs:root=MAIL&path=Preview
  • Почта ⇾ Параметры смахивания: prefs:root=MAIL&path=Swipe%20Options
  • Почта ⇾ Уведомления: prefs:root=MAIL&path=NOTIFICATIONS
  • Почта ⇾ Заблокировано: prefs:root=MAIL&path=Blocked
  • Почта ⇾ Действие с отключенной цепочкой: prefs:root=MAIL&path=Muted%20Thread%20Action
  • Почта ⇾ Параметры заблокированного отправителя: prefs:root=MAIL&path=Blocked%20Sender%20Options
  • Почта ⇾ Отметить Адреса: prefs:root=MAIL&path=Mark%20Addresses
  • Почта ⇾ Повышение уровня котировки: prefs:root=MAIL&path=Increase%20Quote%20Level
  • Почта ⇾ Включите вложения с ответами: prefs:root=MAIL&path=Include%20Attachments%20with%20Replies
  • Почта ⇾ Подпись: prefs:root=MAIL&path=Signature
  • Почта ⇾ Учетная запись по умолчанию: prefs:root=MAIL&path=Default%20Account

Контакты

  • Контакты: prefs:root=CONTACTS

Календарь

  • Календарь: prefs:root=CALENDAR
  • Календарь ⇾ Альтернативные календари: prefs:root=CALENDAR&path=Alternate%20Calendars
  • Календарь ⇾ Синхронизация: prefs:root=CALENDAR&path=Sync
  • Календарь ⇾ Время оповещения по умолчанию: prefs:root=CALENDAR&path=Default%20Alert%20Times
  • Календарь ⇾ Календарь по умолчанию: prefs:root=CALENDAR&path=Default%20Calendar

Примечания

  • Примечания: prefs:root=NOTES
  • Примечания ⇾ Учетная запись по умолчанию: prefs:root=NOTES&path=Default%20Account
  • Примечания ⇾ Пароль: prefs:root=NOTES&path=Password
  • Заметки ⇾ Сортировать заметки по: prefs:root=NOTES&path=Sort%20Notes%20By
  • Заметки ⇾ Новые заметки начинаются с: prefs:root=NOTES&path=New%20Notes%20Start%20With
  • Примечания ⇾ Сортировка отмеченных элементов: prefs:root=NOTES&path=Sort%20Checked%20Items
  • Примечания ⇾ Линии и сетки: prefs:root=NOTES&path=Lines%20%26%20Grids
  • Заметки ⇾ Доступ к заметкам с экрана блокировки: prefs:root=NOTES&path=Access%20Notes%20from%20Lock%20Screen

Напоминания

  • Напоминания: prefs:root=REMINDERS
  • Напоминания ⇾ Список по умолчанию: prefs:root=REMINDERS&path=DEFAULT_LIST

Голосовые заметки

  • Голосовые заметки: prefs:root=VOICE_MEMOS

Телефон

  • Телефон: prefs:root=Phone

Сообщения

  • Сообщения: prefs:root=MESSAGES

FaceTime

  • FaceTime: prefs:root=FACETIME

Карты

  • Карты: prefs:root=MAPS
  • Карты ⇾ Вождение и навигация: prefs:root=MAPS&path=Driving%20%26%20Navigation
  • Карты ⇾ Транспорт: prefs:root=MAPS&path=Transit

Компас

  • Компас: prefs:root=COMPASS

Измерение

  • Мера: prefs:root=MEASURE

Сафари

  • Сафари: prefs:root=SAFARI
  • Safari ⇾ Блокировщики контента: prefs:root=SAFARI&path=Content%20Blockers
  • Safari ⇾ Загрузки: prefs:root=SAFARI&path=DOWNLOADS
  • Safari ⇾ Закрыть вкладки: prefs:root=SAFARI&path=Close%20Tabs
  • Safari ⇾ Очистить историю и данные: prefs:root=SAFARI&path=CLEAR_HISTORY_AND_DATA
  • Safari ⇾ Масштаб страницы: prefs:root=SAFARI&path=Page%20Zoom
  • Safari ⇾ Запросить веб-сайт рабочего стола: prefs:root=SAFARI&path=Request%20Desktop%20Website
  • Safari ⇾ Читатель: prefs:root=SAFARI&path=Reader
  • Safari ⇾ Камера: prefs:root=SAFARI&path=Camera
  • Safari ⇾ Микрофон: prefs:root=SAFARI&path=Microphone
  • Safari ⇾ Расположение: prefs:root=SAFARI&path=Location
  • Safari ⇾ Дополнительно: prefs:root=SAFARI&path=ADVANCED

Новости

  • Новости: prefs:root=NEWS

Здоровье

  • Здоровье: prefs:root=HEALTH

Ярлыки

  • Горячие клавиши: prefs:root=SHORTCUTS

Музыка

  • Музыка: prefs:root=MUSIC
  • Музыка ⇾ Сотовые данные: prefs:root=MUSIC&path=com.apple.Music:CellularData
  • Музыка ⇾ Оптимизировать хранилище: prefs:root=MUSIC&path=com.apple.Music:OptimizeStorage
  • Музыка ⇾ EQ: prefs:root=MUSIC&path=com.apple.Music:EQ
  • Музыка ⇾ Ограничение громкости: prefs:root=MUSIC&path=com.apple.Music:VolumeLimit

Телевизор

  • Настройки ⇾ ТВ: prefs:root=TVAPP

Фотографии

  • Фотографии: prefs:root=Photos

Камера

  • Камера: prefs:root=CAMERA
  • Камера ⇾ Запись видео: prefs:root=CAMERA&path=Record%20Video
  • Камера ⇾ Замедленная запись: prefs:root=CAMERA&path=Record%20Slo-mo

Книги

  • Книги: prefs:root=IBOOKS

Игровой центр

  • Игровой центр: prefs:root=GAMECENTER

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

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

обновление 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>

Тогда код:

стриж

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

Objective-C

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

В Swift 3 / iOS 10+ это выглядит сейчас

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

Свифт 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)
}

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

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

В качестве openURL(_:)устарела после iOS 10.0, используйте open(_:options:completionHandler:)вместо.

      if let settingsUrl = URL(string: UIApplication.openSettingsURLString)  {
        UIApplication.shared.open(settingsUrl, options: [:]) { completed in
             if !completed {
                 print("Failed opening")
             }
        }
}

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

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

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

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

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

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

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

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

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

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

Swift 4

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

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

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

В iOS 16 вы можете использовать openSettingsURLString .

      if let url = URL(string: UIApplication. openSettingsURLString) {
    await UIApplication.shared.open(url)
}

Протестировано с 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;
}
}

Удачного кодирования:)

SWIFT 4.0

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

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

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

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

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

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

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

 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")
})
Другие вопросы по тегам