通讯录

iOS 8.0 无界面通讯录

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //获取授权
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    if (status ==kABAuthorizationStatusNotDetermined) {

        //创建通讯录对象
        ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);

        //授权回调
       ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {

           if (granted) {

               NSLog(@"成功");
           }else{
               NSLog(@"失败");
           }

       });

    }

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //创建通讯录
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    //获取所有联系人信息
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(book);

    CFIndex count = CFArrayGetCount(allPeople);

    for (CFIndex i = 0; i< count; i++) {
        //根据索引,获取一条联系人记录
        ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i);
        //获取用户电话(因为用户可以用多个电话, 也有多种类型的电话) ABMultiValueRef 是一个集合类型
        ABMultiValueRef mulitiValue =  ABRecordCopyValue(record, kABPersonPhoneProperty);

        //遍历集合
        for (CFIndex i = 0; i<ABMultiValueGetCount(mulitiValue); i++) {
            //根据索引获取电话
            CFStringRef str = ABMultiValueCopyValueAtIndex(mulitiValue, i);
            //(__bridge_transfer NSString *)str; 桥接, 让CF字符串 转为NSString 让ARC 进行管理
            NSString * phone = (__bridge_transfer NSString *)str;

            NSLog(@"%@" , phone);

        }

    }

}

iOS 8.0 有界面通讯录: 导入<AddressBookUI/AddressBookUI.h>

#import "ViewController.h"
#import <AddressBookUI/AddressBookUI.h>

@interface ViewController ()<ABPeoplePickerNavigationControllerDelegate>

@property(nonatomic ,strong) ABPeoplePickerNavigationController * picker;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     //实例化通讯录控制器
    ABPeoplePickerNavigationController * picker = [[ABPeoplePickerNavigationController alloc]init];

    //设置通讯录控制器的代理

    picker.peoplePickerDelegate = self;

    self.picker = picker;

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //modal控制器
    [self presentViewController:self.picker animated:YES completion:nil];

}

//如果实现peoplePickerNavigationController 那么property就无效, 就不执行
//- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0){
//    NSLog(@"didSelectPerson");
//
//
//    CFStringRef firstName =  ABRecordCopyValue(person, kABPersonFirstNameProperty);
//
//    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
//
//    NSString * firstStr = (__bridge_transfer NSString*)firstName;
//
//    NSString * lastStr = (__bridge_transfer NSString*)lastName;
//
//    NSLog(@"%@  ,%@ " ,firstStr , lastStr );
//
//
//
//    ABMultiValueRef multiValue = ABRecordCopyValue(person, kABPersonPhoneProperty);
//
//    CFIndex count =  ABMultiValueGetCount(multiValue);
//
//
//    for (CFIndex i = 0; i<count; i++) {
//
//        CFStringRef str = ABMultiValueCopyValueAtIndex(multiValue, i);
//
//        NSString * phone  = (__bridge_transfer NSString*)str;
//
//        NSLog(@"%@" , phone);
//
//    }

//}

// Called after a property has been selected by the user.(当选择通讯录属性时调用,也就是可以显示详情)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0){

    NSLog(@"property");

    //获取选择的属性  记住C语言的规则, 需要操作什么类型, 就拿到要操作的类型,使用Get Copy,来获取

    CFStringRef firstName =  ABRecordCopyValue(person, kABPersonFirstNameProperty);

    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

    NSString * firstStr = (__bridge_transfer NSString*)firstName;

    NSString * lastStr = (__bridge_transfer NSString*)lastName;

    NSLog(@"%@  ,%@ " ,firstStr , lastStr );

    ABMultiValueRef multiValue = ABRecordCopyValue(person, kABPersonPhoneProperty);

    CFIndex count =  ABMultiValueGetCount(multiValue);

    for (CFIndex i = 0; i<count; i++) {

        CFStringRef str = ABMultiValueCopyValueAtIndex(multiValue, i);

        NSString * phone  = (__bridge_transfer NSString*)str;

        NSLog(@"%@" , phone);

    }
    //判断选择的联系人是否设置电话,不为空才释放
    if(multiValue !=NULL){

        CFRelease(multiValue);
    }

}

// Called after the user has pressed cancel.
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    NSLog(@"peoplePickerNavigationControllerDidCancel");

}

iOS 9.0 无界面通讯录:   导入<Contacts/Contacts.h>

#import "ViewController.h"
#import <Contacts/Contacts.h>

@interface ViewController ()

@property(nonatomic ,strong) CNContactStore *store;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  //获取授权状态
    CNAuthorizationStatus  status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

    //创建通讯录仓库
    CNContactStore *store = [[CNContactStore alloc]init];

    self.store =store;

    //判断是否通过授权,未授权就请求授权
    if (status == CNAuthorizationStatusNotDetermined) {
        //请求授权
        [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

            if (granted) {

                NSLog(@"成功");
            }else{
                NSLog(@"失败");
            }

        }];

    }

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //获取通讯录(信息)请求
    CNContactFetchRequest * requser = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey , CNContactPhoneNumbersKey]];

    //遍历请求
    [self.store enumerateContactsWithFetchRequest:requser error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

        //contact 就是通讯录数据
        NSLog(@"%@" ,contact.givenName);

    }];

}

iOS 9.0 有界面通讯录 导入<ContactsUI/ContactsUI.h>

#import "ViewController.h"
#import <ContactsUI/ContactsUI.h>

@interface ViewController ()<CNContactPickerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //创建CNContactPickerViewController 控制器
    CNContactPickerViewController * picker = [[CNContactPickerViewController alloc]init];
    //设置代理
    picker.delegate = self ;

    //modal控制器
    [self presentViewController:picker animated:YES completion:nil];

}

//实现didSelectContact,那么didSelectContactProperty就不执行
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
    //contact 就是通讯录数据
    NSLog(@"%@" , contact.givenName);

//    NSLog(@"%@" , contact.phoneNumbers);
    for (CNLabeledValue * obj in contact.phoneNumbers) {

        CNPhoneNumber * num = obj.value;

        NSLog(@"%@  ,  %@"   , num.stringValue , obj.label);

    }

}

-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker{

}

//
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{

}

总结://获取选择的属性 记住C语言的规则, 需要操作什么类型, 就拿到要操作的类型,使用Get Copy,来获取,

注意:C语言 creat , copy 字样创建的对象,注意遵循谁创建,谁release

时间: 2024-11-15 06:38:54

通讯录的相关文章

ios-私人通讯录 页面间的跳转和传值

这个demo 有多个页面 并涉及顺传和逆传 而且还有一个第三方库的导入 来实现自定义提示消息的特效 利用代理来实现页面间的传值 一个页面代表一个controller 这次  ViewController  反而一句代码都没写 // // HMContact.h // 私人通讯录 // // Created by YaguangZhu on 15/9/6. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Fou

ObjectC----实现简单的通讯录(增删改查)

// Created By 郭仔 2015年04月09日21:27:50 经过两天的低迷,状态在慢慢的回归了,生活还要继续,人生还需奋斗! 祝:好人一生平安!!! ======================================================================== 题目描述: 1.创建AddressBook类. 1)使?用字典作为容器,字典的Key值为分组名(姓名?首字?母,?大写),value值为数组,数组 中存放联系?人(Person实例).(5分

C语言写郑州大学校友通讯录

1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define LEN sizeof(struct address_list) 5 6 /* 7 *************************通讯录结构体*********************************** 8 */ 9 10 struct address_list 11 { 12 char name[30]; /

Java企业微信开发_03_通讯录同步

一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通讯录. 获取通讯录密钥的目的: 通过企业ID(CorpId)和 通讯录密钥可以获取通讯录相关接口的使用凭证(AccessToken).有了AccessToken,就可以使用通讯录相关接口了. 凭证的获取方式有两种(此处暂时存疑,以待勘误): 通讯录AccessToken:CorpId+通讯录密钥 其

数据库连接学习--简单的通讯录

为了做毕业设计,学习了Java,然后就要连接数据库,为了连接数据库就学习做了一个简单的小项目,通讯录(现在只有添加的功能),成功连接数据库 首先看看我的WEB首页吧: 比较简单,然后是填加联系人页面 我的数据库连接的代码先抛出来,毕竟这是我做通讯录学习的重点, package s2.jsp.zhangxiao.dao; import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.ResultSet;

通讯录程序

#通讯录程序 print('|---欢迎进入通讯录程序---|') print('|---1:查询联系人资料---|') print('|---2:插入新的联系人---|') print('|---3:删除已有联系人---|') print('|---4:退出通讯录程序---|') address=dict() while True: print('请输入相关指令代码:',end='') enter=int(input()) if enter == 1: print('请输入姓名:',end='

C#通讯录——Windows Form Contact List

C#通讯录 Windows Form Contact List 主窗口 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste

通讯录--(适配iOS7/8/9)

导入库#import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> #pragma mark  点击 弹出通讯录 - (IBAction)contactClicked:(id)sender { //1. 创建联系人选择控制器 ABPeoplePickerNavigationController *picker = [ABPeoplePickerNavigationController new]

通讯录--(iOS9独有的方法)

导入库文件   #import <ContactsUI/ContactsUI.h> #pragma mark iOS9 新出的点击通讯录的获取信息的办法 #pragma mark - 先弹出联系人控制器 - (IBAction)ios9Clicked:(id)sender { // 1. 创建控制器 CNContactPickerViewController * picker = [CNContactPickerViewController new]; // 2. 设置代理 picker.de

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec