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