2012-09-20 15 views
14

पता पुस्तिका से ई-मेल पते को प्रोग्रामेटिक रूप से पुनर्प्राप्त करने की मेरी विधि अब आईओएस 6 उपकरणों पर काम नहीं कर रही है। यह आईओएस 5 में काम करता है और विचित्र रूप से, अभी भी आईओएस 6 सिम्युलेटर में काम करता है। उपयोगकर्ताओं की पता पुस्तिका से प्रोग्रामेटिक रूप से संपर्क पुनर्प्राप्त करने का कोई नया तरीका है?आईओएस 6 पता पुस्तिका काम नहीं कर रही है?

ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

self.contacts = [[NSMutableArray alloc] init]; 

int contactIndex = 0; 
for (int i = 0; i < nPeople; i++) { 
    // Get the next address book record. 
    ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i);   

    // Get array of email addresses from address book record. 
    ABMultiValueRef emailMultiValue = ABRecordCopyValue(record, kABPersonEmailProperty); 
    NSArray *emailArray = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue); 

    [self.contacts addObject:emailArray]; 
} 

स्पष्टीकरण के लिए, उपरोक्त क्रैश नहीं होता है, यह केवल कोई परिणाम नहीं देता है। ABAddressBookCopyArrayOfAll लोग खाली हैं। धन्यवाद!

उत्तर

12

डिवाइस पर आईओएस 6 के रूप में संभवतः नए गोपनीयता नियंत्रण से संबंधित, एक ऐप उपयोगकर्ता के संपर्कों को उनकी अनुमति के बिना एक्सेस नहीं कर सकता है।

आईओएस 6.0 और बाद में, अगर फोन करने वाले पता पुस्तिका डेटाबेस के लिए पहुँच नहीं है:

• iOS 6.0 और बाद के खिलाफ लिंक किए गए एप्लिकेशन के लिए, इस समारोह NULL भेजता प्रलेखन से।

• आईओएस के पिछले संस्करण से जुड़े ऐप्स के लिए, यह फ़ंक्शन एक खाली पढ़ने-योग्य डेटाबेस देता है।

आपको अनुमति नहीं देखा है, तो चेतावनी आ ("SomeApp आपके संपर्कों तक पहुंच चाहते हैं"), यह प्रत्यक्ष पता पुस्तक एपीआई बस लगता है कि है कि वे पहुँच नहीं है और चुपचाप असफल संभव है ; आपको इसे ट्रिगर करने के लिए पताबुकयूआई फ्रेमवर्क से कुछ प्रदर्शित करना पड़ सकता है।

+2

हाँ, तुम सही हो। ABAddressBookRequestAccessWithCompletion() का उपयोग करने की आवश्यकता है। मैं यह कैसे जांच सकता हूं कि यह विधि मौजूद है या नहीं ( Keller

52

पिछड़े संगतता को संभालने के लिए मैंने एक सहायक वर्ग, AddressBookHelper बनाया। यहाँ हिम्मत कर रहे हैं: इस के साथ

-(BOOL)isABAddressBookCreateWithOptionsAvailable { 
    return &ABAddressBookCreateWithOptions != NULL; 
} 

-(void)loadContacts { 
    ABAddressBookRef addressBook; 
    if ([self isABAddressBookCreateWithOptionsAvailable]) { 
     CFErrorRef error = nil; 
     addressBook = ABAddressBookCreateWithOptions(NULL,&error); 
     ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
      // callback can occur in background, address book must be accessed on thread it was created on 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (error) { 
        [self.delegate addressBookHelperError:self]; 
       } else if (!granted) { 
        [self.delegate addressBookHelperDeniedAcess:self]; 
       } else { 
        // access granted 
        AddressBookUpdated(addressBook, nil, self); 
        CFRelease(addressBook); 
       } 
      }); 
     }); 
    } else { 
     // iOS 4/5 
     addressBook = ABAddressBookCreate(); 
     AddressBookUpdated(addressBook, NULL, self); 
     CFRelease(addressBook); 
    } 
} 

void AddressBookUpdated(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { 
    AddressBookHelper *helper = (AddressBookHelper *)context; 
    ABAddressBookRevert(addressBook); 
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 

    // process the contacts to return 
    NSArray *contacts = ...  

    [[helper delegate] addressBookHelper:helper finishedLoading:contacts]; 
}; 
+0

अपडेटेडः कुछ गायब 'CFRelease जोड़ा गया इस कोड में 'पता पुस्तिका' लीक करने से रोकने के लिए कॉल। –

+0

हाय, बस सोच रहा है कि क्यों dispatch_async() को कॉल करें? मैंने इसके बिना कोशिश की है और यह पूरी तरह से काम करता है, और पता पुस्तिका फिर से लोड होने पर भी मेरे यूआई को अवरुद्ध नहीं करता है। – jklp

+0

[प्रलेखन] (http://developer.apple.com/library/ios/Documentation/AddressBook/Reference/ABAddressBookRef_iPhoneOS/Reference/reference.html#//apple_ref/doc/uid/TP40007099-CH200-SW17) कहता है कि 'पूरा करने वाले हैंडलर को मनमाने ढंग से कतार में बुलाया जाता है। यदि आपका ऐप पूरे ऐप में एड्रेस बुक का उपयोग करता है, तो आप यह सुनिश्चित करने के लिए ज़िम्मेदार हैं कि सही पता थ्रेड-सुरक्षित ऑपरेशन सुनिश्चित करने के लिए उस एड्रेस बुक के सभी उपयोग को एक कतार में भेजा जाता है। 'परीक्षण में, मुझे कुछ दुर्घटनाएं थीं (याद नहीं कर सकती विवरण) जो थ्रेड सुरक्षा मुद्दों का सुझाव दिया, जो मुझे दस्तावेज़ों के लिए प्रेरित किया। –

12

प्रयास करें: पता पुस्तिका को पहुँच प्रदान किया जाना चाहिए इससे पहले कि यह पहुँच प्रोग्राम के रूप में हो सकता है। यहां मैं क्या कर रहा हूं।

#import <AddressBookUI/AddressBookUI.h> 

    // Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
     // First time access has been granted, add the contact 
     [self _addContactToAddressBook]; 
    }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
    // The user has previously given access, add the contact 
    [self _addContactToAddressBook]; 
    } 
    else { 
    // The user has previously denied access 
    // Send an alert telling user to change privacy setting in settings app 
    } 
0

शायद नई गोपनीयता नियंत्रण से संबंधित, iOS 6 के रूप में, डिवाइस पर, कोई एप्लिकेशन उनकी अनुमति के बिना उपयोगकर्ताओं के संपर्कों का उपयोग नहीं कर सकते हैं।

कोड:

-(void)addressBookValidation 
{ 



NSUserDefaults *prefs=[NSUserDefaults standardUserDefaults]; 
ABAddressBookRef addressbook = ABAddressBookCreate(); 
__block BOOL accessGranted = NO; 

if (ABAddressBookRequestAccessWithCompletion != NULL) 
{ 
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) 
    { 
     dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
     ABAddressBookRequestAccessWithCompletion(addressbook, ^(bool granted, CFErrorRef error) 
               { 
                accessGranted = granted; 
                dispatch_semaphore_signal(sema); 
               }); 
     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
     dispatch_release(sema); 
    } 
    else if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) 
    { 
     accessGranted = YES; 
    } 
    else if (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusDenied) 
    { 
     accessGranted = NO; 
    } 
    else if (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusRestricted){ 
     accessGranted = NO; 
    } 
    else 
    { 
     accessGranted = YES; 
    } 


} 
else 
{ 
    accessGranted = YES; 
} 
[prefs setBool:accessGranted forKey:@"addressBook"]; 

NSLog(@"[prefs boolForKey:@'addressBook']--->%d",[prefs boolForKey:@"addressBook"]); 
[prefs synchronize]; 
CFRelease(addressbook); 
} 
संबंधित मुद्दे