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


238

내가 사용하고 idandersen의 scifihifi - 아이폰 키 체인에 대한 코드 및 암호 저장 사용

[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
              forServiceName:@"TestService" updateExisting:YES error:&error];

장치에서 응용 프로그램을 삭제해도 암호는 키 체인에 남아 있습니다.

사용자가 장치에서 응용 프로그램을 삭제할 때 키 체인에서 암호를 제거하고 싶습니다. 어떻게해야합니까?


13
애플리케이션이 삭제 될 때 코드가 실행되지 않으므로이를 수행 할 방법이 없습니다.
Jonathan Grynspan

1
앱 내부에서만 키 체인 항목을 삭제할 수 있지만 제거하기 전에는 할 수 없다고 생각합니다. SFHFKeychainUtils의 deleteItem 메소드를보고 키 체인에서 사용자 이름 또는 비밀번호를 삭제할 수 있습니다.
matteodv

답변:


406

당신은 사실을 이용할 수 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"키 / 값이 즉시 유지되도록 동기화를 호출 할 수 있습니다.


2
본인은 애플리케이션을 처음 실행할 때 키 체인을 삭제 / 삭제할 수있는 Amro에 동의합니다. 마지막으로 앱을 제거하기 전에 설정된 모든 내용이 지워집니다. Facebook / Twitter 자격 증명을 저장하는 내 앱 중 하나에 대해이 작업을 수행했으며 설정된 키 체인에 앱만 액세스 할 수 있다는 사실을 알고 잘 작동했습니다.
XCool

이 힌트에 감사드립니다.
iOSAppDev

3
사용자가 앱을 수동으로 종료하면 NSUserDefaults가 지워지지 않습니다. 이 경우 시스템 (정기적으로)으로 설정했거나 아직 디스크와 동기화되지 않은 값 (을 호출하여 synchronize) 만 손실됩니다. 첫 번째 실행 키를 설정 한 후 동기화를 호출하는 것이 좋습니다. 그리고 예, NSUserDefaults는 장치가 재설정되고 백업에서 복원되지 않으면 지워지며이 경우에는 문제가 없습니다.
Amro

5
당신이 틀렸고 아마도 사용자 기본값을 지우는 무언가를하고있을 것입니다. NSUserDefaults의 전체 요점은 기본 설정을 저장하고 이러한 기본 설정을 여러 응용 프로그램 실행을 통해 유지하는 것입니다. 다시 말하지만 기기를 재설정하거나 앱을 삭제하면 사용자 기본값이 제거됩니다. 이 답변을 얼마나 많은 사람들이 투표했는지 확인하고 코드를 확인하십시오. 그런 다음 설명서를 읽으십시오. 도대체 관련 코드를 보내 주시면 내가 뭘 잘못하고 있는지 보여 드리겠습니다. iOS 2.0부터 이런 방식으로 사용되었습니다. 투표를하지 않더라도 먼저 격리 된 간단한 테스트 사례를 작성하는 것이 좋습니다.
Amro

9
NSUserDefault를 사용하는 것에 대해서는 확신이 없습니다. 왜? : 해당 스레드에서 찾아 보게 stackoverflow.com/questions/20269116/...을 . 백그라운드에서 앱을 시작하면 NSUserDefaults의 사용자 지정 키가 설정되지 않은 경우가 있습니다. 이 답변을 적용하면 실제로 원하지는 않지만 키 체인 사용자 정의 키가 삭제됩니다!
Aurelien Porte 2016 년

40

@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 () 함수는 사용되지 않습니다


2
if !userDefaults.bool(forKey: "hasRunBefore") {더 깨끗합니다.
nefarianblack

1
동기화 통화를 제거해야합니다.
Pochi

30

앱이 기기에서 삭제 된 경우 코드를 수행하는 트리거가 없습니다. 키 체인에 대한 액세스는 애플리케이션에 서명하는 데 사용되는 프로비저닝 프로파일에 따라 다릅니다. 따라서 다른 응용 프로그램은 키 체인에서이 정보에 액세스 할 수 없습니다.

사용자가 장치에서 응용 프로그램을 삭제할 때 키 체인에서 암호를 제거하는 것을 목표로하지는 않지만 암호에 액세스 할 수 없다는 (원래 응용 프로그램을 다시 설치해야만) 편안함을 제공해야합니다.


따라서 애플리케이션의 프로비저닝 프로파일을 변경하면 이전에 저장된 키 체인 값에 액세스 할 수있을 것입니다.
Moaz Saeed '

27

@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
    }

9

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);
        }

1
if (VersionTracking.IsFirstLaunchEver) {// remove keychain items}Xamarin.Essentials에서 사용 하면에 대한 코드가 필요하지 않습니다 userDefaults. Xamarin.Essentials가이를 대신합니다 .
Christopher Stephan

7

사용자가 앱을 제거하면 앱의 문서 디렉토리에서 파일이 삭제됩니다. 이것을 아는 것은 파일이 가장 먼저 발생하는지 확인하는 것입니다.application:didFinishLaunchingWithOptions: . 그 후, 파일이 더미 파일 인 경우에도 무조건 파일을 작성하십시오.

검사 할 때 파일이 존재하지 않으면 최신 설치 이후 처음으로 실행 된 것입니다. 나중에 앱에서 알아야 할 경우 부울 결과를 앱 대리인에게 저장하십시오.


7

@amro의 답변 은 Swift 4.0으로 번역되었습니다.

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}

또는 if !UserDefaults.standard.bool(forKey: "FirstInstall")키가 없으면 기본값이 false로 설정됩니다. 그리고 .synchronize ()는 필요하지 않습니다.
CharlesA

3

사람들이 베타 2에서 목격 한 행동을 기반으로하는 iOS 10.3의 기본 동작 인 것 같습니다 . 이에 대한 공식적인 문서를 아직 찾지 못했으면 의견을 남겨주십시오.


7
베타 5까지는 iOS 10.3의 공개 릴리스 에는이 변경 사항이 포함되어 있지 않습니다 .
Jakub Truhlář
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.