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()。