为 2.2.1 构建时可以使用 iPhone 3.0 符号吗?
Posted
技术标签:
【中文标题】为 2.2.1 构建时可以使用 iPhone 3.0 符号吗?【英文标题】:Can I use iPhone 3.0 symbols when building for 2.2.1? 【发布时间】:2009-06-24 21:13:28 【问题描述】:我一直在开发 iPhone 应用程序,但仍想支持 2.2.1
其中一项功能是用户可以通过单击链接通过电子邮件启动应用程序。在 2.2.1 世界中,我通过实现应用程序来实现这一点:handleOpenURL: message。
在 iPhone 3.0 中,他们更改了添加应用程序的方法:didFinishLaunchingWithOptions: 方法(这很棒,而且比旧方法更有意义)。在该方法中,您使用键 UIApplicationLaunchOptionsURLKey 来找出 URL 是什么。
问题是,如果我使用该密钥,我的应用程序不会在 2.2.1 中构建,因为它是在 3.0 中引入的。解决这个问题并且仍然支持 2.2.1 的最优雅的方法是什么?我正在考虑使用 UIApplicationLaunchOptionsURLKey 枚举的实际值,但我认为这很难看。有没有人遇到过这种情况并想出更好的办法?
【问题讨论】:
【参考方案1】:最简单的方法是围绕 3.0 代码和 2.2.1 代码进行#define,以便进行条件编译。注意:这意味着您将有一个用于 3.0 的二进制文件,另一个用于另一个。
所以
#ifdef IPHONE_OS_3.0
/* DO 3.0 stuff */
#endif
#ifdef IPHONE_OS_2.2.1
/*DO 2.2.1 stuff */
#endif
作为对您的评论的回应,如果代码不同,您必须为每个代码块设置不同的#ifdef #endif,否则如果它仅对 3.0 不同,您将执行类似的操作
#ifdef IPHONE_OS_3.0
/* DO 3.0 STUFF */
#else
/* DO STUFF FOR OTHER THAN 3.0 */
#endif
你将不得不弄清楚真正的定义是什么(我只是编造的:))
希望有帮助
【讨论】:
如果我这样做,我是否必须为 IPHONE_OS_2.2.1 以及之前的所有其他版本执行 #ifdef? 查看我对您评论的回复 :) 如果目标是根据操作系统支持不同功能的单个二进制文件,这是错误的答案,因为它是编译时检查。【参考方案2】:使用 3.0 SDK,但将“iPhone OS Deployment Target”设置为 2.2.1 或更早版本。
在 OS 3.0 下,您的应用程序:didFinishLaunchingWithOptions: 将被调用,如果您在 OS 2.2.1 上运行,则会调用其中一个旧方法。
如果您不尝试使用任何其他 3.0 功能,我认为您不需要做任何其他事情,但您也可以查看 my other answer 关于 Apple 的 MailComposer 示例。
【讨论】:
【参考方案3】:要让一个应用程序在两个操作系统版本上都可以运行,您必须针对 2.2.1 SDK 进行构建。而且由于该 SDK 不知道 UIApplicationLaunchOptionsURLKey
符号,如果您在 OS 3.0 上运行应用程序时认识到它的价值,您别无选择,只能在代码中定义它。
另一方面,OS 3.0 的采用率非常高(根据我看到的一个数据,已经超过 75%),因此仅将您的应用程序设为 OS 3.0 也是一个值得考虑的解决方案。
【讨论】:
这不是真的。您可以针对 3.0 SDK 构建,但将所需的操作系统版本设置为 2.2.1(或更低)【参考方案4】:有一个question about 3.0 features in 2.0 iPhone OS。但是您想知道(在运行时)符号是否存在于 UIKit 中或其他任何地方。恐怕,那里还没有回答。
【讨论】:
【参考方案5】:那么,如果您想要一个支持多个操作系统版本的二进制文件,您也应该怎么做?我特别纠结于如何有条件地为 3.0 加载必要的库。
【讨论】:
【参考方案6】:#ifdef __IPHONE_3_0
// iPhone 3.0 specific stuff
#else
// iPhone 2.2 (or below) specific stuff
#endif
【讨论】:
以上是关于为 2.2.1 构建时可以使用 iPhone 3.0 符号吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用当前的 Xcode 为 iPhone OS 3.1.2 构建应用程序?
将我的应用程序构建到我的 ipod touch 时出错:将“目标设备系列”设置为仅 iPhone(“1”)不支持 SDK“设备 - iPhone OS 3.2”