iOS Contacts framework 通讯录新框架,取代AddressBook

Contacts框架

刚刚查了一下,iOS 9系统的市场份额大概占到了80%左右,所以如果你能够说服老板放弃剩下的20%左右的用户的话(我感觉老板不会被你忽悠),你现在就可以只使用Contacts这个新框架了,否则的话就还是乖乖的用AddressBook吧,或者通过判断系统版本号来适配不同的手机。

好吧,现在开始进入正题,这个新框架中将要使用最多的应该就是CNContactStore这个类了,官方对其的定义是一个线程安全的,用来执行查询和修改操作的类。此外官方还针对于这个类的使用给出了几点小建议。

1.只去查询那些你需要的联系人属性。
2.当查询所有联系人并缓存结果时,首先查询所有联系人的identifier,然后通过identifier来查询所需要的详细的联系人信息。
3.想取出多个联系人信息时,可以先收集联系人的唯一identifier,然后通过identifier来查询所需要的详细的联系人信息。
4.如果缓存了联系人信息,那么当接收到CNContactStoreDidChangeNotification时你需要刷新数据。
5.CNContactStore的查询方法中执行了I/O操作,所以应该避免在主线程中执行。

在项目中,首先我们可以调用授权状态的查询方法来确定应用的授权状态。

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

NotDetermined:这个状态说明用户暂未决定是否允许访问联系人数据库。当应用第一次安装在设备上时将处于此状态。
Restricted:这个状态说明应用不仅不能够访问联系人数据,并且用户也不能在设置中改变这个状态。这个状态是某些被激活的限制所导致的(比如说家长控制)。
Denied:这个状态说明用户不允许应用访问联系人数据。这个状态只能够被用户改变。
Authorized:这个状态是所有应用都希望拥有的,这表明应用能够自由访问联系人数据库,然后根据联系人数据来处理某些任务。
授权状态一共是上面的四种,我们需要分别对不同的授权状态来做出相应的操作。首先如果是Authorized的话,那么一切好说,接下来直接进行相应的通讯录操作就好了,而如果是NotDetermined的话,就调用一下请求授权的方法(下面会详细说明),至于剩下的两个方法,则只能弹窗提示用户去设置里面修改权限了。

那么接下来,我们假设调用上面的方法,得到的结果是NotDetermined,我们就需要调用下面的方法来请求授权,如果用户不同意,那就弹窗问他,不给我通讯录授权我怎么服务你啊(在这点上脉脉做的比较狠😄)。

    CNContactStore *store = [[CNContactStore alloc] init];
    [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
        
    }];

如果顺利的话,到这里我们就已经拿到用户的授权了,那么接下来就可以读取用户数据了。首先,我们需要创建一个
CNContactFetchRequest对象。这里简单说一下
predicate和keysToFetch这两个参数,其中的predicate谓词参数,必须是由CNContact+Predicates生成的。至于keysToFetch参数,个人理解是由两部分组成的,其中一部分可以去CNContact.h的最下面查,另一部分可以查询CNContactFormatter.h。下面是我写的一小段示例代码:

CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey]];
    
    NSError *error = nil;
    self.array = [NSMutableArray array];
    [store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        [self.array addObject:contact];
    }];

如果没什么意外情况的话,所需要的通讯录信息都已经存在这个数组里面了,需要注意的是这个方法的结果不是一次性返回的,这个可以通过监控stop参数来确定。(此外就是在这里我有一个疑问,希望理解的同学帮我解释一下。我在官方文档中看到一种说法就是其实只要调用查询方法,系统就会自动去请求授权。所以我对上面提到的那个请求授权的方法的调用时机不是完全的理解)。

那么最后,当我们获取到通讯录信息之后,可能会将数据暂存下来,这样就涉及到了一个数据刷新的问题,这个问题可以通过添加
CNContactStoreDidChangeNotification监听来解决,需要注意的是这个监听的响应次数是和通讯录中修改信息的条数相匹配的,所以一定要做好相应的处理。

到这里简单的获取通讯录信息功能应该实现了,最后说一下iOS8之后是可以直接从应用内跳转到设置页面来修改通讯录权限的,所以还是做一下系统适配的好,不然也许用户嫌麻烦就不去自己改了。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

最后是作者唠叨时间,感谢大家对我的支持,尤其是上一篇文章大家对我的肯定,还是老样子,如果大家感觉对你有一定的帮助,就关注加喜欢吧,就当是小小满足一下我的虚荣心,我们一起进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容