iOS调用系统通讯录(适配iOS9、iOS10)
2016-09-22 17:38
176 查看
由于系统的通讯录在iOS9的时候提供了新的api,所以我们2种框架都使用。首先我们要导入框架
接着在需要调用通讯录的vc里面添加一下代码
最后我们可以调用 [self
JudgeAddressBookPower]; 就能简单的调用系统通讯录。
tips:如果要适配iOS 10,就必须在plist文件的Source code模式下添加
/// iOS 9前的框架 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> /// iOS 9的新框架 #import <ContactsUI/ContactsUI.h>
#define Is_up_Ios_9 ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0
@interface ViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate,CNContactPickerDelegate>
接着在需要调用通讯录的vc里面添加一下代码
#pragma mark ---- 调用系统通讯录 - (void)JudgeAddressBookPower { ///获取通讯录权限,调用系统通讯录 [self CheckAddressBookAuthorization:^(bool isAuthorized , bool isUp_ios_9) { if (isAuthorized) { [self callAddressBook:isUp_ios_9]; }else { NSLog(@"请到设置>隐私>通讯录打开本应用的权限设置"); } }]; } - (void)CheckAddressBookAuthorization:(void (^)(bool isAuthorized , bool isUp_ios_9))block { if (Is_up_Ios_9) { CNContactStore * contactStore = [[CNContactStore alloc]init]; if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) { [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * __nullable error) { if (error) { NSLog(@"Error: %@", error); } else if (!granted) { block(NO,YES); } else { block(YES,YES); } }]; } else if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized){ block(YES,YES); } else { NSLog(@"请到设置>隐私>通讯录打开本应用的权限设置"); } }else { ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus(); if (authStatus == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { dispatch_async(dispatch_get_main_queue(), ^{ if (error) { NSLog(@"Error: %@", (__bridge NSError *)error); } else if (!granted) { block(NO,NO); } else { block(YES,NO); } }); }); }else if (authStatus == kABAuthorizationStatusAuthorized) { block(YES,NO); }else { NSLog(@"请到设置>隐私>通讯录打开本应用的权限设置"); } } } - (void)callAddressBook:(BOOL)isUp_ios_9 { if (isUp_ios_9) { CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init]; contactPicker.delegate = self; contactPicker.displayedPropertyKeys = @[CNContactPhoneNumbersKey]; [self presentViewController:contactPicker animated:YES completion:nil]; }else { ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; peoplePicker.peoplePickerDelegate = self; [self presentViewController:peoplePicker animated:YES completion:nil]; } } #pragma mark -- CNContactPickerDelegate - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty { CNPhoneNumber *phoneNumber = (CNPhoneNumber *)contactProperty.value; [self dismissViewControllerAnimated:YES completion:^{ /// 联系人 NSString *text1 = [NSString stringWithFormat:@"%@%@",contactProperty.contact.familyName,contactProperty.contact.givenName]; /// 电话 NSString *text2 = phoneNumber.stringValue; // text2 = [text2 stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"联系人:%@, 电话:%@",text1,text2); }]; } #pragma mark -- ABPeoplePickerNavigationControllerDelegate - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef valuesRef = ABRecordCopyValue(person, kABPersonPhoneProperty); CFIndex index = ABMultiValueGetIndexForIdentifier(valuesRef,identifier); CFStringRef value = ABMultiValueCopyValueAtIndex(valuesRef,index); CFStringRef anFullName = ABRecordCopyCompositeName(person); [self dismissViewControllerAnimated:YES completion:^{ /// 联系人 NSString *text1 = [NSString stringWithFormat:@"%@",anFullName]; /// 电话 NSString *text2 = (__bridge NSString*)value; // text2 = [text2 stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSLog(@"联系人:%@, 电话:%@",text1,text2); }]; }
最后我们可以调用 [self
JudgeAddressBookPower]; 就能简单的调用系统通讯录。
tips:如果要适配iOS 10,就必须在plist文件的Source code模式下添加
<key>NSContactsUsageDescription</key> <string>App需要您的同意,才能访问通讯录</string>
相关文章推荐
- iOS开发--调用系统通讯录界面
- iOS开发调用系统通讯录获取电话号码
- iOS调用系统通讯录
- iOS---iOS10适配iOS当前所有系统的远程推送
- iOS 采用@available(iOS 11.0, *)适配 iOS11,会引起调用系统相册时,系统界面上移问题
- iOS调用系统通讯录获取姓名电话号码(转)
- ios调用系统通讯录
- iOS --调用系统通讯录
- iOS 调用系统相关功能(本机信息,手电筒,电话,短信,通讯录,内存,电池,亮度)
- iOS 调用系统自带的通讯录
- iOS9如何调用系统通讯录
- iOS开发iOS9.0调用系统通讯录
- ios之通讯录 ios9和ios10
- iOS调用系统的通讯录界面获取用户信息
- iOS 调用系统通讯录获取姓名电话号码
- iOS调用系统通讯录获取姓名电话号码
- ios 调用系统通讯录
- iOS 调用系统通讯录 获取联系人信息
- [iOS 10 适配问题] 整合iOS10系统的适配相关内容
- iOS 获取通讯录以及调用系统通讯录UI