Como faço para abrir as configurações do telefone quando um botão é clicado?

Estou tentando implementar um recurso em um aplicativo que mostra um alerta quando a conexão com a Internet não está disponível. O alerta tem duas ações (OK e Configurações), sempre que um usuário clica nas configurações, eu quero levá-las para as configurações do telefone programaticamente.

Estou usando o Swift e o Xcode.

Usando UIApplicationOpenSettingsURLString

Atualização para o 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 as versões abaixo do iOS 11

Às vezes, queremos levar o usuário a outras configurações além das configurações do aplicativo. O método a seguir ajudará você a conseguir isso:

Primeiro configure os esquemas de URL em seu projeto. Você o encontrará em Target -> Info -> URL Scheme. clique no botão + e digite prefs em esquemas de URL

insira a descrição da imagem aqui

Rápido

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

Swift 3

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

Objetivo-c

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

e a seguir estão todos os URLs disponíveis

  • prefs: root = Geral e caminho = Sobre
  • prefs: root = Geral e caminho = ACESSIBILIDADE
  • prefs: root = AIRPLANE_MODE
  • prefs: root = Geral e caminho = AUTOLOCK
  • prefs: root = Geral e caminho = USAGE / CELLULAR_USAGE
  • prefs: root = Brilho
  • prefs: root = Bluetooth
  • prefs: root = Geral e caminho = DATE_AND_TIME
  • prefs: root = FACETIME
  • prefs: root = geral
  • prefs: root = Geral e caminho = Teclado
  • prefs: root = CASTLE
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = Geral e caminho = INTERNACIONAL
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS
  • prefs: root = MÚSICA
  • prefs: root = MÚSICA e caminho = EQ
  • prefs: root = MÚSICA & caminho = VolumeLimit
  • prefs: root = Geral e caminho = Rede
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = NOTAS
  • prefs: root = NOTIFICATIONS_ID
  • prefs: root = telefone
  • prefs: root = Fotos
  • prefs: root = Geral e caminho = ManagedConfigurationList
  • prefs: root = Geral e caminho = Reset
  • prefs: root = Sons e caminho = Ringtone
  • prefs: root = Safari
  • prefs: root = Geral e caminho = Assistente
  • prefs: root = Sons
  • prefs: root = Geral e caminho = SOFTWARE_UPDATE_LINK
  • prefs: root = STORE
  • prefs: root = TWITTER
  • prefs: root = FACEBOOK
  • prefs: root = Geral e caminho = USAGE prefs: root = VIDEO
  • prefs: root = Geral e caminho = Rede / VPN
  • prefs: root = papel de parede
  • prefs: root = WIFI
  • prefs: root = INTERNET_TETHERING
  • prefs: root = telefone e caminho = bloqueado
  • prefs: root = DO_NOT_DISTURB

Nota: A configuração de rede não será aberta em um simulador, mas o link funcionará em um dispositivo real.

No iOS 8+, você pode fazer o seguinte:

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

Swift 4

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

Usando a dica do @ vivek eu desenvolvo uma class de utilitários baseada no Swift 3 , espero que você goste!

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

Isso é muito útil, já que a API mudará com certeza e você poderá refatorar uma vez e muito rápido!

A primeira resposta de esquemas de URL específicos de aplicativos funcionou para mim no 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 funcionou para mim para acessar as configurações gerais de local. Nota: funciona apenas em um dispositivo.

no ios10 / Xcode 8 no simulador:

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

trabalho

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

não.

Eu vi essa linha de código

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

não está funcionando, não funcionou para mim no ios10 / Xcode 8, apenas uma pequena diferença de código, por favor substitua isso com

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

Swift3

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

Substituir com

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

Espero que ajude. Felicidades.

Adicionando a @Luca Davanzo

iOS 11, algumas configurações de permissions foram movidas para o caminho do aplicativo:

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

No iOS 10 e Swift 3, use o código abaixo:

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

SWIFT 4

Isso pode levar as configurações específicas do seu aplicativo, se é isso que você está procurando.

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

Como acima @niravdesai disse App-prefs. Descobri que o App-Prefs: funciona para dispositivos iOS 9, 10 e 11. testados. onde como prefs: funciona somente no iOS 9.

palavra de aviso: os prefs:root ou App-Prefs:root esquemas de URL App-Prefs:root são considerados API privada. A Apple pode rejeitar seu aplicativo se você usá-lo. Veja o que você pode receber ao enviar seu aplicativo:

Seu aplicativo usa o “prefs: root =” esquema de URL não público, que é uma entidade privada. O uso de APIs não públicas não é permitido na App Store porque pode levar a uma má experiência do usuário, caso essas APIs sejam alteradas. Continuar a usar ou ocultar APIs não públicas em envios futuros deste aplicativo pode resultar no encerramento da sua conta de desenvolvedor da Apple, bem como na remoção de todos os aplicativos associados da App Store.

Próximos passos

Para resolver esse problema, revise seu aplicativo para fornecer a funcionalidade associada usando APIs públicas ou remova a funcionalidade usando o esquema de URL “prefs: root” ou “App-Prefs: root”.

Se não houver alternativas para fornecer a funcionalidade que seu aplicativo requer, você pode arquivar uma solicitação de aprimoramento.

Swift 4, atualização beta do iOS 12

O método open(url:options:completionHandler:) foi atualizado para include um dictionary de opções não nulo, que, a partir desta postagem, contém apenas uma opção possível do tipo UIApplication.OpenExternalURLOptionsKey (no exemplo).

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

A construção explícita de um URL, como “App-Prefs”, obteve alguns aplicativos rejeitados da loja, AFAIK.