Как открыть настройки телефона при нажатии кнопки?
Я пытаюсь реализовать функцию в приложении, которая показывает предупреждение, когда интернет-соединение недоступно. Предупреждение имеет два действия ("ОК" и "Настройки"), когда пользователь нажимает на настройки, я хочу программно их отнести к настройкам телефона.
Я использую Swift и Xcode.
Ответы
Ответ 1
Использование UIApplication.openSettingsURLString
Обновление для Swift 5.1
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
print("Settings opened: \(success)") // Prints true
})
}
}
alertController.addAction(settingsAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
Swift 4.2
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
print("Settings opened: \(success)") // Prints true
})
}
}
alertController.addAction(settingsAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
Ответ 2
Swift 5
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
Swift 4
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:], completionHandler: nil)
ПРИМЕЧАНИЕ: следующий метод работает для всех версий ниже iOS 11, для более высоких версий приложение может быть отклонено, так как это частный API
Иногда мы хотим привести пользователя к настройкам, отличным от настроек нашего приложения. Следующий метод поможет вам достичь этого:
Сначала настройте схемы URL в вашем проекте. Вы найдете это в Target → Info → URL Scheme. нажмите на кнопку + и введите prefs в URL Schemes
![enter image description here]()
Свифт 3
UIApplication.shared.open(URL(string:"App-Prefs:root=General")!, options: [:], completionHandler: nil)
стриж
UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General")!)
Objective-C
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General"]];
и далее все доступные URL
- префы: корень = Общие и путь = О
- префы: корень = Общие и путь = ДОСТУПНОСТИ
- префы: корень = AIRPLANE_MODE
- префы: корень = Общие и путь = AUTOLOCK
- префы: корень = Общие и путь = USAGE/CELLULAR_USAGE
- префы: корень = Яркость
- префы: корень = Bluetooth
- префы: корень = Общие и путь = DATE_AND_TIME
- префы: корень = FaceTime
- префы: корень = Общие
- префы: корень = General & путь = Keyboard
- префы: корень = ЗАМОК
- префы: корень = ЗАМОК & путь = STORAGE_AND_BACKUP
- префы: корень = General & путь = INTERNATIONAL
- Prefs: корень = LOCATION_SERVICES
- Prefs: корень = ACCOUNT_SETTINGS
- префы: корень = МУЗЫКА
- префы: корень = МУЗЫКА & путь = EQ
- префы: корень = МУЗЫКА & путь = VolumeLimit
- префы: корень = Общие и путь = Сеть
- префы: корень = NIKE_PLUS_IPOD
- Prefs: корневые = ПРИМЕЧАНИЯ
- префы: корень = NOTIFICATIONS_ID
- префы: корень = Телефон
- Prefs: корневые = Фотографии
- префы: корень = Общие и путь = ManagedConfigurationList
- префы: корень = Общие и путь = Сброс
- префы: корень = Звуки & путь = Мелодия
- префы: корень = Safari
- префы: корень = General & путь = помощник
- Prefs: корень = Звуки
- префы: корень = Общие и путь = SOFTWARE_UPDATE_LINK
- префы: корень = STORE
- префы: корень = TWITTER
- префы: корень = FACEBOOK
- prefs: root = General & path = USAGE prefs: root = VIDEO
- префы: корень = Общие и путь = Сеть /VPN
- префы: корень = обои
- префы: корень = WIFI
- префы: корень = INTERNET_TETHERING
- префы: корень = Телефон и путь = Blocked
- префы: корень = DO_NOT_DISTURB
Примечание: настройки сети не будут открыты в симуляторе, но ссылка будет работать на реальном устройстве.
Ответ 3
В iOS 8+ вы можете сделать следующее:
func buttonClicked(sender:UIButton)
{
UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))
}
Swift 4
let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
UIApplication.shared.open(settingsUrl)
Ответ 4
Используя подсказку @vivek, я разрабатываю класс utils на основе Swift 3, надеюсь, что вы оцените!
import Foundation
import UIKit
public enum PreferenceType: String {
case about = "General&path=About"
case accessibility = "General&path=ACCESSIBILITY"
case airplaneMode = "AIRPLANE_MODE"
case autolock = "General&path=AUTOLOCK"
case cellularUsage = "General&path=USAGE/CELLULAR_USAGE"
case brightness = "Brightness"
case bluetooth = "Bluetooth"
case dateAndTime = "General&path=DATE_AND_TIME"
case facetime = "FACETIME"
case general = "General"
case keyboard = "General&path=Keyboard"
case castle = "CASTLE"
case storageAndBackup = "CASTLE&path=STORAGE_AND_BACKUP"
case international = "General&path=INTERNATIONAL"
case locationServices = "LOCATION_SERVICES"
case accountSettings = "ACCOUNT_SETTINGS"
case music = "MUSIC"
case equalizer = "MUSIC&path=EQ"
case volumeLimit = "MUSIC&path=VolumeLimit"
case network = "General&path=Network"
case nikePlusIPod = "NIKE_PLUS_IPOD"
case notes = "NOTES"
case notificationsId = "NOTIFICATIONS_ID"
case phone = "Phone"
case photos = "Photos"
case managedConfigurationList = "General&path=ManagedConfigurationList"
case reset = "General&path=Reset"
case ringtone = "Sounds&path=Ringtone"
case safari = "Safari"
case assistant = "General&path=Assistant"
case sounds = "Sounds"
case softwareUpdateLink = "General&path=SOFTWARE_UPDATE_LINK"
case store = "STORE"
case twitter = "TWITTER"
case facebook = "FACEBOOK"
case usage = "General&path=USAGE"
case video = "VIDEO"
case vpn = "General&path=Network/VPN"
case wallpaper = "Wallpaper"
case wifi = "WIFI"
case tethering = "INTERNET_TETHERING"
case blocked = "Phone&path=Blocked"
case doNotDisturb = "DO_NOT_DISTURB"
}
enum PreferenceExplorerError: Error {
case notFound(String)
}
open class PreferencesExplorer {
// MARK: - Class properties -
static private let preferencePath = "App-Prefs:root"
// MARK: - Class methods -
static func open(_ preferenceType: PreferenceType) throws {
let appPath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
if let url = URL(string: appPath) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
} else {
throw PreferenceExplorerError.notFound(appPath)
}
}
}
Это очень полезно, так как этот API изменится наверняка, и вы сможете реорганизовать один раз и очень быстро!
Ответ 5
Первый ответ от URL-адресов для конкретных приложений работал у меня на iOS 10.3.
if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
if UIApplication.shared.canOpenURL(appSettings) {
UIApplication.shared.open(appSettings)
}
}
Ответ 6
App-Prefs:root=Privacy&path=LOCATION
работал у меня для получения общих настроек местоположения. Примечание: работает только на устройстве.
Ответ 7
в ios10/Xcode 8 в симуляторе:
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
работы
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
нет.
Ответ 8
Я видел эту строку кода
UIApplication.sharedApplication() .openURL(NSURL(string:"prefs:root=General")!)
не работает, он не работает для меня в ios10/Xcode 8, просто небольшая разница в коде, замените это на
UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=General")!)
Swift3
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
Заменить
UIApplication.shared.openURL(URL(string:"App-Prefs:root=General")!)
Надеюсь, это поможет.
Приветствия.
Ответ 9
слово предупреждения: prefs:root
или App-Prefs:root
схемы URL считаются частным API. Apple может отклонить ваше приложение, если вы его используете, вот что вы можете получить при отправке приложения:
В вашем приложении используется неглавная URL-схема "prefs: root =", которая является частной. Использование непубличных API-интерфейсов не допускается в App Store, так как это может привести к плохой работе с пользователями при изменении этих API-интерфейсов. Продолжение использования или скрытия непубличных API в будущих представлениях этого приложения может привести к прекращению вашей учетной записи Apple Developer, а также удалению всех связанных приложений из App Store.
Следующие шаги
Чтобы устранить эту проблему, перейдите в приложение, чтобы предоставить связанные функции с помощью общедоступных API-интерфейсов или удалить функциональные возможности, используя схему URL-адресов "prefs: root" или "App-Prefs: root".
Если нет альтернатив для обеспечения функциональности вашего приложения, вы можете подать запрос на повышение.
Ответ 10
Swift 4.2, iOS 12
Метод open(url:options:completionHandler:)
был обновлен, чтобы включить словарь не-nil options, который на этом посту содержит только одну возможную опцию типа UIApplication.OpenExternalURLOptionsKey
(в примере).
@objc func openAppSpecificSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString),
UIApplication.shared.canOpenURL(url) else {
return
}
let optionsKeyDictionary = [UIApplication.OpenExternalURLOptionsKey(rawValue: "universalLinksOnly"): NSNumber(value: true)]
UIApplication.shared.open(url, options: optionsKeyDictionary, completionHandler: nil)
}
Явное построение URL-адреса, например, с "App-Prefs", имеет AFAIK, получило некоторые приложения, отклоненные из магазина.
Ответ 11
Добавление к @Luca Davanzo
iOS 11, некоторые настройки разрешений переместились в путь приложения:
Поддержка iOS 11
static func open(_ preferenceType: PreferenceType) throws {
var preferencePath: String
if #available(iOS 11.0, *), preferenceType == .video || preferenceType == .locationServices || preferenceType == .photos {
preferencePath = UIApplicationOpenSettingsURLString
} else {
preferencePath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
}
if let url = URL(string: preferencePath) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
} else {
throw PreferenceExplorerError.notFound(preferencePath)
}
}
Ответ 12
SWIFT 4
Это может привести к вашим конкретным настройкам вашего приложения, если это то, что вы ищете.
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
Ответ 13
Как указано выше, @niravdesai сказал App-prefs.
Я обнаружил, что App-Prefs:
работает для тестируемых устройств iOS 9, 10 и 11.
где prefs:
работает только на iOS 9.
Ответ 14
В iOS 10 и Swift 3 используйте следующий код:
UIApplication.shared.open(URL.init(string: "App-Prefs:root=General")!, options: [:]) { (success) in
}