-3

AddressBook へのアクセスが必要な iOS 6 でアプリケーションを開発しています。次のコードを使用しています。

NSMutableArray *contacts = [[NSMutableArray alloc]init];
CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
if (error)
{NSLog(@"ERROR!!!");}
NSArray *arrayOfPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

しかし、実際のデバイスではarrayOfPeopleは空です...なぜこれが起こっているのですか? PS アドレスブックへのすべてのアクセスが許可されます

4

1 に答える 1

8

まず、出発点として適切な形式でコードを書き直します。

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 つの理由です)。

于 2013-05-15T17:23:47.337 に答える