我已经在iPhone OS 3.0上使用IPhone base SDK 4.0编译了一个应用程序。此应用程序包含OS 4.0新功能:本地通知。
适用于OS 2的iPod 2G;然而,每次应用程序启动iPhone 1G OS 3.0时它都会崩溃。它似乎是运行时引用错误:
“dyld:未找到符号:_OBJC_CLASS _ $ _ UILocalNotification 参考自:/ var / mobile / Applications / 73A3FAB1-63AE-4A71-8C6B-932142A728FE / Tapatalk X.app/Tapatalk X 预计在:/System/Library/Frameworks/UIKit.framework/UIKit“
如果UIDit框架在SDK3.0和SDK之间有所不同SDK4.0,为什么编译时不报告?如何在此应用程序上应用本地通知功能,而应用程序仍可在运行OS3.0的设备上运行?谢谢。
答案 0 :(得分:8)
This answer为我解决了这个问题:
该错误正在被触发,因为 你并没有弱化UIKit 框架。 UIKit框架 iPhone OS 3.2添加了 UISplitViewController,如果你链接 它正常应用程序 假设这些符号存在于3.0, 他们没有。
要弱化框架,找到你的 Xcode中的应用程序目标,检查 它,然后转到常规选项卡。在 该选项卡的底部应该是一个列表 框架,带有Type列。 从中更改UIKit的类型 要求弱和重建你的 应用。这应该照顾 运行时错误。
这对我来说似乎是安全的,因为UIKit总是会出现在我们正在瞄准的设备上。
答案 1 :(得分:1)
如果您使用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。
答案 2 :(得分:0)
我发现这些信息非常有用。但是我的问题是如何在此更改后测试应用程序是否崩溃。
背景是我的iPad应用程序遇到了同样的问题。我将BaseSDK设置为4.3,部署目标为3.2。在3.2 iPad上进行临时配置和运行应用程序时,我从来没有遇到过这种崩溃,而且Apple也批准了它。但是用户报告称,当他们在iPad 3.2上下载后启动应用程序时,它会在显示主屏幕之前崩溃。
我在我的代码中使用了[UILocalNotifition alloc],我认为这可能是下面崩溃的结果: 例外类型:EXC_BREAKPOINT(SIGTRAP) 例外代码:0x00000001,0xe7ffdefe
我似乎已根据斯蒂芬的建议修改了上述陈述。 但是我真的不知道如何测试它。在3.2上提交之前测试应用程序时我也没有遇到任何崩溃,目前我也没有在启动时遇到任何崩溃。
在将更新推送到应用商店之前,我确实需要验证此修复程序。有人可以更多地了解如何测试这个吗?如果我可以使用我的应用程序的先前版本重现此崩溃将非常有用,并且在此修复之后与当前版本的情况不同。