2012-10-10 11 views
44

私はアドレス帳を使用するアプリケーションを持っています。 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. はPrivacy->連絡先>設定に行き、
  2. アプリを終了し、アプリ内の連絡先へのアクセスを許可し、アプリケーションのための連絡先へのアクセスを無効にし、
  3. アプリがバックグラウンドで実行されている間、アプリ、
  4. を実行する設定に行き、アプリのための連絡先へのアクセスを可能にし、

アプリはすぐに例外情報や意味のあるスタックトレースなしでmain()の内部でクラッシュします。私は "すべての例外"と[NSException raise]ブレークポイントを有効にしようとしましたが、それ以上の情報を私に与えませんでした。

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

ここには何が起こっていますか?私が購読するべきコールバックがありますか?

+0

以下のrmaddyの回答ごとに、これはクラッシュではなく、iOSでアプリを終了しています。 –

+0

私にとっても同じ問題ですが、私のアプリのロケーション権限のためです:( –

答えて

72

私は自分のアプリでこれを見ました。私は他の人たちもこれを報告しているのを見ました。私はこれが慎重な行動であると確信しています。 OSは、プライバシーのアクセス許可の変更に対応するバックグラウンドアプリを強制終了します。 Appleはこれに対して猛烈なアプローチを取ったようだ。これはクラッシュではありません(ただし、デバッガで実行中に表示されることがあります)。アプリはさまざまな理由で終了します。これを理由のリストに追加します。これにより、アプリを完全に再起動したときにアプリの状態を回復する良い仕事をする理由が増えました。

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

+2

iOS 7.0.3の写真セキュリティ設定で、Appleの代わりに論理的だと思われますが、ここには苦情はありません!セキュリティアップデートのためにアプリがクラッシュする前に、バックグラウンドコードを実行してデータを保存する方法を知っていますか? –

+2

iOS 7.0.3でのマイクのセキュリティ設定 – Pavan

+1

iOS 7カレンダー関連のアプリでも同じように動作します。Xcodeのデバッグやシミュレータではなく、デバイスでアプリを実行すると、アプリが再起動してユーザーに見えなくなるだから、rmaddyが言っているように、あなたのアプリが「完全な再起動時にアプリの状態を復元する良い仕事」をしていることを確認してください。 – leanne

-1

通常、アプリケーションが中断されなくなったとき、AppDelegateからapplication:didEnterForegroundを呼び出す必要があります。私の意見では、それはあなたのアドレス帳のアクセス許可を再調整するのに良い場所になります。

+0

私の意見では、アプリケーションがこれらのデータを使用する必要がある瞬間にアクセス許可を要求することです(例えば、特定の画面を入力するときなど)。 –

関連する問題