蘋果官方文檔,用的是Swift https://developer.apple.com/library/ios/documentation/Contacts/Reference/Contacts_Framework/index.html#//apple_ref/doc/uid/TP40015328html
這裏記錄一下本身的使用狀況,僅做記錄,還有不少不清楚的地方。ios
CNContactStore 個人理解是存儲了全部聯繫人的一個類,有向用戶發送受權請求的對象方法數組
requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error)app
請求受權成功granted = 1,不然返回error。測試
獲取全部聯繫人:ui
1. 對象store調用 enumerateContactsWithFetchRequest: request error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) 能夠得到全部聯繫人(這裏有問題,詳見下面),這裏的request 是 CNContactFetchRequest 的對象,能夠經過 initWithKeysToFetch 對象方法來建立,後面的數組是你所須要的key,能夠在CNContact類的最下面找到。特別的,對於姓名,你能夠用一長串的 key:CNContactNamePrefixKey,CNContactNameSuffixKey,CNContactMiddleNameKey,CNContactFamilyNameKey 等等,也能夠經過CNContactFormatter調用它的對象方法 descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName得到全名,把返 回的結果做爲一個key放在initWithKeysToFetch後面的數組裏spa
。線程
2. block裏返回的CNContact基本已是咱們所須要的聯繫人,裏面的familyName,GivenName就很少說,關鍵是 phoneNumbers這個屬性,是一個數組,裏面的元素是CNLabeledValue類型的對象,坑爹的來了,這個類有一個ValueType的屬 性,經過class方法才獲知實際上是CNPhoneNumber類型,經過stringValue能夠得到咱們須要的電話號碼字符串(後來又看了一下官方 文檔,這裏的valueType,能夠是字符串,能夠是CNMutablePostalAddress,也能夠是CNPhoneNumber)。而 CNLabeledValue的label屬性能夠是聯繫人電話號碼的類型 CNLabelPhoneNumberMobile,CNLabelPhoneNumberiPhone等,也能夠是郵箱地址類型CNLabelHome 等等orm
注意:我一開始把最下面的得到全部聯繫人的方法寫在了受權方法裏,結果出現了線程阻塞的問題,後來我把受權方法刪掉(即再也不受權,模擬器上測試的app刪掉從新跑),也能讀到聯繫人,不知道這裏到底應該怎麼作,但願有了解的大神指導。htm
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"%d",granted);
}];
下面貼一下本身測試的代碼,僅僅是獲取聯繫人的姓名和電話
====================================下面是實際的代碼=======================================
CNContactStore *store = [[CNContactStore alloc]init];
NSError *error = nil;
CNContactFetchRequest *request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey,CNContactFamilyNameKey,CNContactPhoneNumbersKey]];
NSMutableArray *dataSource = [NSMutableArray array];
[store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
NSString *name = [NSString stringWithFormat:@"%@ %@",contact.givenName,contact.familyName];//名字
NSString *phone = [NSString string];
for (CNLabeledValue *value in contact.phoneNumbers) {
if ([value.label isEqualToString:@"_$!<Mobile>!$_"]) {
CNPhoneNumber *phoneNum = value.value;
phone = phoneNum.stringValue; //電話
}
}
}];
添加,刪除,修改聯繫人等等待補充。