アドレス帳を使用するアプリがあります。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]
が、それ以上の情報は得られませんでした。
起動時にアプリが上記のコードを実行しなくても、クラッシュは再現できます。
ここで何が起こっているのですか?サブスクライブする必要があるコールバックはありますか?