web-dev-qa-db-fra.com

Comment ouvrir les paramètres par programmation comme dans une application Facebook?

Je dois ouvrir les paramètres par programme à partir de mon application. J'ai cherché dans SO mais partout, les gens disent que c'est impossible. Mais aujourd'hui, j'ai vu que cela est implémenté dans l'application Facebook. Il y a un bouton sur un UIAlertView et lorsque vous cliquez dessus, vous ouvrez Il est donc possible d’ouvrir ces paramètres, j’en ai moi-même été témoin, mais comment faire? Quelqu'un sait-il comment Facebook le fait?

75
Andrey Chernukha

Vous ne pouvez pas, il n'y a pas d'appel API pour faire cela.

Seuls les dialogues système, les dialogues de Apple Frameworks, peuvent ouvrir l'application de configuration. Dans iOS 5, un schéma d'URL d'application permettait d'ouvrir la boîte de dialogue système, mais Apple avait été supprimé.) plus tard.


Avec l'arrivée d'iOS 8, vous pouvez ouvrir la boîte de dialogue des paramètres sur la page de vos applications.

if (&UIApplicationOpenSettingsURLString != NULL) {
   NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:url];
}
else {
  // Present some dialog telling the user to open the settings app.
}
54
rckoenes

Sur iOS 8, vous pouvez ouvrir les paramètres par programme!

Voici le code:

- (void)openSettings
{
    BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
    if (canOpenSettings) {
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:url];
    }
}

Si votre application possède son propre ensemble de paramètres, les paramètres seront ouverts et indiqueront les paramètres de votre application. Si votre application ne dispose pas d'un ensemble de paramètres, la page des paramètres principaux s'affiche.

138
Vito Ziv

Sur iOS 8, vous pouvez ouvrir les paramètres par programme!

Voici la liste des URL actuellement connues dans l'application Paramètres:

- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
    NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}    
  • 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 = General & path = 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 & 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 = General & path = USAGE
  • prefs: root = VIDEO
  • prefs: root = General & path = Réseau/VPN
  • prefs: root = Wallpaper
  • prefs: root = WIFI
  • prefs: root = INTERNET_TETHERING
32
Stalin Pusparaj

La réponse de Vito Ziv dans Swift.

func openSettings() {
    UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, completionHandler: nil)

}
19
Anoroah

L'alerte dans l'application Facebook à laquelle cette question fait référence est une alerte standard qu'iOS affiche lui-même lorsque vous définissez IRequiresPersistentWiFi sur YES dans vos fichiers Info.plist et l'utilisateur lance votre application sans connexion réseau.

Pour résumer la discussion ici:

  • Il n'y a pas d'URL que vous pouvez utiliser pour accéder au niveau racine de l'application Paramètres.
  • Vous pouvez envoyez l'utilisateur à la section de votre application de l'application Paramètres à l'aide de UIApplicationOpenSettingsURLString dans iOS 8.
  • Votre application peut afficher la même alerte que Facebook , ce qui ouvre le niveau racine de l'application Paramètres en définissant UIRequiresPersistentWiFi sur YES.
13
Richard Venable

Un mémo à propos de prefs:root= et Prefs:root.

Oui, notre application a été REJETÉE par Apple en raison de prefs:root= et App-Prefs:root Schéma d'URL aujourd'hui (2018-06-29). Ce sont des API privées.

Rejected by Apple


Pour Swift 4,

Seul IApplication.openSettingsURLString est une API publique permettant d'ouvrir les paramètres.

10
AechoLiu
 if (&UIApplicationOpenSettingsURLString != NULL)

dans iOS 8+ est toujours VRAI. Donc vous pouvez éditer comme ça

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}

(avec le nouveau openURL pour iOS 10)

7
Joannes

Si vous souhaitez ouvrir les paramètres d'application, vous devez utiliser la méthode d'écriture avec UIApplicationOpenSettingsURLString.

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)      
}

Si vous avez besoin d'ouvrir l'un des nombreux paramètres, vous devez utiliser cette fonction

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string:"App-Prefs:root=General")!)
}
4
user1064264

Pour ouvrir les paramètres de notre propre application dans iOS 8 and later, utilisez le code suivant.

- (void) openSettings
{
    if(&UIApplicationOpenSettingsURLString != nil)
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    else
        NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}

Pour référence et description détaillée, veuillez suivre

Ouverture de l'application Paramètres par programme dans iOS 8

3
Aamir
 if (&UIApplicationOpenSettingsURLString != NULL) {
            UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
                                                                              message:NSLocalizedString(@"You must allow camera access in Settings", nil)
                                                                             delegate:nil
                                                                    cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
                                                                    otherButtonTitles:NSLocalizedString(@"Open Settings", nil), nil];
            [alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
                if (alertView.cancelButtonIndex != buttonIndex) {
                    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
                    [[UIApplication sharedApplication] openURL:url];
                }
            }];
        }
        else {
            UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
                                                                              message:NSLocalizedString(@"You must allow camera access in Settings > Privacy > Camera", nil)
                                                                             delegate:nil
                                                                    cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                                                    otherButtonTitles:nil, nil];
            [alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
            }];
        }
2
IvanovDeveloper

Voici un exemple Swift 3 avec UIAlertController et UIAlertAction.

func showSettingsPopup() {
    let alertVC = UIAlertController(title: "Notifications disabled", message: "Please, turn on notifications if you want to receive a reminder messages.", preferredStyle: .alert)

    let close = UIAlertAction(title: "Close", style: .destructive, handler: { (action) in
        print("close action handler")                
    })

    let openSettings = UIAlertAction(title: "Open settings", style: .default, handler: { (action) in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }

        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                print("Settings are opened: \(success)")
            })
        }
    })

    alertVC.addAction(openSettings)
    alertVC.addAction(close)
    present(alertVC, animated: true, completion: nil)
}
1
Anvar Azizov

Dans la plupart des réponses données ici, je vois l'utilisation de "App-Prefs: root" "prefs: root", nous ne devrions pas les utiliser dans nos applications pour ouvrir les paramètres de l'application. Selon Apple, il s'agit d'un schéma d'URL non public. Si nous l'utilisons, notre application sera rejetée.

0
Ravi Kumar
if #available(iOS 10.0, *) {
        if let url = URL(string: "App-Prefs:root=Privacy") {
            UIApplication.shared.open(url, completionHandler: .none)
        }
    } else {
        // Fallback on earlier versions
    }

Ouverture des paramètres de confidentialité dans l'application

0
Hemanshu Liya

À la place d'utiliser prefs:, utilisez simplement App-Prefs:

if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString: @"App-Prefs:root=WIFI"]]) {
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString:@"App-Prefs:root=WIFI"]];
}

.

Tout est là: https://medium.com/@thanhvtrn/how-to-open-settings-wifi-in-Swift-on-ios-10-1d94cf2c2e6

0
Nikola Markovic