昨天学习iOS中访问用户通信录的一个框架AddressBookUI.framework,这是个自带UI界面的系统框架,第一次访问要获得用户的授权.
因为是已经封装好的所以,用起来也比较方便
- 导入框架
#import <AddressBookUI/AddressBookUI.h> - 创建控制器
ABPeoplePickerNavigationController *Vc = [[ABPeoplePickerNavigationController alloc] init];
- 设置控制器为代理,监听通信录控制器弹出后用户的点击操作
Vc.peoplePickerDelegate = self;
- 弹出
[self presentViewController:Vc animated:YES completion:nil];
ABPeoplePickerNavigationControllerDelegate代理协议中,有两个方法可以监听用户点击操作的方法
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
这两个方法的区别在于:第一个方法是监听到用户点击了某个联系人时就会调用,并自动关闭页面;第二个在于点击了某个具体联系人后会自动跳转到对应联系人的详情页面,在点击具体属性时便会调用,这个方法会把这个property值传递过来,拿到这个值就可以具体获取一些具体信息了. 点击右上角的 Cancel按钮后会将 modal出来的界面关闭,同时调用cancel方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
以上效果均是在iOS9.2模拟器上测试的结果
为了测试真机,我将部署版本改成了 iOS7.1之后运行在我的4S老爷机上之后,发现这两个方法不调用,而且 modal 出来的控制器也关闭不了 =.=
google了一下,发现原来- (void)peoplePickerNavigationController:peoplePicker didSelectPerson:和- (void)peoplePickerNavigationController:peoplePicker didSelectPerson: property: identifier:这两个方法,是从 iOS8之后才有用的,而 iOS7及以前都是要用- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:和- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:这两个方法,和iOS8之后的两个方法类似,只是iOS8之后过期了.
所以如果要适配更低的版本时,这两个过期的方法还是非常必要的.同时在 iOS7中- (void)peoplePickerNavigationControllerDidCancel:方法也是要自己手动弹出控制器.iOS8之后会自动弹出,所以为了适配,保证iOS7-iOS9均有效,手动 dismiss 掉.
###参考 iOS访问通讯录开发读取联系人信息