如何为不同的 iOS 版本定义代码

How to define code for different iOS versions

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

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

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

想法 1

每当我的代码在两个 OS 上都不起作用时,我会使用 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

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

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

谢谢你的时间,丹。

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

例如,如果你想用相同的代码支持 Mac OS X 和 iOS,你会使用宏,因为你在编译时知道二进制文件是否是Mac OS 或 iOS.

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

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

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

用于检查 class 是否可用:

Class checkClass = NSClassFromString(@"CheckingClass");

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

如果您需要检查 feature/function 是否可用;

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

注意:

已弃用 API 并不意味着您不应该在当前版本中使用它。也就是说,从下个版本开始就不能用了,只能用到当前版本。