如何为不同的 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 并不意味着您不应该在当前版本中使用它。也就是说,从下个版本开始就不能用了,只能用到当前版本。
我正在开发 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 并不意味着您不应该在当前版本中使用它。也就是说,从下个版本开始就不能用了,只能用到当前版本。