アドレス帳を使用するアプリがあります。 iOS 6で実行する場合、ユーザーがアドレス帳へのアクセスを必要とする何かを実行すると、このコードが実行されます。
_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();
}
_
これは完全に機能します。連絡先情報を読み取ることができ、ユーザーがアクセスを拒否すると、アプリはそれに応じて反応します。
ただし、ユーザーが次の場合:
アプリはmain()
内ですぐにクラッシュし、例外情報や意味のあるスタックトレースはありません。 「すべての例外」と_[NSException raise]
_ブレークポイントをオンにしてみましたが、それ以上の情報は得られませんでした。
アプリが起動中に上記のコードを実行しなくても、クラッシュは再現できます。
ここで何が起こっているのですか?サブスクライブする必要があるコールバックはありますか?
私は自分のアプリでこれを見てきました。そして、他の人もこれを報告しているのを見てきました。これは意図的な動作であると確信しています。 OSは、プライバシー権限の変更に反応するバックグラウンドアプリをすべて強制終了します。 Appleはこれに大槌のアプローチをとったようです。クラッシュではありません(デバッガで実行しているときに表示される可能性があります)。アプリは他のさまざまな理由で終了します。これをリストに追加してくださいこれにより、アプリを完全に再起動したときにアプリの状態を正常に復元できるようになります。
この動作は、連絡先、写真、マイク、カレンダー、カメラなど、さまざまなプライバシー設定のすべてに適用されることに注意してください。