用SDK 4.2开发的iPhone应用程序,需要向后兼容iOS 3.1.3 ..简单的方法?

时间:2011-10-17 07:18:35

标签: ios backwards-compatibility

我已经使用SDK 4.2构建了一个iPhone应用程序但是我知道也想让它与iOS 3.1.3兼容。

第一步是将部署目标设置为3.1.3。它在3.2模拟器上运行良好但是应用程序有时崩溃,因为我使用的是一些早期SDK中没有的方法。

所以我的问题是,有没有直接的方法来找到我在项目中使用的有缺陷的方法/类,这在3.1.3中是不可用的? (没有手动完成每个方法调用并咨询文档以获取SDK的可用性?)

感谢。

UPDATE:我已经在3.1.3上执行了应用程序,并试图手动测试每个执行路径,希望找到所有异常。这完成了一定程度的成功。但是,如果应用程序是巨大的呢?并且有很多执行路径?这种情况必须有一些工具。任何想法都非常感激。

1 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,只是找到了解决方案。

您应该在前缀标题的开头添加以下定义:

#import <Availability.h>
#define __AVAILABILITY_INTERNAL__IPHONE_3_2 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_0 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_1 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_2 __AVAILABILITY_INTERNAL_DEPRECATED
#define __AVAILABILITY_INTERNAL__IPHONE_4_3 __AVAILABILITY_INTERNAL_DEPRECATED

然后,下次编译应用程序时,旧版本中不可用的方法(在本例中为iOS 3.1)将被标记为已弃用,您将收到每个方法的警告。

如果您想收到错误,可以使用__AVAILABILITY_INTERNAL_UNAVAILABLE代替__AVAILABILITY_INTERNAL_DEPRECATED

这些行重新定义了AvailabilityInternal.h中的实际定义,因此您应该在完成后从前缀标题中删除它们。

以下是它的工作原理:

Apple使用__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0)等宏标记头文件中方法的可用性。

由于您正在为iOS编译,因此应用Availibility.h中的以下定义:

#define __OSX_AVAILABLE_STARTING(_mac, _iphone) __AVAILABILITY_INTERNAL##_iphone

因此,这些方法实际上标有__AVAILABILITY_INTERNAL__IPHONE_4_0和类似的宏。通常,当您使用新SDK进行编译时,这些宏将替换为__AVAILABILITY_INTERNAL_WEAK_IMPORT,这不会产生任何警告。通过在我的前缀标题的答案开头添加行,您可以使用__AVAILABILITY_INTERNAL_DEPRECATED覆盖这些定义。因此,Xcode认为这些方法已被弃用并产生警告。