2012-10-10 13 views
44

Ho un'app che utilizza la Rubrica. Quando è in esecuzione in iOS 6, esegue questo codice quando l'utente esegue qualcosa che richiede l'accesso alla Rubrica.L'app si è bloccata in iOS 6 quando l'utente cambia i permessi di accesso ai contatti

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) 
{ 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) 
    { 
     if (granted) 
     { 
      showContactChooser(); 
     } 
    }); 

    CFRelease(addressBookRef); 
} 
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) 
{ 
    showContactChooser(); 
} 
else 
{ 
    showAccessDeniedAlert(); 
} 

Questo funziona perfettamente: sono in grado di leggere le informazioni dei contatti e quando l'utente negato l'accesso, l'applicazione reagisce di conseguenza.

Tuttavia, se l'utente:

  1. Consente Contatti accesso in app,
  2. si chiude l'applicazione,
  3. Goes su Impostazioni-> Privacy-> Contatti e disabilita Contatti di accesso per l'applicazione,
  4. esegue l'applicazione,
  5. Mentre l'applicazione è in esecuzione in background va a impostazioni e consente l'accesso di contatto per l'applicazione,

l'app si arresta immediatamente all'interno di main() senza alcuna eccezione o una significativa traccia di stack. Ho provato ad attivare "tutte le eccezioni" e il punto di interruzione [NSException raise], ma questo non mi ha dato ulteriori informazioni.

L'arresto anomalo può essere riprodotto anche se l'applicazione non esegue il codice sopra durante il lancio.

Cosa sta succedendo qui? C'è una richiamata a cui dovrei iscrivermi?

+0

Come da risposta di rmaddy in basso, questo non è un crash, è iOS che termina l'app. –

+0

Stesso problema anche per me, ma è per l'autorizzazione di posizione per la mia app :( –

risposta

72

L'ho visto nella mia app. E ho visto anche altri segnalare questo. Sono abbastanza sicuro che questo è un comportamento deliberato. Il sistema operativo uccide tutte le app in background che reagiscono ai cambiamenti nelle autorizzazioni della privacy. Sembra che Apple abbia preso un approccio maldestro a questo. Non è un crash (sebbene possa apparire così durante l'esecuzione nel debugger). Le app vengono interrotte per vari altri motivi. Aggiungi questo alla lista dei motivi. Questo ci dà più motivi per fare un buon lavoro ripristinando lo stato delle app al riavvio completo delle nostre app.

Si noti che questo comportamento si applica a tutte le varie impostazioni sulla privacy come contatti, foto, microfono, calendario e fotocamera.

+2

con le impostazioni di sicurezza delle foto su iOS 7.0.3. Sembra logico per conto di Apple, nessun reclamo qui! Qualcuno conosce un modo per eseguire codice di background per salvare alcuni dati prima che l'app si arresti in modo anomalo a causa di aggiornamenti di sicurezza? –

+2

verificato, questo accade anche con il impostazioni di sicurezza del microfono in iOS 7.0.3. – Pavan

+1

Funziona allo stesso modo in app iOS correlate al calendario 7. Se si esegue l'app sul dispositivo, NON tramite il debug o il simulatore Xcode, si vedrà che l'app si riavvia, invisibile all'utente Quindi, come dice rmaddy, assicurati che l'app esegua "un buon lavoro per ripristinare lo stato delle app al riavvio completo ..." – leanne

-1

In genere, quando un'applicazione viene sospesa, deve chiamare l'applicazione: didEnterForeground dal tuo AppDelegate. Secondo me, sarebbe un buon posto per riadattare le autorizzazioni della tua rubrica.

+0

A mio parere, la best practice consiste nel richiedere le autorizzazioni nel momento in cui l'app deve utilizzare questi dati (ad esempio quando si entra in una determinata schermata) –

Problemi correlati