Löschen Sie Schlüsselbundelemente, wenn eine App deinstalliert wird

238

Ich verwende den Scifihifi-iPhone- Code von idandersen für den Schlüsselbund und speichere das Passwort mit

[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
              forServiceName:@"TestService" updateExisting:YES error:&error];

Wenn ich die Anwendung vom Gerät lösche, bleibt das Kennwort im Schlüsselbund.

Ich möchte das Kennwort aus dem Schlüsselbund entfernen, wenn der Benutzer die Anwendung vom Gerät löscht. Wie kann ich das machen?

enc
quelle
13
Da Ihr Code beim Löschen Ihrer Anwendung nicht ausgeführt wird, haben Sie keine Möglichkeit, dies zu tun.
Jonathan Grynspan
1
Ich denke, dass Sie ein Schlüsselbundelement nur aus der App heraus löschen können, aber nicht bevor Sie es deinstallieren. Sie können sich die deleteItem-Methode von SFHFKeychainUtils ansehen, um einen Benutzernamen oder ein Kennwort aus dem Schlüsselbund zu löschen.
Matteodv

Antworten:

406

Sie können die Vorteile aus der Tatsache ziehen , dass NSUserDefaults sich durch die Deinstallation einer App gelöscht. Beispielsweise:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Clear keychain on first run in case of reinstallation
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"FirstRun"]) {
        // Delete values from keychain here
        [[NSUserDefaults standardUserDefaults] setValue:@"1strun" forKey:@"FirstRun"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    //...Other stuff that usually happens in didFinishLaunching
}

Dadurch wird NSUserDefaultsbeim ersten Ausführen Ihrer App nach einem "FirstRun" -Schlüssel / -Wert gesucht und dieser festgelegt, sofern dieser noch nicht festgelegt ist. Es gibt einen Kommentar, in den Sie Code einfügen sollten, um Werte aus dem Schlüsselbund zu löschen. Die Synchronisierung kann aufgerufen werden, um sicherzustellen, dass der Schlüssel / Wert "FirstRun" sofort beibehalten wird, falls der Benutzer die App manuell beendet, bevor das System sie beibehält.

Amro
quelle
2
Ich stimme Amro zu, dass Sie Ihren Schlüsselbund beim ersten Ausführen der Anwendung löschen / löschen können. Dadurch wird alles gelöscht, was vor der letzten Deinstallation der App festgelegt wurde. Ich habe dies für eine meiner Apps getan, in der Facebook / Twitter-Anmeldeinformationen gespeichert sind, und es funktioniert ziemlich gut, da ich weiß, dass nur Ihre App Zugriff auf den festgelegten Schlüsselbund hat.
XCool
Danke für diesen Hinweis.
iOSAppDev
3
NSUserDefaults werden nicht gelöscht, wenn der Benutzer die App manuell beendet. synchronizeIn diesem Fall gehen nur Werte verloren, die Sie festgelegt haben, aber entweder das System (regelmäßig) oder die Sie noch nicht mit der Festplatte synchronisiert haben (durch Aufrufen ). Es ist eine gute Idee, synchronize aufzurufen, nachdem Sie den ersten Ausführungsschlüssel festgelegt haben. Und ja, NSUserDefaults werden gelöscht, wenn ein Gerät zurückgesetzt (und nicht aus dem Backup wiederhergestellt) wird, und das ist in diesem Fall in Ordnung.
Amro
5
Sie liegen falsch und tun wahrscheinlich etwas, das dazu führt, dass die Benutzerstandards gelöscht werden. Der gesamte Zweck von NSUserDefaults besteht darin, Einstellungen zu speichern und diese Einstellungen bei mehreren Anwendungsstarts beizubehalten. Wenn Sie das Gerät zurücksetzen oder eine App löschen, werden die Standardeinstellungen des Benutzers entfernt. Sehen Sie sich an, wie viele Personen diese Antwort positiv bewertet haben, und überprüfen Sie Ihren Code. Dann lesen Sie die Dokumentation. Schicken Sie mir den entsprechenden Code und ich zeige Ihnen, was Sie falsch machen. Dies ist seit iOS 2.0 so. Stimmen Sie ab, aber ich würde vorschlagen, zuerst einen isolierten, einfachen Testfall zu schreiben.
Amro
9
Ich wäre nicht sehr sicher, NSUserDefault dafür zu verwenden. Warum? Schauen Sie sich diesen Thread an: stackoverflow.com/questions/20269116/… . Wenn Sie Ihre App im Hintergrund starten, gibt es Fälle, in denen Ihre benutzerdefinierten Schlüssel in NSUserDefaults einfach nicht festgelegt sind. Das Anwenden dieser Antwort würde dazu führen, dass Ihre benutzerdefinierten Schlüsselbundschlüssel gelöscht werden, obwohl Sie das wirklich nicht wollten!
Aurelien Porte
40

Für Benutzer, die nach einer Swift 3.0- Version der Antwort von @ amro suchen:

let userDefaults = UserDefaults.standard

if !userDefaults.bool(forKey: "hasRunBefore") {
     // Remove Keychain items here

     // Update the flag indicator
     userDefaults.set(true, forKey: "hasRunBefore")
}

* Beachten Sie, dass die Funktion synchronize () veraltet ist

bwcooley
quelle
2
if !userDefaults.bool(forKey: "hasRunBefore") {Es ist nur sauberer.
Nefarianblack
1
Der Synchronisierungsaufruf sollte entfernt werden.
Pochi
30

Es gibt keinen Auslöser zum Ausführen von Code, wenn die App vom Gerät gelöscht wird. Der Zugriff auf den Schlüsselbund hängt vom Bereitstellungsprofil ab, mit dem die Anwendung signiert wird. Daher können keine anderen Anwendungen auf diese Informationen im Schlüsselbund zugreifen.

Es hilft Ihnen nicht, das Kennwort im Schlüsselbund zu entfernen, wenn der Benutzer die Anwendung vom Gerät löscht. Es sollte Ihnen jedoch den Komfort bieten, dass auf das Kennwort nicht zugegriffen werden kann (nur bei einer Neuinstallation der ursprünglichen Anwendung).

Shane Fitzgibbon
quelle
Wenn wir also das Bereitstellungsprofil unserer Anwendung ändern, kann sie auf zuvor im Schlüsselbund gespeicherte Werte zugreifen.
Moaz Saeed
27

Für diejenigen, die nach einer Swift-Version der Antwort von @ amro suchen:

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.boolForKey("hasRunBefore") == false {

        // remove keychain items here


        // update the flag indicator
        userDefaults.setBool(true, forKey: "hasRunBefore")
        userDefaults.synchronize() // forces the app to update the NSUserDefaults

        return
    }
rsc
quelle
9

C # Xamarin-Version

    const string FIRST_RUN = "hasRunBefore";
    var userDefaults = NSUserDefaults.StandardUserDefaults;
    if (!userDefaults.BoolForKey(FIRST_RUN))
    {
        //TODO: remove keychain items
        userDefaults.SetBool(true, FIRST_RUN);
        userDefaults.Synchronize();
    }

... und um Datensätze aus dem Schlüsselbund zu löschen (TODO-Kommentar oben)

        var securityRecords = new[] { SecKind.GenericPassword,
                                    SecKind.Certificate,
                                    SecKind.Identity,
                                    SecKind.InternetPassword,
                                    SecKind.Key
                                };
        foreach (var recordKind in securityRecords)
        {
            SecRecord query = new SecRecord(recordKind);
            SecKeyChain.Remove(query);
        }
InquisitorJax
quelle
1
Bei Verwendung if (VersionTracking.IsFirstLaunchEver) {// remove keychain items}von Xamarin.Essentials benötigen Sie den Code für das nicht userDefaults. Xamarin.Essentials verpackt das für Sie .
Christopher Stephan
7

Dateien werden aus dem Dokumentverzeichnis Ihrer App gelöscht, wenn der Benutzer die App deinstalliert. Wenn Sie dies wissen, müssen Sie nur prüfen, ob eine Datei als erstes vorhanden ist application:didFinishLaunchingWithOptions:. Erstellen Sie anschließend die Datei unbedingt (auch wenn es sich nur um eine Dummy-Datei handelt).

Wenn die Datei zum Zeitpunkt der Überprüfung nicht vorhanden war, wissen Sie, dass dies der erste Lauf seit der letzten Installation ist. Wenn Sie es später in der App wissen müssen, speichern Sie das boolesche Ergebnis in Ihrem App-Delegierten-Mitglied.

stephen
quelle
7

@ amros Antwort übersetzt in Swift 4.0:

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}
Muhammad Nayab
quelle
Oder sogar, if !UserDefaults.standard.bool(forKey: "FirstInstall")was standardmäßig false ist, wenn der Schlüssel nicht vorhanden ist. Und .synchronize () wird nicht benötigt.
CharlesA
3

Dies scheint das Standardverhalten auf iOS 10.3 auf dem Verhalten basiert zu sein Menschen wurden Zeugen in der Beta # 2. Ich habe noch keine offizielle Dokumentation dazu gefunden. Bitte kommentieren Sie diese, falls vorhanden.

Stavash
quelle
7
Es war bis Beta 5 Ich denke, Veröffentlichung von iOS 10.3 nicht diese Änderung enthalten.
Jakub Truhlář