您如何在兼容2.0的应用程序中选择使用iPhone OS 3.0功能?

您如何在兼容2.0的应用程序中选择使用iPhone OS 3.0功能?,iphone,iphone-sdk-3.0,Iphone,Iphone Sdk 3.0,当iPhone OS 3.0在3.0设备上运行时,我想在我的2.0应用程序中使用它的一些功能。我不想一直使用3.0,因为有些客户还不想更新 我对MapKit.framework(-weak_framework-MapKit)的弱链接进行了一些尝试。我发现它相当麻烦,因为我不得不欺骗编译器/链接器,使其将2.0SDK用于除使用MapKit的代码之外的所有代码 有人有这方面的经验吗?你在做什么使它编译/链接。有没有人已经向苹果提交了一个应用程序,它与其他操作系统版本的框架之间存在弱链接?这可能不是你

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

我对MapKit.framework(-weak_framework-MapKit)的弱链接进行了一些尝试。我发现它相当麻烦,因为我不得不欺骗编译器/链接器,使其将2.0SDK用于除使用MapKit的代码之外的所有代码


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

这可能不是你想要的答案,但我使用的方法是只使用两个独立的应用程序。我没有用3.0升级来更新我现有的应用程序,而是将其作为一个新应用程序发布。老用户可以想用多久就用多久,想要3.0功能的人可以升级。

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


(如果我错了,请添加注释)。

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

苹果有一个例子说明了如何做到这一点,特别是制作一个使用MFMailComposeViewController的2.x兼容应用程序


答案包括使用3.0 SDK进行编译,将部署目标设置为2.x,确保3.0框架标记为“弱”引用,然后在没有新框架的设备上执行正确的操作以使代码正常工作。

弱链接(库和框架)的好方法:

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

  • 右键单击目标并选择“获取信息”
  • 转到“常规”选项卡
  • 在底部的“链接库”部分中,将要弱链接的所有库的类型从“必需”更改为“弱”
  • 利润

  • 如果我的应用程序是免费的,我会用这个。但是,由于有客户以前确实付费,我不能要求他们再次购买该应用程序以获得3.0功能。你当然可以。除非你要为你的应用程序收取巨额费用,否则收费升级是很常见的。你在这个项目上投入了更多的工作,应该得到报酬。苹果公司为升级他们的操作系统再收费29美元……好吧,看来它正在工作,至少在我的设备上是这样。我在一台iPhone 2.2.1和另一台3.0 GM上试用了它。这些框架的名称完全相同(框架版本控制的内容似乎在iPhone操作系统上被删除了:路径中没有'versions/A'。苹果似乎试图保持框架在不同操作系统之间的兼容性,因为它们具有非脆弱的实例变量。dlopen解决方案与-weak_framework方法具有相同的弱点:您必须使用3.0 SDK编译使用3.0框架符号的代码。不,您可以根据2.x SDK构建,只是NScReasOfStand获取类名。我认为不能使用原始标头的弱点。我可以想象的一个解决方法是在静态库中构建3.0相关部分,并将其链接到2.0应用程序。我还没有对此进行测试。这可能是一个可行的解决方案。我使用这种技术(dlopen)从3.0框架中提取了一项功能,同时仍然拥有一个2.0兼容的应用程序。如果你只访问3.0类,你就不会有太多问题。听起来不错。您是否已将此提交到应用商店?你打开了哪个图书馆?太好了!这就是我一直在寻找的答案!需要注意的是,有报道称,苹果拒绝了那些链接较弱的应用程序,以便在3.x上运行时使用应用程序内购买(否则,如果低于2.x,则不使用)。那么,你有链接吗?我可以看到苹果对应用程序内购买非常敏感。在任何情况下,我的应用商店中都有一些弱链接MessageUI框架的应用程序。请始终使用可用的最新稳定SDK,将部署目标设置为您希望支持的最低版本。然后编写条件运行时代码:检查是否存在类if(NSClassFromString(@“NSSomeNewClass”){…}检查是否存在方法if([NSSomeClass InstanceRespondToSelector(someSelector:)]){…}