在 OS3.x 上运行时 iPhone OS4 功能链接错误

Posted

技术标签:

【中文标题】在 OS3.x 上运行时 iPhone OS4 功能链接错误【英文标题】:IPhone OS4 feature link error while run on OS3.x 【发布时间】:2010-07-05 09:09:51 【问题描述】:

我使用 iPhone 基础 SDK 4.0 编译了一个应用程序,部署目标在 iPhone OS 3.0 上。此应用程序包含 OS 4.0 新功能:本地通知。

在装有 OS 4.0 的 iPod 2G 上运行良好;但是,每次应用程序在装有 OS 3.0 的 iPhone 1G 上启动时,它都会崩溃。似乎是运行时引用错误:

"dyld:未找到符号:_OBJC_CLASS_$_UILocalNotification 引用自:/var/mobile/Applications/73A3FAB1-63AE-4A71-8C6B-932142A728FE/Tapatalk X.app/Tapatalk X 预期在:/System/Library/Frameworks/UIKit.framework/UIKit"

如果SDK3.0和SDK4.0的UIKit框架不同,为什么编译时不报?如何在此应用上应用本地通知功能,而该应用仍可在 OS3.0 的设备上运行?谢谢。

【问题讨论】:

【参考方案1】:

This answer为我解决了问题:

触发该错误是因为 你没有弱链接 UIKit 框架。 UIKit 框架在 iPhone OS 3.2 添加了 UISplitViewController,如果你链接 正常情况下,您的应用程序将 假设这些符号存在于 3.0, 他们没有的地方。

要弱链接一个框架,找到你的 Xcode 中的应用程序目标,检查 它,然后转到常规选项卡。在 该选项卡的底部应该是一个列表 框架,具有类型列。 将 UIKit 的类型从 需要弱化和重建你的 应用。这应该照顾 运行时错误。

这对我来说似乎是安全的,因为 UIKit 总是会出现在我们的目标设备上。

【讨论】:

感谢您的解决方案!顺便说一句,在 XCode4 中,您可以通过单击顶层项目文件夹,然后单击“构建阶段”选项卡来执行此操作。然后打开“Link Binary With Libraries”部分。然后将 UIKit.framework 的设置从“必需”更改为“可选”【参考方案2】:

如果您使用 4.0 SDK 功能并希望支持 3.0 设备,则需要在使用前检查该功能是否存在。

如果你正在使用一个新的类(就像你一样),下面的东西应该可以工作:

Class localNotificationC = NSClassFromString(@"UILocalNotification");
if (localNotificationC) 
    UILocalNotification* localNotification = [[localNotificationC alloc] init];

    // do stuff

    [localNotification release];

else 
    // what to do with the 3.0 SDK

至于为什么编译器不告诉你,好吧,你告诉编译器你使用的是 4.0 SDK,而那些类/方法在 4.0 上工作。

【讨论】:

此错误可能在任何用户代码运行之前发生。我有一个引用 UILocalNotification 的类,按照您的建议正确地将代码包装在一个块中。应用程序在到达该类/方法之前很久就因上述错误而崩溃。 感谢您的回答。但我的问题和jamesh一样。此运行时引用错误发生在应用启动时,直到调用“UILocalNotification”。 ios4 中的新框架肯定需要弱链接到您的应用程序。这样做也不会对 UIKit 造成任何伤害,所以它当然值得一试。我不记得针对 UIKit 的弱链接,尽管通用应用程序的“自动升级”可能已经为我做到了。等我回家看看。 这是正确答案。如果您调用 UILocalNotification 的任何类方法,例如“alloc”,您将在任何代码运行之前收到动态链接错误。如果您像斯蒂芬建议的那样动态地获取课程,那么您就可以了。 Apple 推荐这个,他们当然推荐弱链接 UIKit。【参考方案3】:

我发现这些信息非常有用。但是我的问题是如何测试应用程序在此更改后是否崩溃。

背景是我的 iPad 应用程序遇到了同样的问题。我的 BaseSDK 设置为 4.3,部署目标为 3.2。在 3.2 iPad 上进行临时配置和运行应用程序时,我从未遇到过这种崩溃,它也得到了 Apple 的批准。但用户报告说,当他们在 iPad 3.2 上下载后启动应用程序时,它甚至在显示主屏幕之前就崩溃了。

我在我的代码中使用了 [UILocalNotifition alloc],我认为这可能是以下崩溃的结果: 异常类型:EXC_BREAKPOINT (SIGTRAP) 异常代码:0x00000001, 0xe7ffdefe

我似乎已经按照斯蒂芬的建议通过转换上述语句来解决这个问题。 但是我真的不知道如何测试它。在 3.2 提交之前测试应用程序时,我之前也没有遇到任何崩溃,目前我在启动时也没有遇到任何崩溃。

在将更新推送到应用商店之前,我确实需要验证此修复。有人可以详细说明如何测试吗?如果我可以使用我的应用程序的先前版本重现此崩溃,并且在此修复后当前版本的情况并非如此,那将非常有帮助。

【讨论】:

以上是关于在 OS3.x 上运行时 iPhone OS4 功能链接错误的主要内容,如果未能解决你的问题,请参考以下文章

如何提交在iPhone OS 3和iPhone SDK 4上运行的应用程序版本?

如何提交在 iPhone OS 3 和 iPhone SDK 4 上运行的应用程序版本?

NSUserDefaults 未在 IOS4 中加载

在 iPhone OS4 SDK 中设置重复本地通知的结束日期

为 OS 3.1.3 编译 iphone

iphone有没有FM广播功能?