2012-11-14 5 views
5

ABAddressBookGetPersonCount가 -1을 반환하는 상황에 처해 있습니다. 테스터는 주소록에 연락처가 있는지 확인합니다. 모든 핸드셋은 iOS 6.0.1을 실행 중입니다.ABAddressBookGetPersonCount는 iOS에서 -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 인 것을 나타내는 문서를 찾을 수 없습니다. 나는 그것이 어떤 종류의 오류라고 가정하고 있지만, 무엇?

답변

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의를 지원해야하는 경우

.

+0

사용자가 아직 앱을 처음 시작할 때 개인 정보 보호 프롬프트에서 옵션을 탭하지 않은 경우 iOS 6에서도 -1이 표시됩니다. 이 경우 ABAddressBookCreateWithOptions는 유효한 주소록을 반환하지만 ABAddressBookGetPersonCount는 -1을 반환합니다. 사용자가 액세스를 허용하거나 거부하면 ABAddressBookCreateWithOptions가 실제 주소록 또는 null을 반환합니다. 사용자가 액세스 권한을 부여했는지 여부를 감지하기 위해 -1 반환을 사용하고 있습니다. – Nicholas

+1

@Nicholas 확인하는 적절한 방법은'ABAddressBookGetAuthorizationStatus' 함수를 호출하고 반환 값을 확인하는 것입니다. – rmaddy

+0

감사합니다. @rmaddy. 이전에 시도했지만 신뢰할 수있는 데이터를 얻을 수 없었습니다. 이제는 어떻게 작동하는지, 테스트하는 방법에 대해 더 많이 알게되었으므로 내가 알아야 할 것을 제공하는 것 같습니다. 그러나 ABAddressBookGetPersonCount의 -1에 대한 대답은 여전히 ​​유효합니다. 문서화되지는 않았지만 ABAddressBookGetAuthorizationStatus가 kABAuthorizationStatusNotDetermined을 반환하면 -1이 반환된다는 것이 확실합니다. – Nicholas

관련 문제