내가 사용하고 idandersen의 scifihifi – 아이폰 키 체인에 대한 코드 및 암호 저장 사용
[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”키 / 값을 확인하고 설정합니다. 키 체인에서 값을 삭제하는 코드를 넣어야하는 의견이 있습니다. 시스템이 유지하기 전에 사용자가 앱을 수동으로 종료하는 경우 “FirstRun”키 / 값이 즉시 유지되도록 동기화를 호출 할 수 있습니다.
답변
@amro의 답변의 Swift 3.0 버전을 찾는 사용자 의 경우 :
let userDefaults = UserDefaults.standard
if !userDefaults.bool(forKey: "hasRunBefore") {
// Remove Keychain items here
// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
}
* synchronize () 함수는 사용되지 않습니다
답변
앱이 기기에서 삭제 된 경우 코드를 수행하는 트리거가 없습니다. 키 체인에 대한 액세스는 애플리케이션에 서명하는 데 사용되는 프로비저닝 프로파일에 따라 다릅니다. 따라서 다른 응용 프로그램은 키 체인에서이 정보에 액세스 할 수 없습니다.
사용자가 장치에서 응용 프로그램을 삭제할 때 키 체인에서 암호를 제거하는 것을 목표로하지는 않지만 암호에 액세스 할 수 없다는 (원래 응용 프로그램을 다시 설치해야만) 편안함을 제공해야합니다.
답변
@amro의 답변의 Swift 버전을 찾는 사람들에게 :
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
}
답변
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);
}
답변
사용자가 앱을 제거하면 앱의 문서 디렉토리에서 파일이 삭제됩니다. 이것을 아는 것은 파일이 가장 먼저 발생하는지 확인하는 것입니다.application:didFinishLaunchingWithOptions:
. 그 후, 파일이 더미 파일 인 경우에도 무조건 파일을 작성하십시오.
검사 할 때 파일이 존재하지 않으면 최신 설치 이후 처음으로 실행 된 것입니다. 나중에 앱에서 알아야 할 경우 부울 결과를 앱 대리인에게 저장하십시오.
답변
@amro의 답변 은 Swift 4.0으로 번역되었습니다.
if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
UserDefaults.standard.set(false, forKey: "FirstInstall")
UserDefaults.standard.synchronize()
}