5

ABAddressBookGetPersonCount が -1 を返す状況に陥っています。テスターは、連絡先がアドレス帳に存在することを保証します。すべてのハンドセットは iOS 6.0.1 を実行しています。

コードは次のとおりです。

NSMutableDictionary *myAddressBook = [[NSMutableDictionary alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people  = ABAddressBookCopyArrayOfAllPeople(addressBook);
int numEntries = ABAddressBookGetPersonCount(addressBook);
if (numEntries == 0)
{
    NSString *title = NSLocalizedString(@"error", nil);
    NSString *description =  NSLocalizedString(@"error_empty_contacts", nil);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                    message:description
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];


    return;
}

NSLog(@"emails: found %d", numEntries);

私のハンドセットではこれを再現できませんが、テスターは 3 つのハンドセットで試しました。iPhone 5 では正常に動作しますが、4 または 3 では動作しません。

-1 の値が何を意味するかを示すドキュメントが見つかりません。なんらかのエラーだと思いますが、何か?

4

1 に答える 1

3

iOS 6 では、このコードは無効です。アプリにアドレス帳へのアクセス許可があることを確認する必要があります。ほとんどの場合、-1 は、アプリがそれらのデバイスでアクセス許可を持っていない (またはアクセス許可の状態が不明) ことを示しています。

のドキュメントからABAddressBookRequestAccessCompletionHandler

CFErrorRef myError = NULL;
ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, &myError);
APLViewController * __weak weakSelf = self;  // avoid capturing self in the block
ABAddressBookRequestAccessWithCompletion(myAddressBook,
  ^(bool granted, CFErrorRef error) {
    if (granted) {
        NSArray *theSmiths = CFBridgingRelease(
          ABAddressBookCopyPeopleWithName(myAddressBook,
            CFSTR("Smith")
          )
        );
        weakSelf.numberOfSmiths = [theSmiths count];
    } else {
        // Handle the error
    }
});
CFRelease(myAddressBook);

iOS 5.x または 4.x をサポートする必要がある場合は、新しいメソッドの存在を適切に確認する必要があります。

于 2012-11-14T02:19:22.257 に答える