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

时间:2015-01-10 18:57:57

标签: ios objective-c cocoa-touch deprecated

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

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

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

IDEA 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.
}

IDEA 2

我正在考虑在应用程序周围使用ifdef定义,如下所示:

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

哪种方式更好?我本以为第二个想法更快,使用的资源更少?

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

谢谢你的时间,Dan。

2 个答案:

答案 0 :(得分:6)

我不建议检查版本并根据它编写代码。相反,您需要检查该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并不意味着您不应该在当前版本中使用它。这意味着,从下一个版本开始它将无法工作,只能工作到当前版本。

答案 1 :(得分:2)

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

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

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

但是,因为您只处理弃用警告,所以您不必执行任何操作,只需继续使用已弃用的API,直到应用程序不再需要支持ios7。