[ios] 앱이 제거 될 때 키 체인 항목 삭제

내가 사용하고 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()
}