web-dev-qa-db-fra.com

Supprimer des éléments du trousseau lorsqu'une application est désinstallée

J'utilise idandersen's scifihifi-iphone code pour le trousseau et enregistrer le mot de passe en utilisant

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

Lorsque je supprime l'application de l'appareil, le mot de passe reste dans le trousseau.

Je souhaite supprimer le mot de passe du trousseau lorsque l'utilisateur supprime l'application du périphérique. Comment puis-je faire ceci?

224
enc

Vous pouvez tirer parti du fait que NSUserDefaultsare est effacé par la désinstallation d'une application. Par exemple:

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

Ceci recherche et définit une clé/valeur "FirstRun" dans NSUserDefaults lors de la première exécution de votre application, si elle n'est pas déjà définie. Il y a un commentaire où vous devriez mettre du code pour supprimer des valeurs du trousseau. Synchronize peut être appelé pour s'assurer que la clé/valeur "FirstRun" est immédiatement conservée au cas où l'utilisateur tuerait l'application manuellement avant que le système ne la maintienne.

387
Amro

Pour les utilisateurs à la recherche d'une version Swift 3. de la réponse de @ amro:

let userDefaults = UserDefaults.standard

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

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

* notez que la fonction synchronize () est obsolète

28
Brad Cooley

Il n'y a pas de déclencheur pour exécuter le code lorsque l'application est supprimée de l'appareil. L'accès au trousseau dépend du profil d'approvisionnement utilisé pour signer l'application. Par conséquent, aucune autre application ne pourrait accéder à ces informations dans le trousseau.

Le fait de supprimer le mot de passe du trousseau lorsque l'utilisateur supprime une application de l'appareil ne vous aide pas, mais vous devez être certain que le mot de passe n'est pas accessible (uniquement à partir d'une réinstallation de l'application d'origine).

28
Shane Fitzgibbon

Pour ceux qui recherchent une version Swift de la réponse de @ amro:

    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
    }
26
rsc

Version C # Xamarin

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

... et pour effacer les enregistrements du trousseau (commentaire TODO ci-dessus)

        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);
        }
9
InquisitorJax

Les fichiers seront supprimés du répertoire de documents de votre application lorsque l'utilisateur désinstalle l'application. Sachant cela, tout ce que vous avez à faire est de vérifier si un fichier existe comme première chose qui se passe dans application:didFinishLaunchingWithOptions:. Ensuite, créez le fichier sans condition (même s'il ne s'agit que d'un fichier factice).

Si le fichier n'existait pas au moment de la vérification, vous savez qu'il s'agit de la première exécution depuis la dernière installation. Si vous avez besoin de savoir plus tard dans l'application, enregistrez le résultat booléen sur le membre délégué de votre application.

6
stephen

réponse de @ amro traduit en Swift 4.0:

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}
5
Muhammad Nayab

Cela semble être le comportement par défaut sur iOS 10.3 basé sur le comportement des personnes ont été témoins en version bêta # 2. N'ayant pas trouvé de documentation officielle à ce sujet, merci de commenter si vous en avez.

3
Stavash