2011-01-20 9 views
181

estoy usando idandersen's scifihifi-iphone código para llavero y guardar la contraseña utilizandoEliminar elementos y estaran en cuando una aplicación se desinstala

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

Al eliminar la aplicación del dispositivo, la contraseña permanece en el llavero.

Quiero eliminar la contraseña del llavero cuando el usuario elimina la aplicación del dispositivo. ¿Cómo puedo hacer esto?

+10

Debido a que su código no se ejecuta cuando se está eliminando su aplicación, no tengo forma de hacer esto. –

+1

Creo que puede eliminar un elemento de llavero solo desde dentro de la aplicación, pero no antes de desinstalarlo. Puede echar un vistazo al método deleteItem de SFHFKeychainUtils para eliminar un nombre de usuario o contraseña del llavero. – matteodv

Respuesta

330

Puede aprovechar que NSUserDefaultses autorizado por la desinstalación de una aplicación. Por ejemplo:

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

Esto comprueba y establece una clave "FirstRun"/valor en NSUserDefaults en la primera ejecución de la aplicación si no está ya establecido. Hay un comentario donde debes poner código para eliminar valores del llavero. Se puede llamar a Synchronize para asegurarse de que la clave/valor "FirstRun" se conserva inmediatamente en caso de que el usuario elimine la aplicación manualmente antes de que el sistema la persista.

+0

Gracias por esta pista. – iOSAppDev

+0

Estoy de acuerdo con Amro en que puede eliminar/purgar su llavero al ejecutar por primera vez la aplicación. Esto borrará todo lo que se estableció antes de que la aplicación se desinstalara la última vez. Hice esto para una de mis aplicaciones que almacena credenciales de Facebook/Twitter y ha funcionado bastante bien sabiendo que solo tu aplicación tiene acceso a cualquier llavero que se haya configurado. – XCool

+2

NSUserDefaults no se borran cuando el usuario abandona la aplicación manualmente. Solo se perderán los valores que haya configurado, pero el sistema (periódicamente) o aún no se haya sincronizado con el disco (al llamar a '' 'synchronize'''). Es una buena idea llamar a sincronizar después de configurar la primera tecla de ejecución. Y sí, NSUserDefaults se borran cuando se restablece un dispositivo (y no se restaura desde la copia de seguridad), y eso está bien en este caso. – Amro

24

No hay ningún desencadenador para realizar código cuando la aplicación se elimina del dispositivo. El acceso al llavero depende del perfil de aprovisionamiento que se utiliza para firmar la aplicación. Por lo tanto, ninguna otra aplicación podría acceder a esta información en el llavero.

No ayuda con el objetivo de eliminar la contraseña en el llavero cuando el usuario elimina la aplicación del dispositivo, pero debe darle cierta comodidad de que la contraseña no es accesible (solo a partir de una reinstalación de la aplicación original)

5

Los archivos se eliminarán del directorio de documentos de su aplicación cuando el usuario desinstale la aplicación. Sabiendo esto, todo lo que tienes que hacer es verificar si existe un archivo como lo primero que ocurre en application:didFinishLaunchingWithOptions:. Después, cree incondicionalmente el archivo (incluso si es solo un archivo ficticio).

Si el archivo no existía en el momento de la comprobación, sabrá que esta es la primera ejecución desde la última instalación. Si necesita saber más adelante en la aplicación, guarde el resultado booleano en su miembro delegado de la aplicación.

22

Para aquellos que buscan una versión Swift de respuesta de @ 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

Para los usuarios que buscan un Swift versión 3.0 de respuesta de @ 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

Este parece ser el comportamiento predeterminado en iOS 10.3 basado en el comportamiento people have been witnessing en la versión beta 2. Aún no he encontrado ninguna documentación oficial sobre esto, así que por favor coméntalo si es así.

+4

Hasta la versión beta 5 supongo que el lanzamiento público de iOS 10.3 ** no contiene ** este cambio. –

0

C# Xamarin versión

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

... y para borrar los registros de la llavero (TODO comentario anterior)

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