使用 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?