web-dev-qa-db-ja.com

ユーザーが連絡先のアクセス許可を変更すると、iOS 6でアプリがクラッシュしました

アドレス帳を使用するアプリがあります。 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();
}
_

これは完全に機能します。連絡先情報を読み取ることができ、ユーザーがアクセスを拒否すると、アプリはそれに応じて反応します。

ただし、ユーザーが次の場合:

  1. アプリで連絡先へのアクセスを許可します
  2. アプリを終了し、
  3. [設定]-> [プライバシー]-> [連絡先]に移動し、アプリの連絡先アクセスを無効にします。
  4. アプリを実行し、
  5. アプリがバックグラウンドで実行されている間、設定に移動してアプリの連絡先アクセスを有効にします。

アプリはmain()内ですぐにクラッシュし、例外情報や意味のあるスタックトレースはありません。 「すべての例外」と_[NSException raise]_ブレークポイントをオンにしてみましたが、それ以上の情報は得られませんでした。

アプリが起動中に上記のコードを実行しなくても、クラッシュは再現できます。

ここで何が起こっているのですか?サブスクライブする必要があるコールバックはありますか?

46
Alexey Blinov

私は自分のアプリでこれを見てきました。そして、他の人もこれを報告しているのを見てきました。これは意図的な動作であると確信しています。 OSは、プライバシー権限の変更に反応するバックグラウンドアプリをすべて強制終了します。 Appleはこれに大槌のアプローチをとったようです。クラッシュではありません(デバッガで実行しているときに表示される可能性があります)。アプリは他のさまざまな理由で終了します。これをリストに追加してくださいこれにより、アプリを完全に再起動したときにアプリの状態を正常に復元できるようになります。

この動作は、連絡先、写真、マイク、カレンダー、カメラなど、さまざまなプライバシー設定のすべてに適用されることに注意してください。

76
rmaddy