46

アドレス帳を使用するアプリがあります。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]が、それ以上の情報は得られませんでした。

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

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

4

2 に答える 2

76

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

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

于 2012-10-10T01:31:31.100 に答える
-2

通常、アプリケーションが一時停止から復帰すると、AppDelegate から application:didEnterForeground を呼び出す必要があります。私の意見では、アドレス帳のアクセス許可を再調整するのに適した場所です。

于 2012-10-10T01:27:40.610 に答える