Удалить элементы цепочки для ключей при удалении приложения

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

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

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

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

9 ответов

Решение

Вы можете воспользоваться тем, что 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 при первом запуске вашего приложения, если оно еще не установлено. Там есть комментарий, где вы должны поместить код для удаления значений из цепочки для ключей. Синхронизацию можно вызвать, чтобы убедиться, что ключ / значение "FirstRun" немедленно сохраняется в случае, если пользователь вручную убивает приложение, прежде чем система его сохранит.

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

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
}

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

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

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

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

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

Просто добавьте пакет настроек приложения и реализуйте переключатель для сброса цепочки ключей при перезапуске приложения или что-то еще на основе значения, выбранного в настройках (доступно через userDefaults)

Другие вопросы по тегам