まず、出発点として適切な形式でコードを書き直します。
CFErrorRef error = nil; // no asterisk
ABAddressBookRef addressBook =
ABAddressBookCreateWithOptions(NULL, &error); // indirection
if (!addressBook) // test the result, not the error
{
NSLog(@"ERROR!!!");
return; // bail
}
CFArrayRef arrayOfPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSLog(@"%@", arrayOfPeople); // let's see how we did
次に、問題の実際の原因は次のとおりです。アクセスできません。ある時点で、ABAddressBookRequestAccessWithCompletion
アクセスを確保するために電話する必要があります。この呼び出しは非同期であるため、別の呼び出しから、または完了ハンドラーで人の配列を取得する必要があることに注意してください。
ドキュメントは、アクセスがない場合は NULL になることを暗示しているようですが、アクセスが不明な場合はそうではありません。代わりに、役に立たない空の読み取り専用アドレス データベースを取得します。したがって、アクセス権があることを確認する唯一の方法は、 で明示的にチェックすることABAddressBookGetAuthorizationStatus
であり、アクセス アラートの要求を表示する唯一の方法は、 を呼び出すことABAddressBookRequestAccessWithCompletion
です。
これは、iOS 6.1 の新しい動作である可能性があります。iOS 6.0 のことを覚えている方法ではないことは確かです。
これと同じ問題は、シミュレーターでは自動的にアクセスが許可されるため発生しません (かなり非現実的です。この種のことをデバイスでのみテストするもう 1 つの理由です)。