问题:我的应用必须在iPhone OS 3.0上运行。
然而,我真的想要使用iPhone OS 3.2的一些功能。就像一个免费的小插件。但我不想通过这样做来切断我的用户群。
想象一下,你是一个iPhone OS 3.0的东西,有人给你一本书来阅读。它有iPhone OS 3.2说明。你从来没有学过这些。所以你会怎么做?崩溃?它们必须被隐藏,所以你不会被打扰。
最近有人在SO上写道:
请记住,你必须检查 源中的位置的版本 您希望使用新代码的代码 功能和提供替代品 旧的os版本
那我该怎么办呢?当Xcode发现任何地方无法链接的东西时,它不会抛出警告吗?我是否只是检查操作系统版本并以某种方式动态链接到我觉得很酷的东西?
答案 0 :(得分:4)
iPad Programming Guide中有一节介绍了标题为“为新符号添加运行时检查”的内容。基本上,您可以使用NSClassFromString
和instancesRespondToSelector:
来确定功能是否存在,然后应用可以采取相应的行动。
答案 1 :(得分:4)
检测功能的两种常见方法是respondsToSelector
和NSClassFromString
。通过这些,您可以判断旧类是否具有新方法,或者是否存在新类。
例如,3.2添加了手势识别器。您可以使用这些方法中的任何一种来决定是否要向视图添加手势识别器:
if ( [myView respondsToSelector:@selector(addGestureRecognizer:)] ) {
// assume gesture recognizers exist, create and add some
}
或
if ( NSClassFromString( @"UIGestureRecognizer" ) ) {
// assume gesture recognizers exist, create and use some
}
在这两种情况下,您将构建3.2,但如果在运行时检测到它们,则仅使用3.2功能。如果您针对3.0进行构建并且所有警告都显示在您正确检查事物的位置,那么您就可以去了。
在3.2的情况下,还添加了一个新的处理器,因此要么为旧架构构建通用二进制文件或构建。
此外,在某些情况下,Apple提供了检测版本的支持。一个很好的例子就是UI_USER_INTERFACE_IDIOM
UIDevice.h
,它为您调用respondsToSelector
。