我正在使用idandersen的scifihifi-iphone代码进行钥匙链和保存密码使用

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

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

当用户从设备中删除应用程序时,我想从密钥链中删除密码。我该怎么做呢?


当前回答

这似乎是iOS 10.3的默认行为,基于人们在测试版#2中看到的行为。我还没有找到任何关于这方面的官方文件,所以如果你有请评论。

其他回答

你可以利用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中检查和设置它。有一个注释,你应该把代码从钥匙串删除值。同步可以被调用,以确保“FirstRun”键/值立即被持久化,以防用户在系统持久化应用程序之前手动杀死它。

对于那些寻找@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
    }

这似乎是iOS 10.3的默认行为,基于人们在测试版#2中看到的行为。我还没有找到任何关于这方面的官方文件,所以如果你有请评论。

只需添加一个应用程序设置包,并实现一个切换,以重置应用程序重启或基于设置(可通过userDefaults)选择的值的钥匙链

@amro的回答翻译成Swift 4.0:

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