【问题标题】:iPhone app developed with SDK 4.2, requires backward compatibility with iOS 3.1.3 .. easy way?使用 SDK 4.2 开发的 iPhone 应用程序需要向后兼容 iOS 3.1.3 .. 简单的方法?
【发布时间】: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 上执行了该应用程序,并尝试手动测试每个执行路径,希望能找到所有异常。这是以一定程度的成功完成的。但是,如果应用程序很大怎么办?并且有很多执行路径?这种情况必须有一些工具。任何想法都非常感谢。

【问题讨论】:

    标签: ios backwards-compatibility


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多