iOS 手机通讯录,将电话保存到本机通讯录

原创 2015年11月18日 11:10:04

首先我们写一个单例,用于将电话保存到手机通讯录;
.h文件里面的内容,单例名为addressBookHelper,代码如下:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
enum {
    ABHelperCanNotConncetToAddressBook,
    ABHelperExistSpecificContact,
    ABHelperNotExistSpecificContact
};

typedef NSUInteger ABHelperCheckExistResultType;

@interface addressBookHelper : NSObject

// 添加联系人
// name     -> 联系人姓名
// phoneNum    -> 电话号码
// label    -> 电话号码的标签备注
+ (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label;

// 查询指定号码是否已存在于通讯录
// 返回值:
//  ABHelperCanNotConncetToAddressBook -> 连接通讯录失败(iOS6之后访问通讯录需要用户许可)
//  ABHelperExistSpecificContact    -> 号码已存在
//  ABHelperNotExistSpecificContact  -> 号码不存在
+ (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum;


@end

.m文件内容:

#import "addressBookHelper.h"
#import <AddressBook/AddressBook.h>


@implementation addressBookHelper

// 单列模式
+ (addressBookHelper*)shareControl
{
    static addressBookHelper *instance;
    @synchronized(self) {
        if(!instance) {
            instance = [[addressBookHelper alloc] init];
        }
    }
    return instance;
}

+ (BOOL)addContactName:(NSString *)name phoneNum:(NSString *)num withLabel:(NSString *)label
{
    return [[addressBookHelper shareControl] addContactName:name phoneNum:num withLabel:label];
}

// 添加联系人(联系人名称、号码、号码备注标签)
- (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label
{
    // 创建一条空的联系人
    ABRecordRef record = ABPersonCreate();
    CFErrorRef error;
    // 设置联系人的名字
    ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFTypeRef)name, &error);
    // 添加联系人电话号码以及该号码对应的标签名
    ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABPersonPhoneProperty);
    ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)num, (__bridge CFTypeRef)label, NULL);
    ABRecordSetValue(record, kABPersonPhoneProperty, multi, &error);

    ABAddressBookRef addressBook = nil;
    // 如果为iOS6以上系统,需要等待用户确认是否允许访问通讯录。
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
    {
        addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
        //等待同意后向下执行
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
                                                 {
                                                     dispatch_semaphore_signal(sema);
                                                 });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        //        dispatch_release(sema);
    }
    else
    {
        //        addressBook = ABAddressBookCreate();
        addressBook = ABAddressBookCreateWithOptions(NULL, (CFErrorRef *)&error);
    }

    // 将新建联系人记录添加如通讯录中
    BOOL success = ABAddressBookAddRecord(addressBook, record, &error);
    if (!success) {
        return NO;
    }else{

        // 如果添加记录成功,保存更新到通讯录数据库中
        success = ABAddressBookSave(addressBook, &error);
        return success ? YES : NO;
    }
}

+ (ABHelperCheckExistResultType)existPhone:(NSString *)phoneNum
{
    return [[addressBookHelper shareControl] existPhone:phoneNum];
}

// 指定号码是否已经存在
- (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum
{
    ABAddressBookRef addressBook = nil;
    CFErrorRef error;
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
    {
        addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
        //等待同意后向下执行
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
                                                 {
                                                     dispatch_semaphore_signal(sema);
                                                 });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        //        dispatch_release(sema);
    }
    else
    {
        //        addressBook = ABAddressBookCreate();
        addressBook = ABAddressBookCreateWithOptions(NULL, (CFErrorRef *)&error);
    }
    CFArrayRef records;
    if (addressBook) {
        // 获取通讯录中全部联系人
        records = ABAddressBookCopyArrayOfAllPeople(addressBook);
    }else{
#ifdef DEBUG
        NSLog(@"can not connect to address book");
#endif
        return ABHelperCanNotConncetToAddressBook;
    }

    // 遍历全部联系人,检查是否存在指定号码
    for (int i=0; i<CFArrayGetCount(records); i++) {
        ABRecordRef record = CFArrayGetValueAtIndex(records, i);
        CFTypeRef items = ABRecordCopyValue(record, kABPersonPhoneProperty);
        CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(items);
        if (phoneNums) {
            for (int j=0; j<CFArrayGetCount(phoneNums); j++) {
                NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
                if ([phone isEqualToString:phoneNum]) {
                    return ABHelperExistSpecificContact;
                }
            }
        }
    }

    CFRelease(addressBook);
    return ABHelperNotExistSpecificContact;
}

@end

单例写完之后我们直接在相应的对方调用即可,在对应的地方引入头文件#import “addressBookHelper.h”,然后点击按钮实现相对应的方法(我们这里的需求是能够保存到本机通讯录,并能够复制,直接拨打电话);

 UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                      initWithTitle:nil
                                      delegate:self
                                      cancelButtonTitle:@"取消"
                                      destructiveButtonTitle:[NSString stringWithFormat:@"拨打 %@",self.dic[@"mobile"]]
                                      otherButtonTitles:@"保存到手机通讯录", @"复制",nil];
        actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;

        [actionSheet showInView:self.view];

在代理方法里面写入你要的操作;

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
        [self callTelephpne];
    }else if (buttonIndex == 1) {
        [self saveTeleToAddBook];
    }else if(buttonIndex == 2) {
        [self copyTelephone];
    }else if(buttonIndex == 3) {
        [self cancleButton];
    }

}
//拨打电话
- (void)callTelephpne
{
    NSString * mobileStr =[NSString stringWithFormat:@"tel:%@",self.dic[@"mobile"]];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mobileStr]];
}
//将电话保存到通讯录
- (void)saveTeleToAddBook
{
    NSString *phone = self.dic[@"mobile"];

    if ([addressBookHelper existPhone:phone] == ABHelperExistSpecificContact)
    {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"消息提示" message:[NSString stringWithFormat:@"手机号码:%@已存在通讯录",phone] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    }
    else
    {
        if ([addressBookHelper addContactName:self.dic[@"name"] phoneNum:phone withLabel:@"电话"])
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"消息提示" message:@"添加到通讯录成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        };
    }

}
//点击复制按钮
- (void)copyTelephone
{
    UIPasteboard * pasteboard = [UIPasteboard generalPasteboard];
    [pasteboard setString:self.dic[@"mobile"]];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 保存到通讯录

在APP中我们有时候会用到保存手机电话到通讯录的功能,下面代码是实现该功能的DEMO 1第一步: 在工程设置的Build Phases中的Link Binary With Libraries里添加两个...
  • bitcser
  • bitcser
  • 2016年08月23日 11:43
  • 1256

iOS 7,8,9 通讯录的操作

1.获取通讯录的方法在其他的博客中都有,我主要写一些我当时没有查到的。 2.编辑联系人 注意:我的编辑联系人用的是ABNewPersonViewController,这样就可以省掉联系人简介这一步...

iOS 使用ContactsUI保存新联系人到系统通讯录

iOS 9 中已经不建议使用AddressBook来进行对系统通讯录的操作的,而是采用了新的库-ContactsUI.framework,通过它,我们可以访问系统通讯录,保存新的联系人,或者修改已有联...

iOS系统通讯录授权,获取,修改,创建联系人

1、现在的很多应用程序中都会设计到手机系统通讯录的问题,下面就简单介绍一下iOS系统通讯录的 2、iOS9之前的系统通讯录有2个框架,分别是AddressBookUI/AddressBookUI.h...

iOS通讯录增删改查

自己研究的一些基本操作,高手略过。。。

iOS导入手机通讯录

ABAddressBookRef addressBooks = nil;          if ([[UIDevice currentDevice].systemVersion f...
  • IT_ZGC
  • IT_ZGC
  • 2017年02月07日 14:48
  • 708

iOS9联系人保存详解

苹果在iOS9的SDK中废除了AddressBookUI.framework的一些功能(是不是这个库都废除了,有待验证),具体和保存联系人相关的几个系统界面如下: 联系人选择:AddressBook...
  • sun2728
  • sun2728
  • 2015年10月09日 11:04
  • 2417

CocoaPods安装经历

【前言】 都说CocoaPods工具非常棒,不但能帮你下载所需的第三方开源库,还能帮你管理并设置之间的依赖关系。 本打算安装一个学习学习,结果发现网上大家分享的文章区别很大,并且大家安装环境不同遇到的...
  • th_gsb
  • th_gsb
  • 2015年10月16日 15:04
  • 2468

iOS开发中如遇到频繁的Http请求,如何取消之前已经发送的Http请求?

我有一个TextField,无论什么时候当我输入字符的时候,我appending这个字符到我的url,然后发送一次请求,我现在 需要取消之前的请求。例如当我输入“shampoo”的时候,我会触发7次...

iOS开发获取手机通讯录中的电话号码和姓名

1、申请授权[objc] view plain copy print?#import “AppDelegate.h”  #import     @interface AppDelegate ()   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 手机通讯录,将电话保存到本机通讯录
举报原因:
原因补充:

(最多只允许输入30个字)