2012-10-23 43 views
6

在我的代码中,我使用ABPeoplePickerNavigationController来选择人员。用户选择从人的联系人列表后,我看,如果指定的个人记录有任何一个电话号码:iOS 6地址簿空kABPersonPhoneProperty

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 
     ABMutableMultiValueRef phones; 
     phones = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     if (phones == nil || ABMultiValueGetCount(phones) == 0) 
     { 
      return NO; 
     } 
     // other code.... 
} 

我创建的联系人,添加电话号码,并测试了我的代码。在iOS 5中,此代码运行良好。 电话变量包含一个电话号码。

但在iOS 6中,将联系人链接到Facebook帐户后,电话变量不包含任何值。

解除与facebook账户的联系后,一切都很顺利。

我怎样才能读取人的电话号码这种方法?

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 

UPD

如果我在函数返回YES上面,然后在功能

(BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 

我可以读正常方式,所有的人的电话号码。那么为什么我不能在第一个函数中读取它们呢?

+0

我认为这个教程将帮助你。 http://blog.slaunchaman.com/2009/01/21/cocoa-touch-tutorial-extract-address-book-address-values-on-iphone-os/ –

+0

具有相同的问题。任何进展? – aryehs

回答

9

我找到了我的问题的答案。 如果联系人链接,然后在方法

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 

您收到一个参考的人,这respesents链接接触。要检索所有电话号码,您需要获取所有链接的联系人,然后在该联系人中查找电话号码。 我做这个用下面的代码:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 

ABMutableMultiValueRef phones; 
phones = ABRecordCopyValue(person, kABPersonPhoneProperty); 
if (phones == nil || ABMultiValueGetCount(phones) == 0) 
{ 
    CFArrayRef linkedContacts = ABPersonCopyArrayOfAllLinkedPeople(person); 
    phones = ABMultiValueCreateMutable(kABPersonPhoneProperty); 
    ABMultiValueRef linkedPhones; 
    for (int i = 0; i < CFArrayGetCount(linkedContacts); i++) 
    { 
     ABRecordRef linkedContact = CFArrayGetValueAtIndex(linkedContacts, i); 
     linkedPhones = ABRecordCopyValue(linkedContact, kABPersonPhoneProperty); 
     if (linkedPhones != nil && ABMultiValueGetCount(linkedPhones) > 0) 
     { 
      for (int j = 0; j < ABMultiValueGetCount(linkedPhones); j++) 
      { 
       ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), NULL, NULL); 
      } 
     } 
     CFRelease(linkedPhones); 
    } 
    CFRelease(linkedContacts); 

    if (ABMultiValueGetCount(phones) == 0) 
    { 
     CFRelease(phones); 
     return NO; 
    } 
} 
// other code ... 

} 

与该代码我收到的所有电话号码联系接触。

+3

我很惊讶静态分析器没有突出显示此代码段中的所有泄漏。 – Abizern

0

在解决重:链接联系人您需要更改存储发现

ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), 
    ABMultiValueCopyLabelAtIndex(linkedPhones, j), NULL); 

,这样就可以使用“手机”,由标签后检查的电话号码就行了。给出的解决方案只是存储数字,所以你将无法测试像常量kABPersonPhoneMainLabel

这种方法也用于电子邮件和地址。对于地址你拿出这样的部分: -

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0); 
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));