web-dev-qa-db-fra.com

Comment ouvrir les paramètres du téléphone quand un bouton est cliqué?

J'essaie d'implémenter une fonctionnalité dans une application qui affiche une alerte lorsque la connexion Internet n'est pas disponible ... L'alerte a deux actions (OK et Paramètres), chaque fois qu'un utilisateur clique sur des paramètres, je souhaite paramètres du téléphone par programmation.

J'utilise Swift et Xcode.

122
Solomon Ayoola

Utiliser UIApplication.openSettingsURLString

Mise à jour pour 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: 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 2.x

Utiliser UIApplicationOpenSettingsURLString

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)
}
224
Marius Fanu

Swift 4

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

REMARQUE: la méthode suivante fonctionne pour toutes les versions inférieures à iOS 11; pour les versions plus récentes, l'application peut être rejetée car il s'agit d'une API privée

Parfois, nous souhaitons amener un utilisateur vers des paramètres autres que ceux de notre application . La méthode suivante vous aidera à atteindre cet objectif:

Tout d’abord, configurez les modèles d’URL dans votre projet. Vous le trouverez dans Target -> Info -> URL Scheme. cliquez sur le bouton + et tapez prefs dans URL Schemes

 enter image description here

Swift 3

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

Rapide

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

Objectif c

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

et voici toutes les URL disponibles

  • prefs: root = General & path = About 
  • prefs: root = General & path = ACCESSIBILITY
  • prefs: root = AIRPLANE_MODE 
  • prefs: root = General & path = AUTOLOCK
  • prefs: root = General & path = USAGE/CELLULAR_USAGE 
  • prefs: root = Luminosité
  • prefs: root = Bluetooth
  • prefs: root = General & path = DATE_AND_TIME 
  • prefs: root = FACETIME
  • prefs: root = General 
  • prefs: root = General & path = Keyboard 
  • prefs: root = CASTLE
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = General & path = INTERNATIONAL 
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS 
  • prefs: root = MUSIC 
  • 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 = Phone 
  • prefs: root = Photos
  • prefs: root = General & path = ManagedConfigurationList
  • prefs: root = General & path = Reset 
  • prefs: root = Sons et chemin = Sonnerie
  • prefs: root = Safari 
  • prefs: root = General & path = Assistant 
  • prefs: root = Sons
  • prefs: root = General & path = SOFTWARE_UPDATE_LINK 
  • prefs: root = STORE
  • prefs: root = Twitter
  • prefs: root = FACEBOOK 
  • prefs: root = Général & path = USAGE prefs: root = VIDEO
  • prefs: root = General & path = Réseau/VPN 
  • prefs: root = Wallpaper
  • prefs: root = WIFI 
  • prefs: root = INTERNET_TETHERING
  • prefs: root = Phone & path = Blocked
  • prefs: root = DO_NOT_DISTURB

Remarque: Le paramètre réseau ne sera pas ouvert dans un simulateur, mais le lien fonctionnera sur un périphérique réel.

180
vivek takrani

Dans iOS 8+, vous pouvez effectuer les opérations suivantes:

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

Swift 4

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

En utilisant le conseil de @ vivek, je développe une classe d’utils basée sur Swift 3 , j'espère que vous apprécierez!

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

}

Ceci est très utile car cette API va changer à coup sûr et vous pouvez refactoriser une fois et très rapidement!

18
Luca Davanzo

La première réponse de Schémas d'URL spécifiques à une application a fonctionné pour moi sur iOS 10.3. 

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

App-Prefs:root=Privacy&path=LOCATION a travaillé pour moi pour accéder aux paramètres de localisation généraux. Remarque: ne fonctionne que sur un appareil.

11
Joe Susnick

J'ai vu cette ligne de code

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

ne fonctionne pas, cela ne fonctionne pas pour moi dans ios10/Xcode 8, juste une petite différence de code, veuillez remplacer ceci par

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

Swift3

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

Remplacer par

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

J'espère que ça aide .

7
niravdesai21

dans ios10/Xcode 8 dans le simulateur:

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

travaux

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

ne fait pas.

7
ingconti

Swift 4.2, iOS 12

La méthode open(url:options:completionHandler:) a été mise à jour pour inclure un dictionnaire d'options non nil qui, à compter de cette publication, ne contient qu'une option possible de type UIApplication.OpenExternalURLOptionsKey (dans l'exemple).

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

}

La construction explicite d'une URL, comme avec "App-Prefs", a, autant que je sache, obtenu le rejet de certaines applications du magasin.

6
bsod

Ajout à @Luca Davanzo

iOS 11, certains paramètres d'autorisations ont été déplacés vers le chemin de l'application:

Support 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)
    }
}
5
Tal Zion

Mot d'avertissement: les schémas d'URL prefs:root ou App-Prefs:root sont considérés comme des API privées. Apple peut rejeter votre application si vous utilisez celles-ci. Voici ce que vous pouvez obtenir lors de la soumission de votre application: 

Votre application utilise le schéma d'URL non public "prefs: root =", qui est une entité privée. L'utilisation d'API non publiques n'est pas autorisée sur l'App Store, car l'expérience utilisateur pourrait être mauvaise si ces API devaient changer. Continuer à utiliser ou à dissimuler des API non publiques dans les soumissions futures de cette application peut entraîner la résiliation de votre compte de développeur Apple, ainsi que le retrait de toutes les applications associées de l'App Store.

Prochaines étapes

Pour résoudre ce problème, veuillez modifier votre application afin de fournir la fonctionnalité associée à l'aide d'API publiques ou la supprimer à l'aide du schéma d'URL "prefs: root" ou "App-Prefs: root".

S'il n'existe aucune alternative pour fournir les fonctionnalités requises par votre application, vous pouvez déposer une demande d'amélioration.

4
ofer

Swift 4

Cela pourrait prendre les paramètres spécifiques de votre application, si c'est ce que vous recherchez.

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

Comme ci-dessus, @niravdesai a déclaré App-prefs. J'ai constaté que App-Prefs: fonctionnait à la fois pour les appareils iOS 9, 10 et 11. Les appareils testés. où en tant que prefs: ne fonctionne que sur iOS 9.

0
Alix