2015-10-22 32 views
0

我們正在使用CNContactStore從iphone獲取聯繫人,但是我們正在從我的iPhone獲取所有聯繫人,這些聯繫人也提供所有同步的聯繫人,如Facebook和其他Gmail聯繫人,但我只需要獲取存儲在iphone中的聯繫人。如何做到這一點,請幫助我擺脫這一點。聯繫徵詢問題

+0

任何人都有關於上述問題的知識 – Vetri

+0

如果你看'[store containersMatchingPredicate:nil error:&error]',你會得到多個命中(即,一個用於FB,一個用於Gmail等)?如果是這樣,你可以使用'predicateForContactsInContainerWithIdentifier:'來獲取感興趣的容器的聯繫人。 – Rob

回答

0

進口這些

#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 


- (void) fetchContactsFromDevice { 

//1 
CFErrorRef error = NULL; 
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 

if (addressBook != nil) { 

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 

     if (error) { 
      NSLog(@"ABAddressBookRequestAccessWithCompletion error: %@", CFBridgingRelease(error)); 
     } 

     if (granted) { 
      // if they gave you permission, then just carry on 

      [self listPeopleInAddressBook:addressBook]; 
     } else { 
      // however, if they didn't give you permission, handle it gracefully, for example... 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       // BTW, this is not on the main thread, so dispatch UI updates back to the main queue 

       [[[UIAlertView alloc] initWithTitle:nil message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 
      }); 
     } 

     CFRelease(addressBook); 

    }); 

} else { 

    NSLog(@"Error reading Address Book : %@", error); 
} 

}

這種方法將幫助你在只讀取通訊錄號碼

,然後用它來繪製

- (void)listPeopleInAddressBook:(ABAddressBookRef)addressBook { 

NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
NSInteger numberOfPeople = [allPeople count]; 

for (NSInteger i = 0; i < numberOfPeople; i++) { 
    ABRecordRef person = (__bridge ABRecordRef)allPeople[i]; 

    NSMutableDictionary * user = [[NSMutableDictionary alloc] init]; 

    NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); 
    NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); 

    [user setObject:firstName forKey:@"firstname"]; 
    [user setObject:lastName forKey:@"lastname"]; 


    ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); 

    CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumbers); 
    for (CFIndex i = 0; i < numberOfPhoneNumbers; i++) { 
     NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneNumbers, i)); 

     [user setObject:phoneNumber forKey:@"phoneNumbers"]; 
    } 

    CFRelease(phoneNumbers); 

    [self.contactDataArray addObject:user]; 
} 

[yourtable reloadData]; 

}

希望這會有所幫助

+0

他詢問了聯繫人框架,而不是AddressBook框架(除非需要支持較早的操作系統版本,否則不應使用該框架)。順便說一下,這段代碼看起來像我的代碼從另一個答案可疑:http://stackoverflow.com/a/23418263/1271826 – Rob

+0

我真的很抱歉,但這段代碼是從我的項目實施,但我知道這對他有幫助。 – Appi