2012-11-07 5 views
0

특정 기기에서 iOS 6의 사용자 주소록에 액세스하는 데 문제가 있습니다. 이상하게도 내 장치에서 테스트 할 때 작동합니다.iOS 6에서 ABAddressBook을 가져올 수 없습니다 (개인 정보 보호 프롬프트가없는 경우 데이터베이스가 반환됩니다)

앱이 사용자에게 주소록에 액세스하라는 메시지를 표시하지 않으며 내 앱이 설정 -> 개인 정보 -> 주소록 (내 기기에 있음)에 표시되지 않습니다.

내 코드는 다음과 같습니다. 내가 잘못하고있는 것을 알려주십시오.

- (void)addressBookWithCompletion:(void (^)(NSArray *addressBook, NSError *error))completion { 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 
    dispatch_async(queue, ^{ 
     CFErrorRef error = NULL; 
     ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 
     ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
      if (error || !granted) { 
       NSLog(@"%@", error); 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        completion(nil, (__bridge NSError *)(error)); 
       }); 
      } else { 
       CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook); 
       // ... do stuff ... 
       CFRelease(addressBook); 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        completion(arrayOfContacts, nil); 
       }); 
      } 
     }); 
    }); 
} 

답변

1

모든 것을 백그라운드 대기열로 보내지 않을 것입니다. // ... do stuff ... 내부의 내용이 느린 경우 작업해야하는 연락처의 정보를 포함하는 NSObject-Sublasses를 작성한 다음 백그라운드 대기열에서 더 복잡한 작업을 수행하도록 파견합니다 (예 : 서버에 디스크에 쓰기) ...

+0

감사합니다. 나는 'dispatch_queue's를 제거하여 문제를 해결했습니다. 불행히도 주소록의 모든 연락처를 통해 루핑이 메인 스레드를 차단하는 문제가 발생하지만, 그 점을 좀 더 자세히 살펴보아야 할 것입니다. :) – runmad