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

Posted

技术标签:

【中文标题】使用 SDK 4.2 开发的 iPhone 应用程序需要向后兼容 iOS 3.1.3 .. 简单的方法?【英文标题】:iPhone app developed with SDK 4.2, requires backward compatibility with iOS 3.1.3 .. easy way? 【发布时间】:2011-10-17 07:18:35 【问题描述】:

我已经使用 SDK 4.2 构建了一个 iPhone 应用程序,但我知道也希望使其与 ios 3.1.3 兼容。

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

所以我的问题是,是否有一种直接的方法可以找到我在项目中使用的违规方法/类,这些方法/类在 3.1.3 中不可用? (无需手动完成每个方法调用并咨询文档以了解 SDK 可用性?)

谢谢。

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

【问题讨论】:

【参考方案1】:

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

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

#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 认为这些方法已被弃用并产生警告。

【讨论】:

感谢您的回复。正如你所说,我得到了重新定义的警告列表...App-Prefix.pch:11:1: warning: "__AVAILABILITY_INTERNAL__IPHONE_4_3" redefined.. 但它也告诉我哪些方法已被弃用。你能解释一下这是如何工作的吗? 我已经为我的答案添加了解释。 感谢您的出色回答,赞成...但它没有抓住 [UIView animateWithDuration... __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0) - 有什么想法吗? 这可能是因为您在这些定义之前导入了 UIKit。我已经编辑了答案。您应该将定义添加到前缀文件的顶部,并确保在它们之前导入 Availibility.h。

以上是关于使用 SDK 4.2 开发的 iPhone 应用程序需要向后兼容 iOS 3.1.3 .. 简单的方法?的主要内容,如果未能解决你的问题,请参考以下文章

允许 AirPlay 支持和 iOS 4.2、iOS 4.3

iphone:使用 iOS 5 和 Xcode 4.2 提交应用程序? [关闭]

如何在 iPhone SDK 中使用 Objective C 实现 UIViewAutoresizingFlexibleHeight 到 UIScrollView?

iPhone SDK 3.2 测试版和 iPhone SDK 3.1.2

iOS iPhone SDK 包含哪些东西?

我可以在 iphone3.0 上安装用 iphone sdk 3.1.3 开发的 iphone 应用程序吗?