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


160

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 llevarlos a la configuración del teléfono mediante programación.

Estoy usando Swift y Xcode.

Respuestas:


301

Utilizando UIApplication.openSettingsURLString

Actualización para 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)
}

¿Cómo implemento eso? @Marius Fanu
Solomon Ayoola

usando iOS8 @Marius Fanu
Solomon Ayoola

@AyoolaSolomon He actualizado mi respuesta para agregar una alerta sobre el viewDidAppearmétodo, con el botón SettingsyCancel
Marius Fanu

2
No, no lo creo. Para ir a su aplicación, su aplicación debe implementar un esquema de URL personalizado y llamar UIApplication.sharedApplication().openURL(yourCustomURL)desde la aplicación actual, pero no tiene ese acceso desde la aplicación Configuración
Marius Fanu

55
@PersianBlue es correcto en iOS 10.1.1 esto no puede iniciar la aplicación de configuración.
Michael Garito

237

⚠️ ¡Ten cuidado!

Esta respuesta se basa en API no documentadas y recientemente (desde iOS12) Apple rechaza las aplicaciones con este enfoque.

Respuesta original a continuación

Swift 5

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

Swift 4

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

NOTA: El siguiente método funciona para todas las versiones inferiores a iOS 11, para versiones superiores la aplicación podría ser rechazada ya que es una API privada

A veces, queremos llevar a un usuario a configuraciones distintas de la configuración de nuestra aplicación. El siguiente método lo ayudará a lograrlo:

Primero, configure los esquemas de URL en su proyecto. Lo encontrará en Target -> Información -> Esquema de URL. haga clic en el botón + y escriba prefs en esquemas de URL

ingrese la descripción de la imagen aquí

Swift 5

UIApplication.shared.open(URL(string: "App-prefs:Bluetooth")!)

Swift 3

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

Rápido

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

C objetivo

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

y las siguientes son todas las URL disponibles

** En iOS <12 **

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

En iOS 13

  • App-prefs: General & path = Acerca de
  • Preferencias de aplicación: AIRPLANE_MODE
  • Preferencias de aplicación: General & path = AUTOLOCK
  • Preferencias de aplicación: Bluetooth
  • Preferencias de aplicación: General & path = DATE_AND_TIME
  • Preferencias de aplicación: FACETIME
  • Preferencias de aplicación: general
  • Preferencias de aplicación: General & path = Keyboard
  • Preferencias de aplicación: CASTILLO
  • Preferencias de aplicación: CASTLE & path = STORAGE_AND_BACKUP
  • Preferencias de aplicación: General y ruta = INTERNACIONAL
  • Preferencias de aplicación: MÚSICA
  • Preferencias de aplicación: NOTAS
  • Preferencias de aplicación: NOTIFICATIONS_ID
  • Preferencias de aplicación: teléfono
  • Preferencias de aplicación: fotos
  • Preferencias de aplicación: General & path = ManagedConfigurationList
  • Preferencias de aplicación: General & ruta = Restablecer
  • Preferencias de aplicación: Sonidos y ruta = Tono de llamada
  • Preferencias de aplicación: sonidos
  • Preferencias de aplicación: General & path = SOFTWARE_UPDATE_LINK
  • Preferencias de aplicación: STORE
  • Preferencias de aplicación: fondo de pantalla
  • Preferencias de aplicación: WIFI
  • Preferencias de aplicación: INTERNET_TETHERING
  • Preferencias de aplicación: DO_NOT_DISTURB

    No probado

  • Preferencias de aplicación: TWITTER (??)

  • Preferencias de aplicación: FACEBOOK (??)
  • Preferencias de aplicación: NIKE_PLUS_IPOD (??)

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


77
Esto no funciona con iOS 10. Ejecutó el mismo código en iOS 9.3. y funcionó, se ejecutó en iOS 10 y no funcionó (independientemente de qué url se use)
Gruntcakes

18
Para iOS 10, use en App-Prefslugar de prefscomo el esquema de la cadena de URL. por ejemploApp-Prefs:root=WIFI
Desmond DAI

8
recientemente revisó una aplicación para lanzarla en la App Store, y Apple la rechazó debido al uso de "prefs: root" o "App-Prefs: root". Lo usé para abrir la configuración wifi, cuando el usuario no tiene conexión a Internet.
Marcel T

21
Desde que iOS 12 saldrá pronto, Apple rechaza la aplicación que incluye dicho pref. Por favor se consciente de ello. Incluso mi aplicación también fue rechazada
Thiha Aung,

8
NO use App-Prefso prefs:rootya que estos son API privada, ya menos que usted es muy afortunado que su aplicación va a ser rechazado.
Tejas K

45

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)

16
Esto lo lleva a la configuración específica de la aplicación, ¿cómo los llevo a la página de configuración general o, mejor aún, a la sección de salud?
Ace Green

2
Swift 3 -UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
Aviv Ben Shabat

@AceGreen, ¿llegaste a la sección de salud?
Saad

¿Cómo abres solo la aplicación Configuración? La "página de inicio" de la misma
Daniel Springer

sin "!" firmarURL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober

21

Usando la sugerencia de @ vivek, desarrollo una clase de utilidades basada en Swift 3 , ¡espero que lo 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 puede refactorizar una vez y muy rápido!


55
¿Esto pasaría por la revisión de Apple?
L_Sonic

Voy a agregar una cosa más para hacerlo un poco mejor. En la enumeración, puede hacer una variable de tipo String con el nombre urlString. Luego, devuelve "App-Prefs: root =" = self.rawValue. Básicamente, esto eliminará la necesidad de appPath y el let privado estático. Salud.
mn1

La configuración de notificaciones no se abre en iOS 11.
Metin Atalay

2
esto no funcionará ya que recibimos este mensaje de la aplicación: "Su aplicación usa el esquema de URL no público" prefs: root = ", que es una entidad privada. El uso de API no públicas no está permitido en la App Store porque puede llevar a una experiencia de usuario deficiente en caso de que estas API cambien. Continuar usando u ocultando API no públicas en futuras presentaciones de esta aplicación puede resultar en la cancelación de su cuenta de desarrollador de Apple, así como la eliminación de todas las aplicaciones asociadas de la aplicación Tienda."
CodeOverRide

1
@L_Sonic no, no pasará la revisión, y si lo hace, podría marcarse al azar en cualquier actualización futura que empuje
RP Carson


12

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


12
Esto es rechazado
Daniel Springer

7

en ios10 / Xcode 8 en simulador:

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

trabajos

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

no.


¿Se NSha eliminado el prefijo en iOS 10?
JC Rocamonde

2
Esto solo funcionará si su aplicación tiene un archivo .bundle (sus preferencias de aplicación)
Sophy Swicz

@Sophy Swicz ¿Cómo puedo agregar un archivo .bundle?
Desarrollador

1
@Developer github.com/phynet/SettingBundleiOSProject también, la configuración de su aplicación son todos los servicios que su aplicación permite usar y se muestran en General -> configuración de su aplicación
Sophy Swicz

7

He visto esta linea de codigo

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


1
Causas: Aplicación rechazada
ergunkocak

7

advertencia: los esquemas prefs:rooto App-Prefs:rootURL se consideran API privados. Apple puede rechazar su aplicación si la usa, esto es lo que puede obtener al enviar su aplicación:

Su aplicación utiliza el esquema de URL no público "prefs: root =", que es una entidad privada. El uso de API no públicas no está permitido en la App Store porque puede generar una mala experiencia del usuario en caso de que estas API cambien. Continuar usando u ocultando API no públicas en futuras presentaciones de esta aplicación puede resultar en la cancelación de su cuenta de desarrollador de Apple, así como la eliminación de todas las aplicaciones asociadas de la App Store.

Próximos pasos

Para resolver este problema, revise su aplicación para proporcionar la funcionalidad asociada usando API públicas o elimine la funcionalidad usando 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.


No hay una forma compatible de abrir Configuración en la 'página' de Wi-Fi / Idioma / Ubicación. El hecho de que esto funcionó en iOS 9 es un error que se ha solucionado en iOS 10. Para obtener más información, consulte foros.developer.apple.com/message/186656#186656
Mohit Kumar

6

Swift 4.2, iOS 12

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

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

}

Al construir explícitamente una URL, como con "App-Prefs", AFAIK ha rechazado algunas aplicaciones de la tienda.


Confirmo esto, la aplicación estaba bien con "App-Prefs" antes, pero después del Evento Especial de Apple mi actualización fue rechazada, volviendo a UIApplicationOpenSettingsURLString.
Vitalii

5

Agregando a @Luca Davanzo

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

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

2
¿Esto puede pasar por Apple Review? Quiero decir, ¿esto conducirá al rechazo de la aplicación?
Aakash Dave

44
cuando ejecuto este código, simplemente me lleva a la página de configuración. No es la pestaña de configuración específica en él.
Aakash Dave el

2

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

gracias ... tengo eso funcionando ... pero quiero cambiar la configuración en aplicaciones que son de otros desarrolladores. Por ejemplo, presione un botón y cambie la configuración de notificaciones Push de Facebook para que no envíen mensajes durante una reunión. Predigo que podría haber soluciones MDM ... o no.
IrishGringo

@IrishGringo la única forma de cambiar la configuración de la aplicación de Facebook es que el usuario abra la configuración de la aplicación de Facebook navegando a través de Configuración general >> Notificaciones >> Facebook
BennyTheNerd

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.