Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 卸载应用程序时删除密钥链项目_Ios_Objective C_Keychain - Fatal编程技术网

Ios 卸载应用程序时删除密钥链项目

Ios 卸载应用程序时删除密钥链项目,ios,objective-c,keychain,Ios,Objective C,Keychain,我正在使用密钥链代码,并使用 [SFHFKeychainUtils storeUsername:@"User" andPassword:@"123" forServiceName:@"TestService" updateExisting:YES error:&error]; 当我从设备中删除应用程序时,密码仍保留在钥匙链中 当用户从设备中删除应用程序时,我想从钥匙链中删除密码。如何执行此操作?从设备中删除应用程序时,没有执行代码的触发器。对密钥链的访问取决

我正在使用密钥链代码,并使用

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

这将检查并设置应用程序第一次运行时
NSUserDefaults
中的“FirstRun”键/值(如果尚未设置)。这里有一条注释,您应该在其中放置代码以从键链中删除值。可以调用Synchronize以确保“FirstRun”键/值立即保持不变,以防用户在系统保持不变之前手动终止应用程序。

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


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

对于那些寻求@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
    }
let userDefaults = UserDefaults.standard

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

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

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

    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
    }
let userDefaults = UserDefaults.standard

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

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

*请注意,synchronize()函数已被弃用

这似乎是iOS 10.3上基于beta#2中行为的默认行为。尚未找到任何关于此的官方文档,因此如果有,请发表评论。

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注释)

翻译成Swift 4.0:

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

只需添加一个应用程序设置包,并在应用程序重新启动或基于通过设置选择的值(可通过UserDefault获得)时实现一个切换来重置钥匙链。

因为删除应用程序时代码不会运行,你没有办法做到这一点。我认为你只能从应用程序内部删除钥匙链项目,但不能在卸载之前删除。您可以查看SFHFKeychainUtils的deleteItem方法,从密钥链中删除用户名或密码。我同意Amro的观点,即您可以在应用程序首次运行时删除/清除密钥链。这将清除上次卸载应用程序之前设置的所有内容。我这样做是为了我的一个存储Facebook/Twitter凭据的应用程序,它工作得非常好,因为它知道只有你的应用程序才能访问设置的任何密钥链。当用户手动退出应用程序时,NSUserDefaults不会被清除。在这种情况下,只有已设置但系统(定期)或尚未与磁盘同步(通过调用
synchronize
)的值才会丢失。最好在设置第一个运行键后调用synchronize。是的,当设备复位(而不是从备份中恢复)时,NSUserDefaults会被清除,在这种情况下,这很好。你错了,你可能正在做一些导致用户默认值被清除的事情。NSUserDefaults的整个要点是保存首选项,并使这些首选项在多个应用程序启动过程中保持不变。同样,重置设备或删除应用程序将删除用户默认设置。看看有多少人对这个答案投了赞成票,然后检查你的代码。然后去阅读文档。见鬼,把相关代码发给我,我会告诉你你做错了什么。从iOS 2.0开始就一直如此。否决投票,但我建议先编写一个独立的、简单的测试用例。这里有一篇文章详细解释了这一点,我对使用NSUserDefault来实现这一点不是很有信心。为什么?请查看该线程:。如果您从后台启动应用程序,在某些情况下,NSUserDefaults中的自定义键就是没有设置。应用此答案将导致删除您的钥匙链自定义钥匙,尽管您确实不希望这样做!我想,在beta 5之前,iOS 10.3的公开发行版并不包含这一变化。
if!bool(forKey:“hasRunBefore”){
它只是更干净。同步调用应该被删除。因此,如果我们更改应用程序的设置配置文件,它是否能够访问keychain中以前存储的值。@根据我的经验,即使设置配置文件更改,应用程序也可以访问keychain中以前存储的值。如果(VersionTracking.IsFirstLaunchEver){//remove keychain items}从Xamarin.Essentials您不需要
userDefaults
的代码,甚至
if!userDefaults.standard.bool(forKey:“FirstInstall”)
如果密钥不存在,则默认为false。不需要.synchronize()。