删除应用程序时删除钥匙串项目

我正在使用idandersen的scifihifi-iphone代码来使用钥匙串和保存密码

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

当我从设备上删除应用程序时,密码仍保留在钥匙串中。

当用户从设备上删除应用程序时,我想从钥匙串中删除密码。 我怎样才能做到这一点?

您可以利用NSUserDefaults通过卸载应用程序清除的事实。 例如:

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

这将检查并设置一个“FirstRun”键/值在NSUserDefaults的第一次运行的应用程序,如果它尚未设置。 有一个评论,你应该把代码从钥匙串中删除值。 可以调用Synchronize以确保“FirstRun”键/值立即保留,以防用户在系统保留之前手动终止应用程序。

从应用程序删除应用程序时没有触发器执行代码。 访问钥匙串取决于用于签署应用程序的供应configuration文件。 因此,其他应用程序将无法访问钥匙串中的这些信息。

当用户从设备上删除应用程序时,它并不能帮助您去除钥匙串中的密码,但是它应该给您一些安慰,使得密码是不可访问的(只能通过重新安装原始应用程序)。

对于那些寻找@ amro的Swift版本的回答:

  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 } 

对于寻找@ amro回答的Swift 3.0版本的用户:

 let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "hasRunBefore") == false { // Remove Keychain items here // Update the flag indicator userDefaults.set(true, forKey: "hasRunBefore") userDefaults.synchronize() // Forces the app to update UserDefaults } 

当用户卸载应用程序时,文件将从应用程序的文档目录中删除。 知道这一点,你所要做的就是检查一个文件是否作为application:didFinishLaunchingWithOptions:中发生的第一件事情而存在application:didFinishLaunchingWithOptions: 之后,无条件地创build文件(即使它只是一个虚拟文件)。

如果该文件在检查时不存在,那么这是自从最新安装以来的第一次运行。 如果您需要在应用程序的后面知道,请将布尔结果保存到您的应用程序委托成员。

这似乎是基于人们在testing版#2中见过的行为在iOS 10.3上的默认行为。 还没有find任何官方文件,所以请评论,如果你有。