保持向后兼容 iPhone OS 2.2.1

Posted

技术标签:

【中文标题】保持向后兼容 iPhone OS 2.2.1【英文标题】:Staying backwards compatible with iPhone OS 2.2.1 【发布时间】:2009-08-14 02:34:32 【问题描述】:

我目前在 App Store 上有一个使用 2.2.1 版构建的应用,即基础 SDK 和部署目标都设置为 2.2.1。该应用程序运行良好。从那时起,我已经将我的 XCode 版本升级到 3.1.3,并且我正在对我的应用程序进行更新,其中 Base SDK 设置为 3.0,部署目标设置为 2.2.1。这在我运行 OS 3.0 的测试 iPhone 设备上运行良好。问题是我没有在 2.2.1 上测试的设备,所以我使用模拟器,并且某些 UI 元素(主要是图像)没有显示在我当前的构建中。奇怪的是,当我在模拟器上使用当前版本的 XCode 测试已经在 App Store 上的应用程序的旧版本时,我遇到了同样的 UI 消失问题。同一个版本怎么会有不同的结果? XCode 有什么变化吗?这是怎么回事?

谢谢!

【问题讨论】:

我开始认为这可能是苹果方面的某种错误。当我使用用于创建提交给 Apple 的构建的代码(基于 2.2.1 构建)并在我的 3.0 设备上运行时,它不起作用(我收到 UI 错误)。但我从 App Store 下载的相同版本运行良好。有点不对劲…… 【参考方案1】:

2.2.1 应用程序无法在 iPhone 模拟器上运行:当应用程序运行时,从“硬件”>“版本”菜单检查模拟器的硬件版本。虽然不是完全相同的问题,但报告了有关自动选择正确模拟器版本的问题。 See question#388298 和 a related article (see Open Questions)。如果它没有设置为 2.2.1,唯一的选择可能是手动设置它并在没有调试器的情况下启动应用程序。

总体上支持向后兼容性:Here 是一个很好的关于这样做的文章。您应该在运行时检查版本,而不是在编译时,因为后者会从二进制文件中遗漏向后兼容的代码。另外,不要忘记weak link任何仅限 3.0 的框架,例如 MapKit 和 GameKit。 The article above 展示了如何做到这一点。

注意:您可以使用respondsToSelector: 检查已弃用的属性。这有点麻烦,但获取和设置属性只是语法糖,所以:

cell.image;
cell.image = anImage;
// corresponds to
if ([cell respondsToSelector:@selector(image)]) 
    [cell image];
    [cell setImage:anImage];

此外,为每个不同的版本保留不同的目标可能会有所帮助,以便您可以轻松地在它们之间切换。

【讨论】:

感谢您的链接,但我仍然遇到同样的问题。当我运行旧版本的应用程序时,我确认模拟器运行的是 2.2.1 版本并且图标仍然没有出现。我也没有使用任何 3.0 库(仅 Foundation、UIKit、CoreGraphics 和 sqlite)。如果 3.0 版本不起作用,我不会感到惊讶,但我无法理解为什么 App Store 上的相同代码突然在 2.2.1 上不再起作用。【参考方案2】:

某些方法在 2.2.1->3.0 更改中被弃用,包括几个 UI 方法(UITableViewCell 的initWithStyle: 很容易想到)。我会检查以确保您对 UI 对象的所有调用都与 3.0 兼容,尤其是在构造或显示消失对象的区域。

【讨论】:

是的,我正在使用已弃用的方法和属性,例如 UITableViewCell 的属性“图像”,这些是未显示的元素。但是解决方法是什么?新方法和属性仅在 OS 3.0 上受支持。为什么不推荐使用的方法不能在旧版本的操作系统上运行,但仍然适用于较新的操作系统? 您可以尝试一些事情。首先,将您的 Base SDK 改回 2.2.1。如果程序是为较旧的操作系统构建的,3.0 中已弃用的方法应该仍然有效。如果这不起作用,您可以开始在源文件中尝试使用 #ifdef 以在每个操作系统上运行适当的代码;预处理器符号 __IPHONE_3_0 是在 3.0+ 系统上定义的,并且不在任何 上 旧版本的 Base SDK 已经设置为 2.2.1,这个版本不起作用。我仔细检查了模拟器是否在 2.2.1 上运行。我正在使用的版本是我在 Subversion 中标记并发送给 Apple 的版本,因此应该没有任何问题。

以上是关于保持向后兼容 iPhone OS 2.2.1的主要内容,如果未能解决你的问题,请参考以下文章

向后兼容 iOS 7 的 iPhone 纵向横向自适应 UI 示例

为啥 Core Data SQLite 存储不能从 OS X 10.8 向后兼容到 10.4?

当新的 API 出现时,构建一个向后兼容的 OS X 应用程序?

向接口引入默认方法真的可以保持向后兼容性吗?

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

在 iOS 6 中启用自动布局,同时保持向后兼容 iOS 5