Wie öffne ich Einstellungen programmgesteuert wie in der Facebook-App?

75

Ich muss Einstellungen programmgesteuert in meiner App öffnen. Ich habe über SO gesucht, aber überall sagen Leute, dass es unmöglich ist. Aber heute habe ich gesehen, dass es in der Facebook-App implementiert ist. Es gibt eine Schaltfläche auf einem UIAlertViewund wenn Sie darauf klicken, öffnen Sie die Einstellungen. Es ist also tatsächlich möglich, Einstellungen zu öffnen. Ich habe dies selbst gesehen. Aber wie geht das? Weiß jemand, wie Facebook das macht?

Andrey Chernukha
quelle
Beachten Sie, dass die Facebook-Anwendung Open Source ist und vollständig auf github verfügbar ist.
Sulthan
Facebook hat diese Warnung nicht angezeigt, das Betriebssystem hat es getan. Dies geschieht unter bestimmten Umständen, z. B. wenn der Flugzeugmodus aktiviert oder das WLAN deaktiviert wird. Das Betriebssystem bietet Ihnen an, Einstellungen zu öffnen und zu ändern.
Guy Kogus
9
@Sulthanthe beachten Sie, dass die Facebook-Anwendung nicht Open Source ist. Nur das SDK ist.
MatterGoal
Überprüfen Sie dies: stackoverflow.com/questions/5655674/…
Guyromb
Besuchen Sie diese Antwort für Swift 3: http://stackoverflow.com/a/34024467/5391914
Hamed

Antworten:

57

Sie können nicht, es gibt keinen API-Aufruf, um dies zu tun.

Nur Systemdialoge, Dialoge von Apple Frameworks, können die Einstellungs-App öffnen. In iOS 5 gab es ein App-URL-Schema zum Öffnen des Systemdialogs, das Apple jedoch später entfernte.


Mit iOS 8 können Sie den Einstellungsdialog auf Ihrer Apps-Seite öffnen.

if (&UIApplicationOpenSettingsURLString != NULL) {
   NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:url];
}
else {
  // Present some dialog telling the user to open the settings app.
}
rckoenes
quelle
5
gut, aber Facebook
tat es
3
Das liegt daran, dass sie sehr eng mit Apple zusammenarbeiten und den dort integrierten Dienst in iOS integrieren. Das bedeutet nicht, dass Sie es schaffen können! Möglicherweise dürfen sie sogar eine private API aufrufen, um die Einstellungs-App zu öffnen.
rckoenes
3
Ich bin mir ziemlich sicher, dass dies einfach ein normaler Teil der App ist, der wie auf der Seite "Einstellungen" aussieht. Wissen Sie?
Fattie
9
Hey Leute, unter iOS 8 ist das Öffnen von Einstellungen programmgesteuert möglich, siehe meine Antwort
Vito Ziv
2
@VitoZiv das stimmt, aber als diese Frage gestellt wurde, war meine Antwort richtig.
rckoenes
139

Unter iOS 8 können Sie Einstellungen programmgesteuert öffnen!

Hier ist der Code:

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

Wenn Ihre App über ein eigenes Einstellungspaket verfügt, werden die Einstellungen mit den Einstellungen Ihrer App geöffnet. Wenn Ihre App kein Einstellungspaket hat, wird die Seite mit den Haupteinstellungen angezeigt.

Vito Ziv
quelle
@BeemerFan nicht nur die Einstellungsseite Ihrer eigenen App.
rckoenes
3
Weiß jemand, wie man nur die Einstellungs-App öffnet, nicht die Seite mit den einzelnen Einstellungen? Facebook öffnet die App Einstellungen, ohne zur Seite mit den einzelnen Einstellungen zu wechseln.
Pei
7
Achtung: Wenn Sie Ihr Einstellungspaket nicht festgelegt haben, öffnet dieser Code weiterhin die App-Einstellungen (mit "Benachrichtigungen" und "Mobilfunkdaten verwenden") und nicht die allgemeinen Einstellungen.
MatterGoal
1
Wie können Sie die App-Einstellungen entfernen, um die allgemeinen Einstellungen zu öffnen? Es ist bereits in ios8 vorhanden, wenn Sie die App installieren.
Vatti
2
Würden Sie mir bitte sagen, wie ich das App-Einstellungspaket bei xcode löschen kann? Ich gehe immer zu den App-Einstellungen anstelle der allgemeinen Einstellungen
Raju yourPepe
33

Unter iOS 8 können Sie Einstellungen programmgesteuert öffnen!

Hier ist die Liste der derzeit bekannten URLs in der Einstellungen-App:

- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
    NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}    
  • Einstellungen: root = Allgemein & Pfad = Info
  • Einstellungen: root = Allgemein & Pfad = ZUGÄNGLICHKEIT
  • Einstellungen: root = AIRPLANE_MODE
  • Einstellungen: root = General & path = AUTOLOCK
  • Einstellungen: root = General & path = USAGE / CELLULAR_USAGE
  • Einstellungen: root = Helligkeit
  • Einstellungen: root = Allgemein & Pfad = Bluetooth
  • Einstellungen: root = General & path = DATE_AND_TIME
  • Einstellungen: root = FACETIME
  • Einstellungen: root = Allgemein
  • Einstellungen: root = Allgemein & Pfad = Tastatur
  • Einstellungen: root = CASTLE
  • Einstellungen: root = CASTLE & path = STORAGE_AND_BACKUP
  • Einstellungen: root = General & path = INTERNATIONAL
  • Einstellungen: root = LOCATION_SERVICES
  • Einstellungen: root = ACCOUNT_SETTINGS
  • Einstellungen: root = MUSIC
  • Einstellungen: root = MUSIC & path = EQ
  • Einstellungen: root = MUSIC & path = VolumeLimit
  • Einstellungen: root = Allgemein & Pfad = Netzwerk
  • Einstellungen: root = NIKE_PLUS_IPOD
  • Einstellungen: root = NOTES
  • Einstellungen: root = NOTIFICATIONS_ID
  • Einstellungen: root = Telefon
  • Einstellungen: root = Fotos
  • Einstellungen: root = General & path = ManagedConfigurationList
  • Einstellungen: root = Allgemein & Pfad = Zurücksetzen
  • Einstellungen: root = Sounds & path = Klingelton
  • Einstellungen: root = Safari
  • Einstellungen: root = Allgemein & Pfad = Assistent
  • Einstellungen: root = Sounds
  • Einstellungen: root = General & path = SOFTWARE_UPDATE_LINK
  • Einstellungen: root = STORE
  • Einstellungen: root = TWITTER
  • Einstellungen: root = General & path = USAGE
  • Einstellungen: root = VIDEO
  • Einstellungen: root = Allgemein & Pfad = Netzwerk / VPN
  • Einstellungen: root = Wallpaper
  • Einstellungen: root = WIFI
  • Einstellungen: root = INTERNET_TETHERING
Stalin Pusparaj
quelle
2
Können Sie dazu auf eine offizielle Apple-Quelle verlinken oder wurde sie entdeckt, indem Sie sich irgendwie umgesehen haben?
Joey Carson
1
Es sieht so aus, als ob die meisten davon in iOS 10 nicht mehr funktionieren. stackoverflow.com/questions/38064557/…
wyu
6
Ersetzen Sie einfach die Einstellungen durch App-Einstellungen für iOS 10. Der obige Code funktioniert für iOS 8,9,10.
Stalin Pusparaj
1
"App-Prefs: root = Datenschutz & Pfad = Standort" ist spezifisch für Location Services.
dichen
1
Ihre App wird von Apple für die Verwendung von Einstellungen abgelehnt: root
Helam
20

Vito Zivs Antwort in Swift.

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

}
Anoroah
quelle
Wie gelangen wir zu den WLAN-Einstellungen, damit ein Benutzer das WLAN in der App wieder verbinden kann?
JMStudios.jrichardson
1
@ JMStudios.jrichardson Dafür gibt es noch keinen Weg. Nur App-Einstellungen
alexey.metelkin
1
openURL ist jetzt in Swift3 veraltet. Hat jemand ein aktualisiertes Beispiel dafür?
Geoff
13

Die Warnung in der Facebook-App, auf die sich diese Frage bezieht, ist eine Standardwarnung, die iOS selbst anzeigt, wenn Sie UIRequiresPersistentWiFi in Ihren Info.plist-Dateien auf YES setzen und der Benutzer Ihre App ohne Netzwerkverbindung startet.

Um die Diskussion hier zusammenzufassen:

  • Es gibt keine URL, mit der Sie zur Stammebene der Einstellungen-App gelangen können.
  • Sie können den Benutzer mit UIApplicationOpenSettingsURLString in iOS 8 zum Abschnitt Ihrer App in der App Einstellungen senden .
  • Ihre App kann dieselbe Warnung wie Facebook anzeigen , wodurch die Stammebene der Einstellungen-App geöffnet wird, indem Sie UIRequiresPersistentWiFi auf YES setzen.
Richard Venable
quelle
>>> Der Bereich Ihrer App in der Einstellungen-App <<< Wie verhält es sich, wenn Sie keine settings.bundlefür Ihre App bereitstellen ? Ich stelle fest, dass diese URL beim Start über Xcode zur Seite mit den Einstellungen der obersten Ebene führt. Aber wenn ich über TestFlight gehe, gehe ich zu meiner untergeordneten Seite mit den (leeren) App-Einstellungen. Aber ich habe keine erstellt settings.bundle, und es gibt keine in meinem .appProdukt ...
pkamb
Soweit Facebook dasselbe tut, sollte dies die richtige Antwort sein. UIRequiresPersistentWiFiist das, wonach ich gesucht habe, um die Warnung anzuzeigen. Weiß jedoch jemand, ob Sie es zur Laufzeit programmgesteuert auslösen können, anstatt die info.plist zu verwenden? @Richard Venable, wenn es eine Methode gibt, die Sie aufrufen können, damit Sie diese tatsächlich nutzen können, wenn Sie auf eine bestimmte Schaltfläche klicken?
user3832583
11

Ein Memo über prefs:root=und Prefs:root.

Ja, unsere App wurde von Apple ABGELEHNT wegen prefs:root=und App-Prefs:rootheute URL - Schema (2018-06-29). Sie sind private API.

Von Apple abgelehnt


Für Swift 4

Nur UIApplication.openSettingsURLString ist eine öffentliche API zum Öffnen von Einstellungen.

AechoLiu
quelle
14. August 2018 - Unsere App wurde gerade dafür abgelehnt. Es war für 3 Releases in unserer Codebasis, bevor sie uns schließlich dafür ablehnten.
Cameron E
Habt ihr hier eine Lösung gefunden?
Sukeshj
Nein. Ich verwende es UIApplication.openSettingsURLStringjetzt und bitte meinen Chef, die UI-Spezifikation für dieses Problem zu ändern.
AechoLiu
7
 if (&UIApplicationOpenSettingsURLString != NULL)

in iOS 8+ ist immer WAHR. So können Sie so bearbeiten

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

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

(mit neuem openURL für iOS 10)

Joannes
quelle
5

Wenn Sie offene Anwendungseinstellungen wünschen, benötigen Sie eine Schreibmethode mit UIApplicationOpenSettingsURLString.

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

Wenn Sie eine von vielen Einstellungen öffnen müssen, müssen Sie diese Funktion verwenden

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string:"App-Prefs:root=General")!)
}
user1064264
quelle
Verwenden Sie in Ihren Apps nicht "App-Prefs: root = General". Apple lehnt Ihre App für die Verwendung einer nicht öffentlichen URL in Ihrer Anwendung ab. Meins wurde regected
Ravi Kumar
3

iOS 8 and laterVerwenden Sie den folgenden Code, um Einstellungen unserer eigenen Anwendung in zu öffnen .

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

Als Referenz und detaillierte Beschreibung folgen Sie bitte

Programmgesteuertes Öffnen der Einstellungen-App in iOS 8

Aamir
quelle
2
 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) {
            }];
        }
IvanovDeveloper
quelle
1

Hier ist ein Swift 3-Beispiel mit UIAlertController und 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)
}
Anvar Azizov
quelle
0
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
    }

Öffnen der Datenschutzeinstellungen in der App

Hemanshu Liya
quelle
0

In vielen der hier gegebenen Antworten sehe ich die Verwendung von "App-Prefs: root" "prefs: root". Wir sollten diese nicht in unseren Apps verwenden, um die Einstellungs-App zu öffnen. Laut Apple ist dies ein nicht öffentliches URL-Schema. Wenn wir es verwenden, wird unsere App abgelehnt.

Ravi Kumar
quelle
-1

SWIFT 3

UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
BennyTheNerd
quelle
openURL ist in Swift 3 veraltet. Verwenden Sie open (URL (Zeichenfolge: UIApplicationOpenSettingsURLString)!, Optionen: [:], CompletionHandler: {_ in})
Damian Dudycz