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

时间:2022-05-24 03:57:35

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


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

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

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

下面给出替换方法.

原来的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/