46 votes

L'application plante dans iOS 6 lorsque l'utilisateur modifie les autorisations d'accès aux contacts

J'ai une application qui utilise le carnet d'adresses. Sous iOS 6, elle exécute ce code lorsque l'utilisateur fait quelque chose qui nécessite un accès au carnet d'adresses.

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

Cela fonctionne parfaitement : Je suis en mesure de lire les informations sur les contacts et lorsque l'utilisateur refuse l'accès, l'application réagit en conséquence.

Cependant, si l'utilisateur :

  1. Permet l'accès aux contacts dans l'application,
  2. Quitte l'application,
  3. Allez dans Paramètres->Privacy->Contacts et désactivez l'accès aux contacts pour l'application,
  4. Exécute l'application,
  5. Pendant que l'application fonctionne en arrière-plan, allez dans les paramètres et activez l'accès au contact pour l'application,

l'application se plante immédiatement à l'intérieur main() sans information sur les exceptions ni trace de pile significative. J'ai essayé d'activer la fonction "toutes les exceptions" et la fonction [NSException raise] point d'arrêt, mais cela ne m'a pas donné plus d'informations.

Le crash peut être reproduit même si l'application n'exécute pas le code ci-dessus pendant le lancement.

Qu'est-ce qui se passe ici ? Y a-t-il une fonction de rappel à laquelle je devrais m'abonner ?

76voto

rmaddy Points 79279

J'ai vu cela dans ma propre application. Et j'ai vu d'autres personnes le signaler également. Je suis presque sûr que c'est un comportement délibéré. Le système d'exploitation tue toutes les applications d'arrière-plan qui réagissent aux modifications des autorisations de confidentialité. Il semble qu'Apple ait adopté une approche brutale à ce sujet. Il ne s'agit pas d'un crash (bien que cela puisse sembler être le cas lors de l'exécution dans le débogueur). Les applications sont interrompues pour diverses autres raisons. Ajoutez ceci à la liste des raisons. Cela nous donne une raison supplémentaire de faire un bon travail de restauration de l'état des applications lors d'un redémarrage complet de nos applications.

Notez que ce comportement s'applique à tous les différents paramètres de confidentialité tels que les contacts, les photos, le microphone, le calendrier et l'appareil photo.

-1voto

Simon Germain Points 4212

En général, lorsqu'une application revient après avoir été suspendue, elle doit appeler application:didEnterForeground depuis votre AppDelegate. À mon avis, ce serait un bon endroit pour vous de réajuster les permissions de votre carnet d'adresses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X