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

问题描述:

我已经编译了一个应用程序,其中包含基于iPhone 4.0 SDK的iPhone OS 3.0上的部署目标。这个应用程序包含OS 4.0新功能:本地通知。在OS3.x上运行时,iPhone OS4功能链接错误

它适用于使用OS 4.0的iPod 2G;然而,每次该应用程序启动与OS 3.0的iPhone 1G时,它崩溃。这似乎是运行时引用错误:

“使dyld:找不到符号:_OBJC_CLASS _从引用$ _ UILocalNotification :在/ var /移动/应用/ 73A3FAB1-63AE-4A71-8C6B-932142A728FE/Tapatalk X.app/Tapatalk X 预计在:/System/Library/Frameworks/UIKit.framework/UIKit”

如果UIKit框架是SDK3.0 & SDK4.0之间是不同的,它为什么不同时编制报告?如何在此应用程序上应用本地通知功能,而应用程序仍可以在装有OS3.0的设备上运行?谢谢。

This answer解决了这个问题对我来说:

That error is being triggered because you didn't weak-link the UIKit framework. The UIKit framework in iPhone OS 3.2 added the UISplitViewController, and if you link it in as normal your application will assume those symbols exist on 3.0, where they don't.

To weak-link a framework, find your application target in Xcode, inspect it, and go to the General tab. At the bottom of that tab should be a list of frameworks, with a column for Type. Change the Type for UIKit from Required to Weak and rebuild your application. That should take care of the runtime errors.

这似乎还给我,因为UIKit中总是会成为我们靶向的设备上。

+0

谢谢。这似乎工作! – user268743 2010-07-06 03:18:42

+2

感谢您的解决方案!顺便说一句,在XCode4中,您可以通过点击*项目文件夹来完成此操作,然后单击“构建阶段”选项卡。然后打开“链接二进制库”部分。然后将UIKit.framework的设置从“必需”更改为“可选” – Harris 2011-07-16 22:35:23

如果您使用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上工作。

+0

在运行任何用户代码之前可能发生此错误。我有一个引用UILocalNotification的类,正如你所建议的那样,将代码正确地包装在一个块中。这个应用程序在上述错误发生之前就崩溃了,很久以前它就到达了该类/方法。 – jamesh 2010-07-05 09:55:16

+0

感谢您的回答。但我的问题与jamesh相同。运行时引用错误是在应用程序启动时发生的,直到调用“UILocalNotification”为止。 – user268743 2010-07-05 10:21:11

+0

iOS4中的新框架肯定需要与您的应用程序弱联系。它也不会对UIKit造成任何伤害,所以它肯定值得尝试。我不记得对UIKit的弱连接,尽管通用应用程序的“自动升级”可能为我做了这些。我会检查什么时候回家。 – 2010-07-05 10:32:52

我发现这个信息真的很有用。然而,我的问题是如何测试应用程序崩溃或没有这种变化后。

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

我使用[UILocalNotifition页头]在我的代码,我认为可能是出于以下的碰撞结果: 异常类型:EXC_BREAKPOINT(SIGTRAP) 异常代码:00000001,0xe7ffdefe

我似乎已经解决了这个按斯蒂芬的建议转换上述说法。 但是我真的不知道如何测试它。在3.2版提交之前测试应用程序时,我也没有收到任何崩溃,目前也没有在启动时发生崩溃。

在将更新推送到应用商店之前,我确实需要验证此修复程序。请问有人可以提供更多关于如何测试的信息吗?如果我可以使用以前版本的应用程序重现此崩溃,并且在此修复程序之后的当前版本中不是这种情况,那将非常有帮助。