【问题标题】:How to define code for different iOS versions如何为不同的 iOS 版本定义代码
【发布时间】:2015-01-10 18:57:57
【问题描述】:

我正在开发一个 iOS 应用程序。我希望它支持 iOS 7 和 8。它运行得非常好,但是应用程序的许多不同部分都使用了 Apple API。其中一些 API 在 iOS 8 和 7 中都可以使用。但是,其中一些在 iOS 8 中已被弃用。因此,我去了 Apple 开发者网站,看看用什么来替换它们(新方法/等等....)。

但是,我现在遇到的问题是该应用程序可以在 iOS 8 上正常运行,但它的某些部分在 iOS 7 上无法正常运行,因为我正在尝试使用 iOS 8 API...... (笑)。

所以我只是想知道,在 iOS 8 和 7 上实现代码的最佳方式是什么。我有一些想法(如下),但我不确定哪个最好:

想法 1

每当我的代码不能在两个操作系统上运行时,我都会使用 if 函数(调用宏),如下所示:

if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
    // iOS 7 device. Use iOS 7 apis.
}

else {
   // iOS 8 (or higher) - use iOS 8 apis.
}

想法 2

我正在考虑在整个应用程序中使用 ifdef 定义,如下所示:

#ifdef __IPHONE_8_0
     // iOS 8 code here....
#else
     // iOS 7 code here....
#endif

哪种方式更好?我会认为第二个想法更快并且使用更少的资源对吗?

或者我的想法都是垃圾?有没有更好的方法来解决这个问题?

感谢您抽出宝贵时间,丹。

【问题讨论】:

  • 不测试iOS版本。在运行时测试 API 的可用性。阅读文档中的“SDK 兼容性指南”。
  • 仅供参考 - 如果 API 在 iOS 7 中受支持但在 iOS 8 中已弃用,则您根本不需要做任何事情。 iOS 7 API 是您应该使用的。它仍然可以在 iOS 8 下运行。
  • @rmaddy 你确定吗?我正在阅读一个简单的 XML Plist 文件。在 iOS 8 中,我用于读取 XML 文件的代码停止工作。当我使用 iOS 8 api 对其进行测试后,它又开始正常工作了。还说应该坚持使用已弃用的 API ......这听起来很危险,肯定会导致内存泄漏或意外崩溃。
  • 我 100% 确定这一点。如果您对特定 API 有疑问,请发布特定于该问题的问题。这个问题有点笼统,无法提供具体细节。
  • 不推荐使用的 API 并不意味着,您不应该在当前版本中使用它。这意味着,它不会从下一个版本开始工作,并且只能工作到当前版本。

标签: ios objective-c cocoa-touch deprecated


【解决方案1】:

我不建议检查版本并以此为基础编写代码。相反,您需要检查该 API 是否可用。

用于检查课程是否可用:

Class checkClass = NSClassFromString(@"CheckingClass");

if (checkClass)
{
   // Available
}
else
{
  // Not Available
}

如果您需要检查可用的特性/功能;

if ([checkClass respondsToSelector:@selector(yourMethod:)])
{
   // Feature/ Method Available
}
else
{
   // Feature/ Method Not Available
}

注意:

不推荐使用的 API 并不意味着您不应该在当前版本中使用它。这意味着,它不会从下一个版本开始工作,并且只能工作到当前版本。

【讨论】:

  • 好的,感谢您的回答和示例。这似乎是解决问题的最佳方法。再次感谢。
  • 此答案末尾的注释不正确。已弃用的 API 很少会停止工作。
  • @rmaddy:我没明白你的意思。我知道 iOS 6 中有大量已弃用的 API,它们在 iOS 8 上不起作用
  • 我可能说得有点过头了。这取决于类和 API。我知道在 iOS 3.0 中被弃用的 API 在 iOS 8 中仍然有效。但你是对的,有一些被弃用的 API 很快就会停止工作,但情况并非总是如此。
  • @rmaddy:是的,你是对的。只要存在已弃用的 API,您就可以使用它(无版本障碍)
【解决方案2】:

ifdef-方式不起作用,因为预处理器语句是在编译时评估的;但只有在运行时我们才知道我们必须处理哪个 ios 版本。

例如,如果您想用相同的代码支持 Mac OS X 和 iOS,您可以使用宏,因为您在编译时就知道二进制文件是用于 Mac OS 还是 iOS。

因此,在这种情况下,您需要方法 1 - 或者更好的是,您应该使用 respondsToSelector: 检查可用性,而不是尽可能测试 iOS 版本。

但是,由于您只处理弃用警告,因此您无需执行任何操作,只需继续使用已弃用的 API,直到应用不再需要支持 ios7。

【讨论】:

  • 感谢您的回答。听起来不错,但我想我会选择@MidhunMP 的答案。由于使用已弃用的 API,我并不能确信我的应用可以正常运行而不会崩溃。
  • 弃用实际上只是苹果将在未来(ios9)删除它的公告 - 这并不意味着它不稳定或不再受支持!
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多