enc*_*enc 233 objective-c keychain ios
我正在使用idandersen的scifihifi-iphone代码进行钥匙串和使用保存密码
[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
forServiceName:@"TestService" updateExisting:YES error:&error];
Run Code Online (Sandbox Code Playgroud)
当我从设备中删除应用程序时,密码仍保留在钥匙串中.
我想在用户从设备中删除应用程序时从密钥链中删除密码.我怎样才能做到这一点?
Amr*_*mro 396
你可以利用这一事实的优点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
}
Run Code Online (Sandbox Code Playgroud)
NSUserDefaults如果尚未设置,则会在应用的首次运行时检查并设置"FirstRun"键/值.有一个注释,你应该放置代码来删除钥匙串中的值.可以调用Synchronize以确保"FirstRun"键/值立即保留,以防用户在系统持续存在之前手动杀死应用程序.
bwc*_*ley 35
对于寻找Swift 3.0版本@ amro的答案的用户:
let userDefaults = UserDefaults.standard
if !userDefaults.bool(forKey: "hasRunBefore") {
// Remove Keychain items here
// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
}
Run Code Online (Sandbox Code Playgroud)
Sha*_*bon 29
从设备删除应用程序时,没有触发器来执行代码.对钥匙串的访问取决于用于签署应用程序的供应配置文件.因此,没有其他应用程序能够访问钥匙串中的此信息.
当用户从设备中删除应用程序时,您无意中删除密钥链中的密码,但它应该让您感到安慰,即无法访问密码(仅限重新安装原始应用程序).
rsc*_*rsc 27
对于那些寻找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
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
...并清除钥匙串中的记录(上面的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);
}
Run Code Online (Sandbox Code Playgroud)
当用户卸载应用程序时,文件将从应用程序的文档目录中删除.知道了这一点,你所要做的就是检查文件是否存在是第一件事application:didFinishLaunchingWithOptions:.然后,无条件地创建文件(即使它只是一个虚拟文件).
如果检查时文件不存在,您知道这是自最新安装以来的第一次运行.如果您稍后需要在应用程序中知道,请将布尔结果保存到您的应用程序委托成员.
@ amro的答案翻译成Swift 4.0:
if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
UserDefaults.standard.set(false, forKey: "FirstInstall")
UserDefaults.standard.synchronize()
}
Run Code Online (Sandbox Code Playgroud)