支持多个iOS版本:检查extern CFTypeRef符号

时间:2014-07-25 22:33:26

标签: ios

我正在开发支持iOS 6和iOS 7的应用程序,如果该功能可用(iOS 7.0.3及更高版本),我想支持iCloud Keychain同步。查看Security / SecItem.h,有以下条目:

extern CFTypeRef kSecAttrSynchronizable
    __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
extern CFTypeRef kSecAttrSynchronizableAny
    __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);

过去,我已经检查过ObjC符号的地址不是NULL,因此CFTypeRef不应该有任何不同(右边?!)。那么,让我们去吧:

if (&kSecAttrSynchronizable != NULL) {
    // iCloud Keychain syncing code
}
else {
    // We're in iOS 6 territory
}

在我的iOS 6.1.3设备上构建一个运行并且...检查成功 - kSecAttrSynchronizable存在。什么?这怎么可能?想到的两种可能性是:

  1. 我对检查符号的假设是非常错误的(概率很高)
  2. Apple实际上在iOS 7.0.3之前的版本中定义了kSecAttrSynchronizable(私有?)(可能但不太可能)
  3. 那么这里发生了什么?

1 个答案:

答案 0 :(得分:0)

这些是我一直在寻找的机器人:

if (&kSecAttrSynchronizable != NULL && &kSecAttrSynchronizableAny != NULL)

iOS 6.1.3中提供了kSecAttrSynchronizable外部符号,但kSecAttrSynchronizableAny符号不可用。只检查后者可能是安全的,但未来 - 我会认为我不清楚为什么要检查价值而不是钥匙。