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.
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)
}
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
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
Remarque: Le paramètre réseau ne sera pas ouvert dans un simulateur, mais le lien fonctionnera sur un périphérique réel.
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)
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!
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)
}
}
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.
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 .
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.
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.
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)
}
}
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.
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)!)
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.