una puedo nueva eliminar desinstalar desde definitivamente con como borrar apps app aplicaciones actualizacion ios objective-c keychain

ios - puedo - eliminar aplicaciones iphone 7



Eliminar elementos de llavero cuando se desinstala una aplicaciĆ³n (8)

Estoy usando el código scifihifi-iphone de idandersen para el llavero y guardo la contraseña usando

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

Cuando elimino 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?


Este parece ser el comportamiento predeterminado en iOS 10.3 basado en el comportamiento que las personas han estado presenciando en la versión beta # 2. No he encontrado ninguna documentación oficial sobre esto todavía, así que por favor comente si la tiene.


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 tiene que hacer es verificar si un archivo existe como lo primero que sucede en la application:didFinishLaunchingWithOptions: Después, cree el archivo incondicionalmente (incluso si es solo un archivo ficticio).

Si el archivo no existía en el momento de la verificación, sabe 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 el miembro delegado de su aplicación.


No hay un activador para realizar el 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á acceder a esta información en el llavero.

No ayuda con su objetivo de eliminar la contraseña en el llavero cuando el usuario elimina la aplicación del dispositivo, pero le debe dar cierta seguridad de que no se puede acceder a la contraseña (solo desde una reinstalación de la aplicación original).


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


Para los usuarios que buscan una versión Swift 3.0 de la 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 }


Puede aprovechar el hecho de que NSUserDefaults se borra al desinstalar 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 verifica y establece una clave / valor "FirstRun" en NSUserDefaults en la primera ejecución de su aplicación si aún no está establecida. 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 de "FirstRun" se mantenga inmediatamente en caso de que el usuario elimine la aplicación manualmente antes de que el sistema la persista.


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

... y para borrar los registros del llavero (TODO comentar arriba)

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


La respuesta de @amro traducida a Swift 4.0:

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