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?
Vous pouvez tirer parti du fait que NSUserDefaults
are 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.
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
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).
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
}
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);
}
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.
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()
}
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.