iOS开发之系统通讯录
end5
9年前
@iOS调用操作通讯录所用的库文件
AddressBook.framework
AddressBookUI.framework
#import "HMTMainViewController.h" #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> @interface HMTMainViewController ()<ABPeoplePickerNavigationControllerDelegate> @property (nonatomic,strong) ABPeoplePickerNavigationController *personPickVC; @property (nonatomic,strong) UIWebView *phoneCallWebView; @end @implementation HMTMainViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.navigationItem.title = @"系统通讯录"; // self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"删除" style:UIBarButtonItemStylePlain target:self action:@selector(didClickDeletePersonAction)]; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(100, 70, 120, 40); [button setTitle:@"选择联系人" forState:UIControlStateNormal]; [button addTarget:self action:@selector(didClickSelectAction) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } - (void)didClickSelectAction{ // 选择电话薄的联系人 self.personPickVC = [[ABPeoplePickerNavigationController alloc] init]; _personPickVC.peoplePickerDelegate = self; _personPickVC.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]]; [self deletePerson]; [self presentViewController:_personPickVC animated:YES completion:NULL]; //[self.navigationController pushViewController:[_personPickVC.viewControllers objectAtIndex:0] animated:YES]; //[self getAllPerson]; } // 进入选择联系人界面 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{ // 选中联系人后,就退出,并返回想要的属性 [peoplePicker dismissViewControllerAnimated:YES completion:^{ NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); NSLog(@"person = %@",firstName); ABMultiValueRef phones = ABRecordCopyValue(person,kABPersonPhoneProperty); for (int i = 0; i < ABMultiValueGetCount(phones); i++) { NSString *phone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, i)); NSLog(@"telephone = %@",phone); } }]; return YES; } - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{ [peoplePicker dismissViewControllerAnimated:YES completion:^{ }]; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{ return YES; } // 展示所有联系人 - (void)getAllPerson{ CFArrayRef allPerson = ABAddressBookCopyArrayOfAllPeople(self.personPickVC.addressBook); for (id person in ((__bridge NSArray *)allPerson)) { NSString *firstName = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty); NSLog(@"firstName = %@",firstName); // 因为一个用户可能有多个电话,所以需要循环调取 ABMultiValueRef phones = ABRecordCopyValue((__bridge ABRecordRef)person,kABPersonPhoneProperty); for (int i = 0; i < ABMultiValueGetCount(phones); i++) { NSString *phone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, i)); NSLog(@"telephone = %@",phone); } } } // 添加联系人 - (void)addPerson{ ABAddressBookRef addressBook = self.personPickVC.addressBook; ABRecordRef person = ABPersonCreate(); ABRecordSetValue(person, kABPersonFirstNameProperty, @"胡", nil); ABRecordSetValue(person, kABPersonLastNameProperty, @"明涛", nil); ABMutableMultiValueRef mulRef = ABMultiValueCreateMutable(kABStringPropertyType); for (int i = 0; i < 1; i++) { ABMultiValueIdentifier mutableIdentifier; ABMultiValueAddValueAndLabel(mulRef, @"18690231234", nil, &mutableIdentifier); } ABRecordSetValue(person, kABPersonPhoneProperty, mulRef, nil); ABAddressBookAddRecord(addressBook, person, nil); ABAddressBookSave(addressBook, nil); } // 删除联系人 - (void)deletePerson{ CFArrayRef allPerson = ABAddressBookCopyArrayOfAllPeople(self.personPickVC.addressBook); for (id person in (__bridge NSArray *)allPerson) { NSString *firstName = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty); if ([firstName isEqualToString:@"胡"]) { ABAddressBookRemoveRecord(self.personPickVC.addressBook, (__bridge ABRecordRef)person, nil); } } ABAddressBookSave(self.personPickVC.addressBook, nil); } // 拨打电话 - (void)dialPhoneNumber:(NSString *)phoneNumber{ // 1.UIWebView加载电话 NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",phoneNumber]]; self.phoneCallWebView = [[UIWebView alloc] initWithFrame:CGRectZero]; [self.phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]]; // 2.私有方法 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"]]; }
@有的时候,我们按上诉方法访问通讯录无效,这是因为,iOS6之后加强了对通讯录的访问,要求我们显示的申请去访问通讯录,加上如下几句代码就OK了:
CFErrorRef *error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); // Request authorization to Address Book if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { // First time access has been granted, add the contact //[self _addContactToAddressBook]; } else { // User denied access // Display an alert telling user the contact could not be added } }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // The user has previously given access, add the contact //[self _addContactToAddressBook]; } else { // The user has previously denied access // Send an alert telling user to change privacy setting in settings app }