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

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值