iOS开发调用系统通讯录获取电话号码
来源:互联网 发布:球球霸屏软件 编辑:程序博客网 时间:2024/06/13 01:21
iOS开发中常会遇到获取手机号码的需求,而获取号码一般有两种,一种是全部一次性取出,自己写控件对其进行展示,另一种是直接掉用系统通讯录,从中选取号码。本文所讲的就是后者。因为系统的原因,用ios7,ios8,ios9调用的方式都有区别
#import <AddressBookUI/ABPeoplePickerNavigationController.h>
#import <AddressBook/ABPerson.h>
#import <AddressBookUI/ABPersonViewController.h>
#import <Contacts/Contacts.h>
#import <Contacts/ContactsDefines.h>
#import <ContactsUI/CNContactPickerViewController.h>
#import <ContactsUI/CNContactViewController.h>
#import <ContactsUI/ContactsUI.h>
协议
ABPeoplePickerNavigationControllerDelegate,CNContactPickerDelegate,CNContactViewControllerDelegate
//通讯录授权
- (BOOL)accessTheAddress
{
CFErrorRef *error = nil;
ABAddressBookRef addressBook =ABAddressBookCreateWithOptions(NULL, error);
__block BOOL accessGranted =NO;
if (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusNotDetermined){
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted,CFErrorRef error) {
accessGranted=granted;
if (error){
NSLog(@"Error: %@", (__bridgeNSError *)error);
}
else if (!granted)
{
}
else
{
accessGranted = YES;
}
});
}
elseif (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusAuthorized){
accessGranted=YES;
}
else
{
NSLog(@"用户未授权提示");
UIAlertView * alert = [[UIAlertViewalloc] initWithTitle:@"提示"message:@"您没有开启授权"delegate:self.vcrcancelButtonTitle:@"取消"otherButtonTitles:@"设置",nil];
[alert show];
}
return accessGranted;
}
获取通讯录里的号码
if (IAIOS9) {
CNContactPickerViewController * con = [[CNContactPickerViewControlleralloc]init];
con.delegate = self;
[self.vcrpresentViewController:con animated:YEScompletion:nil];
}
else{
ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationControlleralloc] init];
nav.peoplePickerDelegate =self;
if(IAIOS8){
nav.predicateForSelectionOfPerson = [NSPredicatepredicateWithValue:false];
}
[parentCtrl presentViewController:navanimated:animated completion:nil];
}
协议的回调方法
//获取电话号码(ios9以上)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
{
NSLog(@"%@",contactProperty.value);
CNPhoneNumber * str = contactProperty.value;
if ([str isKindOfClass:[CNPhoneNumberclass]]) {
NSString * phone = [str.stringValuestringByReplacingOccurrencesOfString:@"-"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@"("withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@")"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@" "withString:@""];
NSLog(@"%@", phone);
//返回电话号码
self.editPhone(phone);
}
else{
//返回电话号码
self.editPhone(@"");
}
[picker dismissViewControllerAnimated:YEScompletion:nil];
}
//获取电话号码(ios8)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
ABMultiValueRef phoneNumber =ABRecordCopyValue(person, kABPersonPhoneProperty);
long index = ABMultiValueGetIndexForIdentifier(phoneNumber,identifier);
NSString *phone = (__bridgeNSString *)ABMultiValueCopyValueAtIndex(phoneNumber, index);
if ([phone hasPrefix:@"+"]) {
phone = [phone substringFromIndex:3];
}
phone = [phone stringByReplacingOccurrencesOfString:@"-"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@"("withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@")"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@" "withString:@""];
NSLog(@"%@", phone);
//返回电话号码
self.editPhone(phone);
if (phoneNumber) {
[peoplePicker dismissViewControllerAnimated:YEScompletion:nil];
return;
}
}
//获取电话号码(ios7)
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
ABMultiValueRef phoneNumber =ABRecordCopyValue(person, kABPersonPhoneProperty);
long index = ABMultiValueGetIndexForIdentifier(phoneNumber,identifier);
NSString *phone = (__bridgeNSString *)ABMultiValueCopyValueAtIndex(phoneNumber, index);
if ([phone hasPrefix:@"+"]) {
phone = [phone substringFromIndex:3];
}
phone = [phone stringByReplacingOccurrencesOfString:@"-"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@"("withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@")"withString:@""];
phone = [phone stringByReplacingOccurrencesOfString:@" "withString:@""];
NSLog(@"%@", phone);
//返回电话号码
self.editPhone(phone);
if (phoneNumber) {//&& [ZXValidateHelper checkTel:phoneNO]
// phoneNum = phoneNO;
[peoplePicker dismissViewControllerAnimated:YEScompletion:nil];
return NO;
}
return YES;
}
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
{
ABPersonViewController *personViewController = [[ABPersonViewControlleralloc] init];
personViewController.displayedPerson = person;
[peoplePicker pushViewController:personViewControlleranimated:YES];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return YES;
}
//取消选择(ios9以上)
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker
{
[picker dismissViewControllerAnimated:YEScompletion:nil];
}
//取消选择(<=ios8)
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
[peoplePicker dismissViewControllerAnimated:YEScompletion:nil];
}
- iOS开发调用系统通讯录获取电话号码
- iOS调用系统通讯录获取姓名电话号码
- iOS 调用系统通讯录获取姓名电话号码
- iOS开发获取手机通讯录中的电话号码和姓名
- iOS开发获取手机通讯录中的电话号码和姓名
- iOS 调用系统通讯录 获取联系人信息
- iOS 获取通讯录以及调用系统通讯录UI
- iOS开发--调用系统通讯录界面
- iOS开发iOS9.0调用系统通讯录
- ios调用系统通讯录
- ios 调用系统通讯录
- iOS 获取系统通讯录
- iOS通讯录开发、获取
- iOS开发:通讯录获取
- iOS调用系统的通讯录界面获取用户信息
- iPhone程序调用系统通讯录选择单个电话号码
- iPhone程序调用系统通讯录选择单个电话号码
- IOS开发 获取手机通讯录
- git入门教程
- hdu 4864 Task【贪心】
- 数据库性能
- Java 日期格式是“Fri Feb 26 16:33:08 CST 2016”字符串类型,转date类型。java.util.date与sql.date的相互转换
- 修改Android Studio Build生成apk的默认名称
- iOS开发调用系统通讯录获取电话号码
- Unity获取场景gameobject的路径
- C#内部类
- iOS 面试问答之加密形式: AES加密, DES加密, MD5加密,SHA1加密, BASE64加密
- 表单serializeObject问题
- js参数中有回车时js不起作用
- Android 图片缓存之内存缓存技术LruCache,软引用
- python多线程编程以及join,setDaemon,线程锁的用法
- 回朔法和递归解决八皇后和跳马问题