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

Я использую idandersen scifihifi-iphone для связывания ключей и сохранения пароля с помощью

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

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

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

Ответ 1

Вы можете воспользоваться тем фактом, что 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
}

Это проверяет и устанавливает ключ/значение "FirstRun" в NSUserDefaults при первом запуске вашего приложения, если оно еще не установлено. Там комментарий, где вы должны положить код для удаления значений из keychain. Синхронизация может быть вызвана, чтобы убедиться, что ключ/значение "FirstRun" немедленно сохраняется, если пользователь убивает приложение вручную до того, как система его сохранит.

Ответ 2

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

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

Ответ 3

Для пользователей, которые ищут версию @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() устарела

Ответ 4

Для тех, кто ищет 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
    }

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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