2012-10-10 8 views
44

Mam aplikację korzystającą z książki adresowej. Podczas działania w systemie iOS 6 uruchamia ten kod, gdy użytkownik robi coś, co wymaga dostępu do książki adresowej.Aplikacja uległa awarii w systemie iOS 6 po zmianie użytkownika Uprawnienia dostępu do kontaktów

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

Działa to doskonale: Jestem w stanie odczytać informacji i kontaktów, gdy użytkownik odmawia dostępu, aplikacja reaguje odpowiednio.

Jednakże, jeśli użytkownik:

  1. pozwala Kontakt dostępu w aplikacji,
  2. Zamyka aplikację,
  3. Przejście do Ustawienia-> polityką prywatnością> Kontakty i wyłącza Kontakt dostęp do aplikacji,
  4. Uruchamia aplikację
  5. Podczas gdy aplikacja jest uruchomiona w tle przechodzi do ustawień i umożliwia dostęp do kontaktu z aplikacji

aplikacja natychmiast zawiesza wewnątrz main() bez informacji wyjątek lub znaczącego śladu stosu. Próbowałem włączyć punkt przerwania "wszystkie wyjątki" i [NSException raise], ale to nie dało mi więcej informacji.

Wypadek może być powielana nawet jeśli aplikacja nie działa powyższy kod podczas startu.

Co się tutaj dzieje? Czy istnieje połączenie zwrotne, które powinienem subskrybować?

+0

Zgodnie z odpowiedzią udzieloną poniżej przez rmaddy, to nie jest awaria, to iOS kończy aplikację. –

+0

sam problem dla mnie, ale to dla lokalizacji zgodę na moim app :( –

Odpowiedz

72

Widziałem to w moim app. I widziałem, że inni też to zgłaszają. Jestem prawie pewien, że jest to celowe zachowanie. System operacyjny zabija aplikacje działające w tle, które reagują na zmiany w uprawnieniach prywatności. Wydaje się, że Apple podchodzi do tego młotem. To nie jest awaria (choć może się tak zdarzyć podczas działania w debugerze). Aplikacje kończą się z różnych innych powodów. Dodaj to do listy powodów. Daje nam to więcej powodów, aby wykonać dobrą robotę przywracając stan aplikacji po pełnym uruchomieniu naszych aplikacji.

Należy pamiętać, że takie zachowanie ma zastosowanie do wszystkich różnych ustawieniach prywatności takich jak kontakty, zdjęcia, mikrofon, kalendarza i kamery.

+2

Zweryfikowane to także dzieje z ustawieniami bezpieczeństwa zdjęć w systemie iOS 7.0.3 Wydaje się logiczne w imieniu Apple, nie ma tutaj żadnych skarg! Czy ktoś wie, jak uruchomić kod w tle, aby zapisać niektóre dane, zanim aplikacja ulegnie awarii z powodu aktualizacji zabezpieczeń? –

+2

Zweryfikowany, dzieje się tak również w przypadku ustawienia zabezpieczeń mikrofonu w iOS 7.0.3. – Pavan

+1

Działa to samo w aplikacjach związanych z Kalendarzem iOS 7. Jeśli uruchomisz aplikację na urządzeniu, NIE przez Xcode debugowanie lub symulator, zobaczysz, że aplikacja uruchomi się ponownie, niewidoczna dla użytkownika Tak więc, jak mówi rmaddy, upewnij się, że Twoja aplikacja "przywraca stan aplikacji po pełnym uruchomieniu ..." – leanne

-1

Zwykle, gdy aplikacja wraca z zawieszenia, należy zadzwonić do aplikacji: didEnterForeground z AppDelegate. Moim zdaniem byłoby to dobre miejsce do dostosowania uprawnień do książki adresowej.

+0

Moim zdaniem najlepszym rozwiązaniem jest uprawnieniami żądanie moment aplikacja musi korzystać z tych danych (np. Przy wejściu pewną ekran). –

Powiązane problemy