ABAddressBook 到 CNContact 应用程序转换

ABAddressBook to CNContact App Transition

我正在开发一款即将发布但使用 ABAddressBook 框架的应用程序。随着 iOS9 中 ABAddressBook 的弃用,我是否需要检查用户的 iOS 版本,并为 iOS9 之前的用户使用 ABAddressBook,为 iOS9 用户使用 CNContact?

其他人是如何处理这件事的?我以前从未遇到过这样的情况。

我也一直在处理和研究这个问题,我选择做的是按照你的建议;检查用户 iOS 版本,执行如下操作:

NSString *version = [[UIDevice currentDevice] systemVersion];
BOOL isVersion8 = [version hasPrefix:@"8."];
BOOL isVersion7 = [version hasPrefix:@"7."];
//...

...根据您决定为您的应用支持的版本继续。

然后我检查是否使用早于 iOS 9 的地址簿框架,以及 iOS 9 及更高版本的联系人框架。

if(isVersion7 || isVersion8){
    //Use AddressBook
   }
else{
    //Use Contacts
}

这是我能想到的处理弃用业务的最佳方式...

弃用并不意味着删除。只需将链接到这两个框架作为可选,然后开始设计可以处理这两个框架的数据工作流。另外请注意 CNContact 是新的并且充满了错误。

一旦您认为您的应用已经重构并且 iOS 进化到 9.1 就给它开绿灯

如何知道系统是否支持功能

1) 检查class是否存在

if(NSClassFromString(@"CNContact")) {
    // Do something
}

对于弱链接 classes,直接向 class 发送消息是安全的。值得注意的是,这适用于未明确链接为 "Required" 的框架。对于缺少的 classes,表达式的计算结果为 nil。

2)

#ifned NSFoundationVersionNumber_iOS_9 
 #def NSFoundationVersionNumber_iOS_9 NUMBER
#endif

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9) {
   // Use address book
} else {
   // Use contact framework
}

运行模拟器中的应用找到NSFoundationVersionNumber常量

if #available(iOS 9, *)
{
   // iOS 9 - CNContact
}
else
{
  // iOS 8 - ABAddressBook
}

这才是正确的检查方式