【问题标题】:How do you optionally use iPhone OS 3.0 features in a 2.0 compatible app?您如何在兼容 2.0 的应用程序中选择性地使用 iPhone OS 3.0 功能?
【发布时间】:2010-11-02 11:06:52
【问题描述】:

我想在我的 2.0 应用程序在 3.0 设备上运行时使用 iPhone OS 3.0 的一些功能。我不想一路走3.0,因为还有客户还不想更新。

我对 MapKit.framework (-weak_framework MapKit) 的弱链接进行了一些实验。我发现这很麻烦,因为我不得不欺骗编译器/链接器以将 2.0 SDK 与除使用 MapKit 的代码之外的所有代码一起使用。

有没有人有这方面的经验?你在做什么使它编译/链接。是否有人已经向 Apple 提交了一个应用程序,该应用程序弱链接了其他操作系统版本的框架?

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案1】:

    Apple 有一个如何做到这一点的示例,特别是制作一个使用 MFMailComposeViewController 的 2.x 兼容应用程序......

    http://developer.apple.com/iphone/library/samplecode/MailComposer/index.html

    答案涉及使用 3.0 SDK 进行编译,将部署目标设置为 2.x,确保将 3.0 框架标记为“弱”引用,然后做正确的事情以使您的代码能够正常工作没有新框架的设备。

    【讨论】:

    • 太棒了!这就是我一直在寻找的答案!
    • 应该注意的是,有报道称,如果在 3.x 上运行,Apple 已拒绝具有弱链接 StoreKit 的应用程序以使用应用内购买(否则如果在 2.x 下运行) .所以,YMMV。
    • 你有链接吗?我可以看到苹果对应用内购买格外敏感。无论如何,我在商店中有几个应用程序弱链接 MessageUI 框架。
    • 始终使用可用的最新稳定 SDK,将部署目标设置为您想要支持的最低版本。然后编写条件运行时代码: 检查类是否存在 if(NSClassFromString(@"NSSomeNewClass")) {...} 检查方法是否存在 if ([NSSomeClass instancesRespondToSelector(someSelector:)]) {... }
    【解决方案2】:

    您始终可以使用 dlopen 函数链接到不属于当前 SDK 的框架。当然,对于不公开的框架,这是不推荐的(在这种情况下,不推荐 == 应用商店禁止)。但是,随着未发布版本的操作系统中的新框架公开,这是一种选择。只需检查您的版本号,并打开可用的框架。对个别功能很有用,如果你大量使用新东西,那就没那么有用了。

    【讨论】:

    • dlopen 解决方案与 -weak_framework 方法具有相同的弱点:您必须使用 3.0 SDK 编译使用 3.0 框架符号的代码。
    • 不,您可以针对 2.x SDK 构建,只需 NSClassFromString 即可获取类名。
    • 我认为无法使用原始标题是一个弱点。我可以想象的一种解决方法是在静态库中构建 3.0 相关部分并将其链接到 2.0 应用程序。我还没有测试过。
    • 这可能是一个可行的解决方案。我已经使用这种技术 (dlopen) 从 3.0 框架中提取了一个功能,同时仍然拥有一个与 2.0 兼容的应用程序。如果您最低限度地访问 3.0 类,则应该不会有太多问题。
    • 听起来不错。你把这个提交到 App Store 了吗?你 dlopen() 用了什么库?
    【解决方案3】:

    这可能不是您要寻找的答案,但我使用的方法是只拥有两个单独的应用程序。我没有用 3.0 升级来更新我现有的应用程序,而是将它作为一个新应用程序发布。老用户可以随心所欲地使用 2.0 应用,想要 3.0 功能的人可以升级。

    【讨论】:

    • 如果我的应用是免费的,我会使用它。但由于有客户之前付款,我不能要求他们再次购买应用程序以获得 3.0 功能。
    • 当然可以。除非您为您的应用程序收取大量费用,否则定价升级非常普遍。您在该计划中投入了更多工作,并且应该为此获得报酬。苹果为升级到他们的操作系统再收取 29 美元...
    【解决方案4】:

    关于弱链接(库和框架)的很棒的方法在这里:

    http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html#//apple_ref/doc/uid/20002378-107262

    虽然有点过时了...使用最新的 x 代码,弱链接整个框架的过程实际上更容易:

    1. 右键单击目标并选择获取信息
    2. 转到“常规”标签
    3. 在底部的链接库部分中,将您想要弱链接的所有库的类型从必需更改为弱。
    4. 利润

    【讨论】:

      【解决方案5】:

      我不认为你可以。 3.0 和 2.x 使用完全不同的 SDK,并链接到一组完全不同的文件和库。我不确定,但我不认为你可以链接到 3.0 SDK 并且仍然兼容 2.X。

      (如果我错了,请添加评论)。

      【讨论】:

      • 嗯,它似乎可以正常工作,至少在我的设备上是这样。我在一部 iPhone 2.2.1 和另一部 3.0 GM 上尝试过。这些框架具有完全相同的名称(框架版本控制的东西似乎被丢弃在 iPhone OS 上:路径中没有“版本/A”)。看起来 Apple 试图让框架在操作系统之间保持兼容,因为它们具有非脆弱的实例变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多