我正在使用idandersen的scifihifi-iphone代码进行钥匙链和保存密码使用
[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
}
如果你的应用程序第一次运行时还没有设置“FirstRun”键/值,这将在NSUserDefaults中检查和设置它。有一个注释,你应该把代码从钥匙串删除值。同步可以被调用,以确保“FirstRun”键/值立即被持久化,以防用户在系统持久化应用程序之前手动杀死它。
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);
}