通讯录(无界面)

#import "AppDelegate.h"

#import <AddressBook/AddressBook.h>

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

/*

kABAuthorizationStatusNotDetermined = 0, 没有决定是否授权

kABAuthorizationStatusRestricted,  受限制

kABAuthorizationStatusDenied,  拒绝

kABAuthorizationStatusAuthorized  授权

*/

//1.需要申请授权

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {

ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);

ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {

if (granted == YES) {

NSLog(@"授权成功!");

}else{

NSLog(@"授权失败");

}

});

}

return YES;

}

#import "ViewController.h"

#import <AddressBook/AddressBook.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

}

//2.获取数据

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

//1.创建一个通讯录

ABAddressBookRef book =   ABAddressBookCreateWithOptions(NULL, NULL);

//获取所有联系人 其实就是记录 ABMultiValueRef record(记录)

CFArrayRef  multiValue  =  ABAddressBookCopyArrayOfAllPeople(book);

CFIndex count = CFArrayGetCount(multiValue);

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

ABRecordRef record =   CFArrayGetValueAtIndex(multiValue, i);

//姓名

CFStringRef first = ABRecordCopyValue(record, kABPersonFirstNameProperty);

CFStringRef last = ABRecordCopyValue(record, kABPersonLastNameProperty);

NSString *firstStr = (__bridge_transfer  NSString *)(first);

NSString *lastStr = (__bridge_transfer  NSString *)(last);

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

//电话号码

ABMultiValueRef  multiPhones =   ABRecordCopyValue(record, kABPersonPhoneProperty);

CFIndex countPhone =  ABMultiValueGetCount(multiPhones);

for (CFIndex j = 0; j < countPhone; ++j) {

CFStringRef phone =  ABMultiValueCopyValueAtIndex(multiPhones, j);

NSString *phoneStr = (__bridge_transfer NSString *)phone;

NSLog(@"phone = %@",phoneStr);

}

CFRelease(multiPhones);

}

CFRelease(multiValue);

CFRelease(book);

}

iOS-通讯录(无界面)的更多相关文章

  1. 【新手--android日记】实现IOS风格电话界面

    [前言--新手日记] 开始学习android开发,通过做一个通讯录练习,打算实现各种自己想实现的功能. 新手作品,技术含量很浅.主要是记录自己的学习过程. 纯学习之用,求评论,求建议,求教导. [正题 ...

  2. Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端

    Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端 本文同步更新地址: https://dotnet9.com/11520.html https:// ...

  3. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  4. iOS通讯录整合,兼容iOS789写法,附demo

    苹果的通讯录功能在iOS7,iOS8,iOS9 都有着一定的不同,iOS7和8用的是 <AddressBookUI/AddressBookUI.h> ,但是两个系统版本的代理方法有一些变化 ...

  5. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  6. selenium2支持无界面操作(HtmlUnit和PhantomJs)

    selenium2支持无界面操作(HtmlUnit和PhantomJs) selenium2支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaD ...

  7. iOS 通讯录空格

    iOS 通讯录联系人出现 ASCII 码值为 160 的空格  NOTE:       这里的"空格"是指 在通讯录中取出的联系人中带有特殊空格 带有特殊空格的字符串 " ...

  8. Jenkins构建自动化脚本执行无界面解决方法

    场景: jenkins构建selenium自动化用例的时候,会有jenkins自带服务后台运行自动化脚本,可无界面运行IE.Chrome.Firefox. 然而运行IE浏览器时候(IE比较特殊),Je ...

  9. 批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务

    windows(win10)批处理脚本 打开vm虚拟机的服务,并且开启无界面虚拟机 @echo off net start "vds" net start "VMAuth ...

随机推荐

  1. 【laravel5.*】运行 php artisan --version报错:PHP Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$' in /www/web/crm/artisan on line 31

    1. 出现以上问题 是因为 php版本低于5.6, 因为我系统原有的默认php是5.3,装laravel的php是指定的5.6.21版本,所以在执行 laravel对应的php artisan . p ...

  2. Utils--封装好的下载图片的方法

    /** * 封装下载图片方法 * @param url 下载地址 * @param filename * @return 下载成功为true */ public boolean downfile(St ...

  3. Swift 导航栏设置图片点击事件,图片蓝色的解决方案

    如果导航栏想做一个点击事件,正好是一个图片 我们可以直接这样: self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIIm ...

  4. Vue.js——60分钟快速入门 开发· webpack 中文文档

    转载于:http://www.cnblogs.com/keepfool/p/5619070.html http://www.css88.com/doc/webpack2/guides/get-star ...

  5. java的几个format

    public static String formatDateToString(long date) { SimpleDateFormat formatter = new SimpleDateForm ...

  6. 兼容各大浏览器的event获取

    event: //得到事件 function getEvent(evt){ if (evt && typeof(evt) != "undefined") { var ...

  7. 《JAVA与模式》之迭代器模式

    定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: public static void main(String[] args) { List< ...

  8. win8 应用商店程序使用SQLITE数据库

    http://www.cnblogs.com/zhuzhenyu/archive/2012/11/27/2790193.html using SQLite; using System; using S ...

  9. C++的std::string的“读时也拷贝”技术!

    C++的std::string的读时也拷贝技术! 嘿嘿,你没有看错,我也没有写错,是读时也拷贝技术.什么?我的错,你之前听说写过时才拷贝,嗯,不错的确有这门技术,英文是Copy On Write,简写 ...

  10. php-fpm进程关闭与重启脚本详解

    先来理解一下什么是php-fpm PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的. PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将 ...