首页 文章

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

提问于
浏览
208

我正在使用idandersen's scifihifi-iphone密码链代码并使用保存密码

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

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

我想在用户从设备中删除应用程序时从密钥链中删除密码 . 我怎样才能做到这一点?

8 回答

  • 6

    @amro's answer已翻译为Swift 4.0:

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

    您可以利用卸载应用程序清除 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
    }
    

    如果's not already set. There'是一个注释,你应该放置代码来删除钥匙串中的值,这会在你应用的第一次运行中检查并设置"FirstRun"键/值 . 可以调用Synchronize以确保"FirstRun"键/值立即保留,以防用户在系统持续存在之前手动杀死应用程序 .

  • 24

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

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

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

  • 24

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

  • 27

    对于寻找_ amul's答案的 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
    }
    
  • 5

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

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

  • 3

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

相关问题