【问题标题】:Can I use iPhone 3.0 symbols when building for 2.2.1?为 2.2.1 构建时可以使用 iPhone 3.0 符号吗?
【发布时间】: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 枚举的实际值,但我认为这很难看。有没有人遇到过这种情况并想出更好的办法?

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            相关资源
            最近更新 更多