ios之通讯录 ios9和ios10
来源:互联网 发布:北京警察网络联系 编辑:程序博客网 时间:2024/06/05 10:13
由于系统的通讯录在iOS9的时候提供了新的api,所以我们2种框架都使用。首先我们要导入框架
-
- #import <AddressBook/AddressBook.h>
- #import <AddressBookUI/AddressBookUI.h>
-
- #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;
-
- 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;
-
- NSLog(@"联系人:%@, 电话:%@",text1,text2);
- }];
- }
最后我们可以调用 [self JudgeAddressBookPower]; 就能简单的调用系统通讯录。
tips:如果要适配iOS 10,就必须在plist文件的Source code模式下添加
- <key>NSContactsUsageDescription</key>
- <string>App需要您的同意,才能访问通讯录</string>