2011-01-20 7 views
181

Я использую idandersen's scifihifi-iphone код брелка и сохранить пароль с помощьюУдалить брелок элементы, когда приложение будет удалено

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

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

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

+10

Поскольку ваш код не работает, когда приложение находится в процессе удаления, вам не имеют возможности сделать это. –

+1

Я думаю, что вы можете удалить элемент keychain только изнутри приложения, но не перед его удалением. Вы можете взглянуть на метод deleteItem SFHFKeychainUtils, чтобы удалить имя пользователя или пароль из брелка. – matteodv

ответ

330

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

+0

Спасибо за этот намек. – iOSAppDev

+0

Я согласен с Amro, что вы можете удалить/очистить брелок при первом запуске приложения. Это очистит все, что было установлено до того, как приложение будет удалено в последний раз. Я сделал это для одного из моих приложений, в котором хранятся учетные данные Facebook/Twitter, и он работает очень хорошо, зная тот факт, что только ваше приложение имеет доступ к любой цепочке ключей, которая была установлена. – XCool

+2

NSUserDefaults не удаляются, когда пользователь вручную покидает приложение. В этом случае теряются только те значения, которые вы установили, но либо система (периодически), либо вы еще не синхронизировались с диском (вызывая '' 'synchronize'''. Рекомендуется настроить синхронизацию после установки первой клавиши запуска. И да, NSUserDefaults очищаются, когда устройство сбрасывается (и не восстанавливается из резервной копии), и в этом случае все в порядке. – Amro

24

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

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

5

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

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

22

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

Для пользователей, которые ищут для 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 
} 
3

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

+4

Это было до бета-версии 5, я думаю, публичный релиз iOS 10.3 ** не содержит ** этого изменения. –

0

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); 
     } 
Смежные вопросы