卸载应用程序时删除钥匙串项

时间:2011-01-20 12:59:04

标签: ios objective-c keychain

我使用idandersen's scifihifi-iphone代码进行钥匙串并使用

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

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

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

9 个答案:

答案 0 :(得分:384)

您可以通过卸载应用来清除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
}

如果尚未设置,则会在应用首次运行时检查并在NSUserDefaults中设置“FirstRun”键/值。有一个注释,你应该放置代码来删除钥匙串中的值。可以调用Synchronize以确保“FirstRun”键/值立即保留,以防用户在系统持续存在之前手动杀死应用程序。

答案 1 :(得分:28)

从设备删除应用程序时,没有触发器来执行代码。对钥匙串的访问取决于用于签署应用程序的供应配置文件。因此,没有其他应用程序能够访问钥匙串中的此信息。

当用户从设备中删除应用程序时,您无意中删除密钥链中的密码,但它应该让您感觉不到密码无法访问(仅限重新安装原始应用程序)

答案 2 :(得分:28)

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

let userDefaults = UserDefaults.standard

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

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

*请注意,不推荐使用synchronize()函数

答案 3 :(得分:26)

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

答案 4 :(得分:6)

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:5)

@amro's answer翻译成Swift 4.0:

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

答案 7 :(得分:3)

这似乎是基于beta#2中行为people have been witnessing的iOS 10.3上的默认行为。 Haven没有找到任何关于此的官方文档,所以如果你有,请发表评论。

答案 8 :(得分:0)

只需添加一个应用程序设置包并实施切换即可在应用程序重启时重置钥匙串或基于通过设置选择的值(可通过userDefaults获取)