我已经在iPhone应用程序上工作了一段时间,但仍然想支持2.2.1
其中一项功能是用户可以通过点击链接通过电子邮件启动应用程序。在2.2.1世界中,我通过实现应用程序:handleOpenURL:message来实现这一点。
在iPhone 3.0中,他们改变了添加应用程序:didFinishLaunchingWithOptions:method(这很棒,比旧方法更有意义)。在该方法中,您使用密钥UIApplicationLaunchOptionsURLKey来查找URL是什么。
问题是,如果我使用该密钥,我的应用程序不会在2.2.1中构建,因为它是在3.0中引入的。什么是最优雅的解决方案,仍然支持2.2.1?我正在考虑使用UIApplicationLaunchOptionsURLKey枚举的实际值,但我认为这很难看。有没有人遇到这个并想到更好的方法?
答案 0 :(得分:1)
最简单的方法是#define 3.0代码和2.2.1代码,这样你就可以进行条件编译。注意:这意味着您将拥有一个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
你将不得不弄清楚真正的定义是什么(我刚刚制定了它们):)
希望有所帮助
答案 1 :(得分:1)
使用3.0 SDK,但将“iPhone OS部署目标”设置为2.2.1或更早版本。
在OS 3.0下,您的应用程序:didFinishLaunchingWithOptions:将被调用,如果您在OS 2.2.1上运行,将会调用其中一个旧方法。
如果您不尝试使用任何其他3.0功能,我认为您不需要做任何其他事情,但您也可以查看有关Apple my other answer示例的MailComposer。
答案 2 :(得分:0)
有一个question about 3.0 features in 2.0 iPhone OS。但是你想知道(在运行时)符号是否在UIKit中或者在UIKit中退出。我很害怕,那里还没有回答。
答案 3 :(得分:0)
要拥有一个适用于两个操作系统版本的应用程序,您必须针对2.2.1 SDK进行构建。由于该SDK不知道UIApplicationLaunchOptionsURLKey
符号,如果您在OS 3.0上运行应用程序时识别它的价值,则别无选择,只能在代码中定义它。
另一方面,OS 3.0的采用非常强大(根据我见过的一个数字已经超过75%),所以只使用你的应用OS 3.0也是一个需要考虑的解决方案。
答案 4 :(得分:0)
那么如果你想拥有一个支持多个OS版本的二进制文件,你还应该怎么做?我特别坚持如何有条件地为3.0加载必要的库。
答案 5 :(得分:-1)
#ifdef __IPHONE_3_0
// iPhone 3.0 specific stuff
#else
// iPhone 2.2 (or below) specific stuff
#endif