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

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

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

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


当前回答

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

其他回答

@amro的回答翻译成Swift 4.0:

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

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

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

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

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

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

... 并从钥匙链中清除记录(上面的TODO注释)

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