iOS9中关于地址簿ABAddressBookXXX之类方法被废弃的解决

news/2024/7/24 2:19:58

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


在iOS9的SDK中我们会发现原来地址簿权限查询,获取以及创建之类的方法都被标记为废弃:

这里写图片描述

虽然仍然可以使用,但是谁也不愿意看到一大堆警告在眼前闪来闪去的的.

下面给出替换方法.

原来的API大家可以注意到都是以C函数给出的,Apple可能觉得这不怎么漂亮,所以他们重新设计了一个CNContactStore类来使其符合Objc类似的赶脚…你可以认为该类对应着iOS设备上地址簿实际存储的数据库.

那么原来的旧的的C方法如何转换为新的一系列方法呢?查看Apple官方的文档(如上图所示),只是简单标记这些方法为已废弃,但并没有给出替换方案,所以这里本猫抛砖引玉,来看看原来访问地址簿权限和申请权限的代码如何修改为新的方法.

首先我们给出原来方法的代码:

switch (ABAddressBookGetAuthorizationStatus()){ case kABAuthorizationStatusAuthorized:{
addressBook = ABAddressBookCreateWithOptions(NULL, &error); /* Do your work and once you are finished ... */
if (addressBook != NULL){
                    CFRelease(addressBook);
                }
break; }
case kABAuthorizationStatusDenied:{ [self displayMessage:kDenied]; break;
}
case kABAuthorizationStatusNotDetermined:{
addressBook = ABAddressBookCreateWithOptions(NULL, &error); ABAddressBookRequestAccessWithCompletion
(addressBook, ^(bool granted, CFErrorRef error) {
if (granted){
NSLog(@"Access was granted");
}else{
NSLog(@"Access was not granted");
}
if (addressBook != NULL){
                        CFRelease(addressBook);
                    }
});
break; }
case kABAuthorizationStatusRestricted:{ [self displayMessage:kRestricted]; break;
} }

然后是新方法的代码:

_contactStore = [CNContactStore new];
    // Override point for customization after application launch.
    switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]){
        case CNAuthorizationStatusAuthorized:
            NSLog(@"允许访问地址簿!");
            break;
        case CNAuthorizationStatusDenied:
        case CNAuthorizationStatusNotDetermined:
            [_contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted,NSError *error){
                if (granted) {
                    NSLog(@"你已允许访问地址薄!");
                }else{
                    NSLog(@"你不允许访问地址簿!");
                }
            }];
            break;
        default:
            NSLog(@"其他情况!");
    }

通过以上代码,可以看到新的逻辑变得更清晰了,更重要的是再也不用写C和Objc联姻的”四不像”代码了,虽然某些时候两者的联姻还是有些搞头的… ;)

关于地址簿新旧方法的进一步的内容,大家可以到以下blog观赏:

http://www.appcoda.com/ios-contacts-framework/


http://www.niftyadmin.cn/n/582367.html

相关文章

Forms验证时,图片无法显示的解决方案

当配置web.config身份验证如下时<System.web><authentication mode"Forms"><forms name".Web" defaultUrl"Default.aspx" loginUrl"Login.aspx" path"/" protection"All" timeout"600"&…

《实战:如何搭建一个完整的 Vue2.0 项目》- 2、vue.config.js 配置

构建项目时不会自动创建 vue.config.js 文件&#xff0c;需要在根目录下手动创建。插件 vue/clli-service 会自动加载。直接拷贝如下内容即可。 该文件很丰富&#xff0c;有很多配置项&#xff0c;可自行研究(链接)。这里只列了我的项目中常用的配置。 const webpack requir…

关于查找iOS中App路径时所要注意的一个问题

大熊猫猪侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途。同时,转载时不要移除本申明。 如产生任何纠纷,均…

qtp的插件oracle,QTP连接oracle操作方法

要从Oracle数据库&#xff0c;前提是已安装好Oracle客户端。然后在 Oracle Net Configuration Assistant 中完成以下配置&#xff1a;1. 监听程序配置&#xff0c;默认即可。2. 命名方法配置&#xff1a;本地。3. 本地Net服务名配置-添加-选择-DBName(可以写成你要链接的数据库…

Oxite分析之自定义Action返回值

change set&#xff1a;42353 download &#xff1a;http://oxite.codeplex.com/SourceControl/ListDownloadableCommits.aspx 查看一些Module下的Controller就会发现&#xff0c;里面有一些“特别”的public方法。比如Oxite.Modules.Core.Controllers.SiteController下有一个…

iOS7编程Cookbook中例15.8中一个小问题

大熊猫猪侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该书的15.8例子标题为Editing Videos on an iOS Device,代码的功能为创建一个UIImagePickerController视图让用户从照片库选择一个视频文件,然后在…

《实战:如何搭建一个完整的 Vue2.0 项目》- 3、清理Vue的默认文件和配置

Vue 项目创建时会带一些默认文件和样式&#xff0c;我们在项目中不会使用&#xff0c;可删除和修改。 1、删除文件 src/views/About.vuesrc/components/HelloWorld.vuesrc/assets/logo.png 2、修改 src/router/index.js 路由文件 目前只保留一个主页 Home import Vue from …

什么时候App委托会收到App进程被结束的消息

大熊猫猪侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在Xcode建立的新项目后,在AppDelegate类会发现很多和App状态相关的回调方法(当然你也可以使用App状态通知),其中你会看到一个applicationWill…