¿Cómo abro la configuración del teléfono cuando se hace clic en un botón?

Estoy tratando de implementar una función en una aplicación que muestra una alerta cuando la conexión a Internet no está disponible. La alerta tiene dos acciones (Aceptar y Configuración), cada vez que un usuario hace clic en la configuración, quiero llevarlas a la configuración del teléfono mediante progtwigción.

Estoy usando Swift y Xcode.

Usando UIApplicationOpenSettingsURLString

Actualización para Swift 3

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

Swift 2.x

 override func viewDidAppear(animated: Bool) { var alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .Alert) var settingsAction = UIAlertAction(title: "Settings", style: .Default) { (_) -> Void in let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString) if let url = settingsUrl { UIApplication.sharedApplication().openURL(url) } } var cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil) alertController.addAction(settingsAction) alertController.addAction(cancelAction) presentViewController(alertController, animated: true, completion: nil) } 

NOTA: Este método funciona para todas las versiones debajo de iOS 11

Algunas veces queremos llevar al usuario a una configuración que no sea la configuración de nuestra aplicación. El siguiente método te ayudará a lograr eso:

Primero configure los Esquemas de URL en su proyecto. Lo encontrará en Target -> Info -> URL Scheme. haga clic en el botón + y escriba prefs en Esquemas de URL

enter image description here

Rápido

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

Swift 3

 UIApplication.shared.open(URL(string:"App-Prefs:root=General")!, options: [:], completionHandler: nil) 

C objective

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

y siguientes son todas las URL disponibles

  • prefs: root = General & path = Acerca de
  • prefs: root = General & path = ACCESIBILIDAD
  • prefs: root = AIRPLANE_MODE
  • prefs: root = General & path = AUTOLOCK
  • prefs: root = General & path = USO / USO CELULAR
  • prefs: root = Brillo
  • Preferencias: root = Bluetooth
  • prefs: root = General & path = DATE_AND_TIME
  • prefs: root = FACETIME
  • prefs: root = General
  • prefs: root = General & path = Teclado
  • prefs: root = CASTILLO
  • Preferencias: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = General & path = INTERNACIONAL
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS
  • prefs: root = MÚSICA
  • prefs: root = MUSIC & path = EQ
  • prefs: root = MUSIC & path = VolumeLimit
  • prefs: root = General & path = Network
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = NOTES
  • prefs: root = NOTIFICATIONS_ID
  • prefs: root = Teléfono
  • prefs: root = Fotos
  • prefs: root = General & path = ManagedConfigurationList
  • prefs: root = General & path = Restablecer
  • prefs: root = Sonidos y ruta = Tono de llamada
  • prefs: root = Safari
  • prefs: root = General & path = Asistente
  • prefs: root = Sonidos
  • prefs: root = General & path = SOFTWARE_UPDATE_LINK
  • prefs: root = TIENDA
  • prefs: root = TWITTER
  • prefs: root = FACEBOOK
  • prefs: root = General & path = Preferencias de USO: root = VIDEO
  • prefs: root = General & path = Red / VPN
  • prefs: root = Fondo de escritorio
  • Preferencias: root = WIFI
  • prefs: root = INTERNET_TETHERING
  • prefs: root = Phone & path = Bloqueado
  • prefs: root = DO_NOT_DISTURB

Nota: La configuración de red no se abrirá en un simulador, pero el enlace funcionará en un dispositivo real.

En iOS 8+ puedes hacer lo siguiente:

  func buttonClicked(sender:UIButton) { UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)) } 

Swift 4

  let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)! UIApplication.shared.open(settingsUrl) 

Usando la pista de @ vivek, desarrollo una clase utils basada en Swift 3 , ¡espero que la aprecies!

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

Esto es muy útil, ya que las API cambiarán con seguridad y usted puede refactorizar una vez y muy rápido.

La primera respuesta de los Esquemas de URL específicos de la aplicación funcionó para mí en iOS 10.3.

 if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) { if UIApplication.shared.canOpenURL(appSettings) { UIApplication.shared.open(appSettings) } } 

App-Prefs:root=Privacy&path=LOCATION funcionó para mí para llegar a la configuración de ubicación general. Nota: solo funciona en un dispositivo.

en ios10 / Xcode 8 en el simulador:

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

trabajos

 UIApplication.shared.openURL(URL(string:"prefs:root=General")!) 

no.

He visto esta línea de código

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

no funciona, no funcionó para mí en ios10 / Xcode 8, solo una pequeña diferencia de código, reemplace esto con

 UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=General")!) 

Swift3

 UIApplication.shared.openURL(URL(string:"prefs:root=General")!) 

Reemplazar con

 UIApplication.shared.openURL(URL(string:"App-Prefs:root=General")!) 

Espero eso ayude. Aclamaciones.

Agregando a @Luca Davanzo

iOS 11, algunas configuraciones de permisos se han movido a la ruta de la aplicación:

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

En iOS 10 y Swift 3, utiliza el siguiente código:

 UIApplication.shared.open(URL.init(string: "App-Prefs:root=General")!, options: [:]) { (success) in } 

SWIFT 4

Esto podría tomar la configuración específica de su aplicación, si eso es lo que está buscando.

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

Como se indicó anteriormente, @niravdesai dijo App-prefs. Descubrí que App-Prefs: funciona para iOS 9, 10 y 11. dispositivos probados. donde como prefs: solo funciona en iOS 9.

palabra de advertencia: los prefs:root o App-Prefs:root esquemas de URL App-Prefs:root se consideran API privadas. Apple puede rechazar tu aplicación si la usas, esto es lo que puedes obtener al enviar tu aplicación:

Su aplicación utiliza el esquema de URL no pública “prefs: root =”, que es una entidad privada. El uso de API no públicas no está permitido en la tienda de aplicaciones porque puede llevar a una experiencia de usuario deficiente si estas API cambian. Si continúa utilizando u ocultando API no públicas en futuras presentaciones de esta aplicación, es posible que se cancele su cuenta de Desarrollador de Apple, así como que se eliminen todas las aplicaciones asociadas de la Tienda de aplicaciones.

Próximos pasos

Para resolver este problema, revise su aplicación para proporcionar la funcionalidad asociada utilizando API públicas o elimine la funcionalidad mediante el esquema de URL “prefs: root” o “App-Prefs: root”.

Si no hay alternativas para proporcionar la funcionalidad que requiere su aplicación, puede presentar una solicitud de mejora.

Swift 4, iOS 12 beta actualización

El método open(url:options:completionHandler:) se ha actualizado para incluir un diccionario de opciones no nulo, que a partir de esta publicación solo contiene una opción posible de tipo UIApplication.OpenExternalURLOptionsKey (en el ejemplo).

 @objc private func openAppSpecificSettings() { guard let url = URL(string: UIApplicationOpenSettingsURLString), UIApplication.shared.canOpenURL(url) else { return } UIApplication.shared.open(url, options: ["universalLinksOnly": NSNumber(value: true)], completionHandler: nil) } 

Al construir explícitamente una URL, como con “Preferencias de la aplicación”, AFAIK ha obtenido algunas aplicaciones rechazadas de la tienda.

    Intereting Posts