iOS通信录iOS9,8,7

````ios

原文连接 :http://www.jianshu.com/p/64951a543efc 数据库

实现相似京东地址编辑时选取通信录后获得电话和名字.这里将分别实现iOS7,8,9,但愿对你有帮助,如有帮助请点喜欢,如有疑问请评论,让我看到你的双手谢谢.原创文章---lzc.
先说iOS9:导入#import <ContactsUI/ContactsUI.h>
实现CNContactPickerDelegate协议方法.编程

//让用户给权限,没有的话会被拒的各位 CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; if (status == CNAuthorizationStatusNotDetermined) { CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error) { NSLog(@"weishouquan "); }else { NSLog(@"chenggong ");//用户给权限了 CNContactPickerViewController * picker = [CNContactPickerViewController new]; picker.delegate = self; picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];//只显示手机号 [self presentViewController: picker animated:YES completion:nil]; } }]; } if (status == CNAuthorizationStatusAuthorized) {//有权限时 CNContactPickerViewController * picker = [CNContactPickerViewController new]; picker.delegate = self; picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey]; [self presentViewController: picker animated:YES completion:nil]; } else{ @"您未开启通信录权限,请前往设置中心开启"; }

authorizationStatusForEntityType:methods这个方法是CNContactStore的类方法,须要一个 CNEntityType 参数,返回值是受权获得的状态CNAuthorizationStatus,一共有四种,分别为:
NotDetermined:表示用户尚未容许或禁止访问通信录数据库。首次安装的应用软件处于这种状态。
Restricted:不只应用软件没法访问通信录数据,就连用户也没法经过设置修改受权状态。该状态是因为其余限制,也就是家长控制(parental control)所致使。
Denied:表示用户不容许访问通信录数据。只有用户才可以修改该状态。
Authorized:这是每一个应用软件指望获得的状态。在该状态下,应用软件能够随意访问通信录数据库,使用通信录数据执行操做。ide

咱们其实只须要判断受权状态是否为 CNAuthorizationStatusAuthorized 便可,若是是表示受权状态成功,不然失败,不容许访问通信录。
CNContactStore (至关于ABAddressBook)类以编程方式展现了联系人数据库,而且提供了许多实现不一样任务的方法,例如获取,保存或者更新记录,权限检查和权限请求,不少不少。
CNContact类(至关于ABRecordRef)展现一个单独的联系人记录,可是记住这个类的特性是不可变的。若是你想建立一个新的联系人记录或者更新一个已存在的联系人记录,你必须使用CNMutableContact类。ui

#pragma mark - 点击某个联系人的某个属性(property)时触发并返回该联系人属性(contactProperty)。 //只实现该方法时,能够进入到联系人详情页面(若是predicateForSelectionOfProperty属性没被设置或符合筛选条件,如不符合会触发默认操做,即打电话,发邮件等)。 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty { NSLog(@"%@",contactProperty); CNContact *contact = contactProperty.contact; NSLog(@"givenName: %@, familyName: %@", contact.givenName, contact.familyName); self.nameTextView.text = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName]; if (![contactProperty.value isKindOfClass:[CNPhoneNumber class]]) { [[HNPublicTool shareInstance] showHudErrorMessage:@"请选择11位手机号"]; return; } CNPhoneNumber *phoneNumber = contactProperty.value; NSString * Str = phoneNumber.stringValue; NSCharacterSet *setToRemove = [[ NSCharacterSet characterSetWithCharactersInString:@"0123456789"]invertedSet]; NSString *phoneStr = [[Str componentsSeparatedByCharactersInSet:setToRemove]componentsJoinedByString:@""]; if (phoneStr.length != 11) { [[HNPublicTool shareInstance] showHudErrorMessage:@"请选择11位手机号"]; } NSLog(@"-=-=%@",phoneStr); self.phoneTextView.text = phoneStr; }

未完待续,新技术资料较少,花了很多精力,谢谢帮助个人大神,博采众长,方得此篇...
更新以下
iOS7,8中,导入spa

import <AddressBookUI/AddressBookUI.h>,遵照协议并实现方法,略麻烦

ABPeoplePickerNavigationControllerDelegate代理

- (void)visitAddressBook {//受权 __weak typeof(self)weakSelf = self; ABAddressBookRef bookref = ABAddressBookCreateWithOptions(NULL, NULL); ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); /*kABAuthorizationStatusNotDetermined = 0, // 未进行受权选择 kABAuthorizationStatusRestricted, // 未受权,且用户没法更新,如家长控制状况下 kABAuthorizationStatusDenied, // 用户拒绝App使用 kABAuthorizationStatusAuthorized // 已受权,可以使用*/ if (status == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(bookref, ^(bool granted, CFErrorRef error) { if (error) { NSLog(@"受权错误"); } if (granted) { NSLog(@"受权chengg"); ABPeoplePickerNavigationController *peosonVC = [[ABPeoplePickerNavigationController alloc] init]; peosonVC.peoplePickerDelegate = weakSelf; peosonVC.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]]; [weakSelf presentViewController:peosonVC animated:YES completion:nil]; } }); } if (status == kABAuthorizationStatusAuthorized) { ABPeoplePickerNavigationController *peosonVC = [[ABPeoplePickerNavigationController alloc] init]; peosonVC.peoplePickerDelegate = weakSelf; peosonVC.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]]; [weakSelf presentViewController:peosonVC animated:YES completion:nil]; }else { @"您未开启通信录权限,请前往设置中心开启"]; } }
#pragma mark iOS7通信录代理方法 //取消选择 7上必须有,不然崩lzc,切记 - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { [peoplePicker dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { return YES; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { // 获取该联系人多重属性--电话号 ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty); // 获取该联系人的名字,简单属性,只需ABRecordCopyValue取一次值 ABMutableMultiValueRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty); NSString *firstname = (__bridge NSString *)(firstName); ABMutableMultiValueRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty); NSString *lastname = (__bridge NSString *)(lastName); // 获取点击的联系人的电话 NSLog(@"联系人名字 : %@%@",lastname,firstname); // 点击某个联系人电话后dismiss联系人控制器,并回调点击的数据 [self dismissViewControllerAnimated:YES completion:^{ // 从多重属性——电话号中取值,参数2是取点击的索引 NSString *aPhone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, ABMultiValueGetIndexForIdentifier(phoneMulti,identifier)) ; // 获取点击的联系人的电话,也能够取标签等 NSLog(@"联系人电话 : %@",aPhone); // 去掉电话号中的 "-" aPhone = [aPhone stringByReplacingOccurrencesOfString:@"-" withString:@"" ]; NSLog(@"去掉-号 : %@",aPhone); }]; return NO;//若是不返回NO,会有别的效果,但愿你动动手,我就不告诉你--LZC }

iOS8与7差异不大code

#pragma mark - ios8走这个 选中联系人的某个属性的时候调用 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { //与7同样,蝙蝠问题省略 }

/*(a)peoplePickerNavigationControllerDidCancel:当用户选择取消时调用这个方法,能够在这个方法里取消整个通信录页面的显示。component

(b)peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 当用户选择了通信录中某一个联系人时调用这个方法,能够在这里获取联系人的信息。若是但愿能够继续显示这个联系人更具体的信息,则return YES。不然取消整个通信录页面的显示并return NO。orm

(c)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier: 若是上一个方法返回的是YES,则会显示某一个联系人信息,若是选择了联系人的某一项纪录,就会调用这个方法,能够经过点击选择联系人的某一项信息。若是 但愿能够对选择的某一项纪录进行进一步操做,好比直接拨打电话或调用邮箱发送邮件,则return YES。不然取消整个通信录页面的显示并return NO。*/
未完持续,技术是一每天积累的,加油

````

相关文章
相关标签/搜索