Удаление элементов связки ключей при удалении приложения


Я использую scifihifi-iphone идандерсена код для брелка и сохранить пароль с помощью

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

когда я удаляю приложение с устройства, пароль остается в связке ключей.

Я хочу удалить пароль из Связки ключей, когда пользователь удаляет приложение с устройства. Как я могу это сделать?

8 203

8 ответов:

вы можете воспользоваться тем, что NSUserDefaults are очищается путем удаления приложения. Например:

- (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 " немедленно сохраняется в случае, если пользователь убивает приложение вручную перед системой но это не так.

нет триггера для выполнения кода, когда приложение удаляется из устройства. Доступ к связке ключей зависит от профиля подготовки, который используется для подписи приложений. Поэтому другие приложения не смогут получить доступ к этой информации в Keychain.

Это не поможет вам удалить пароль в связке ключей, когда пользователь удаляет приложение с устройства, но это должно дать вам некоторое утешение, что пароль недоступен (только из переустановка исходного приложения).

для тех, кто ищет быструю версию ответа @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
    }

для пользователей, которые ищут Swift 3.0 версия ответа @amro:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
     // Remove Keychain items here

     // Update the flag indicator
     userDefaults.set(true, forKey: "hasRunBefore")
     userDefaults.synchronize() // Forces the app to update UserDefaults
}

файлы будут удалены из директории вашего приложения, когда пользователь удаляет приложение. Зная это, все, что вам нужно сделать, это проверить, существует ли файл как первое, что происходит в application:didFinishLaunchingWithOptions:. После этого безоговорочно создайте файл (даже если это просто фиктивный файл).

Если файл не существовал на момент проверки, вы знаете, что это первый запуск с момента последней установки. Если вам нужно узнать позже в приложении, сохраните логический результат в делегате приложения член.

C# Xamarin version

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

Это, кажется, поведение по умолчанию на iOS 10.3 на основе поведения люди были свидетелями в бета-версии #2. Еще не нашли никакой официальной документации об этом, поэтому, пожалуйста, прокомментируйте, если у вас есть.

@AMRO в перевод на Swift 4.0:

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