2012-10-23 11 views
6

मेरे कोड में मैं व्यक्ति चुनने के लिए ABPeoplePickerNavigationController का उपयोग करता हूं। मैं संपर्क बनाया है, यह करने के लिए फ़ोन नंबर जोड़ते हैं और मेरे कोड का परीक्षण कियाआईओएस 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.... 
} 

: संपर्क सूची से उपयोगकर्ता चयनित व्यक्ति के बाद, मैं अगर निर्दिष्ट व्यक्ति के रिकॉर्ड किसी भी फोन नंबर है देखो। आईओएस 5 में यह कोड अच्छी तरह से काम करता है। फोन चर एक फोन नंबर है।

लेकिन आईओएस 6 में, फेसबुक खाते से संपर्क जोड़ने के बाद, फ़ोन चर में कोई मान नहीं है।

फेसबुक खाते के साथ संपर्क को अनलिंक करने के बाद सब कुछ ठीक से काम करता है।

मैं इस विधि के व्यक्तिगत फ़ोन नंबर कैसे पढ़ सकता हूं?

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

युपीडी

तो मैं ऊपर समारोह में हाँ लौटने के लिए, तो समारोह

(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));