Удалить элементы цепочки для ключей при удалении приложения - PullRequest
223 голосов
/ 20 января 2011

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

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

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

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

Ответы [ 8 ]

385 голосов
/ 01 июня 2011

Вы можете воспользоваться тем фактом, что 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» немедленно сохраняется в случае, если пользователь вручную убивает приложение, прежде чем система его сохранит.

28 голосов
/ 22 ноября 2016

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

let userDefaults = UserDefaults.standard

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

     // Update the flag indicator
     userDefaults.set(true, forKey: "hasRunBefore")
}

* обратите внимание, что функция synchronize () устарела

28 голосов
/ 19 апреля 2011

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

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

26 голосов
/ 24 октября 2015

Для тех, кто ищет 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
    }
7 голосов
/ 02 марта 2018

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);
        }
5 голосов
/ 09 мая 2018

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

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}
5 голосов
/ 14 сентября 2013

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

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

3 голосов
/ 21 февраля 2017

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

...