代码之家  ›  专栏  ›  技术社区  ›  Felker

ABAAddressBook到CNContact应用程序的转换

  •  5
  • Felker  · 技术社区  · 10 年前

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

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

    3 回复  |  直到 10 年前
        1
  •  4
  •   UberJames    10 年前

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

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

    …根据您决定支持的应用程序版本继续。

    然后我检查是否使用早于iOS 9的Addressbook框架,以及iOS 9及更高版本的Contacts框架。

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

    这是我能想到的处理这种贬低行为的最佳方式。。。

        2
  •  2
  •   Marek H    10 年前

    不推荐并不意味着删除。只需将两个框架的链接设置为可选的,然后开始设计可以处理这两个框架。另外,请注意CNContact是新的,并且充满了bug。

    一旦你认为你的应用程序被重构,iOS升级到9.1,你就会为它开绿灯

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

    1) 检查类是否存在

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

    对于弱链接类,直接向类发送消息是安全的。值得注意的是,这适用于未明确链接为“必需”的框架。对于缺少的类,表达式的计算结果为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常量

        3
  •  0
  •   daniel3223    10 年前
    if #available(iOS 9, *)
    {
       // iOS 9 - CNContact
    }
    else
    {
      // iOS 8 - ABAddressBook
    }
    

    这是正确的检查方法。