我正在尝试升级应用(Clarke)以提供10.6兼容性。
我的计划是使用两种不同的代码路径,具体取决于所使用的OSX版本。
在10.5上它将使用一个控制器,它由完全自定义代码组成,不依赖于任何特定的Cocoa API。在10.6上,它将使用另一个控制器,它根据相同的抽象类将新的CoreLocation API包装在一个相同的接口中。在运行时,应用程序将通过检测操作系统版本在控制器之间切换。
这适用于10.6 SDK构建的10.6,但同样的构建在10.5上爆发:
10/09/2009 18:30:50 [0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575] dyld: unknown required load command 0x80000022
10/09/2009 18:30:51 com.apple.launchd[403] ([0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575]) Exited abnormally: Trace/BPT trap
如果构建10.5 SDK,显然无法编译CoreLocation。
我希望能够为这个应用程序提供单个二进制文件。有没有办法从10.5中“隐藏”CoreLocation API?
答案 0 :(得分:5)
部署SDK技巧仅在两个平台上具有相同框架但在较新平台上具有新呼叫时才有效。对于CoreLocation,10.5上缺少整个框架,因此您的应用程序无法加载,因为它无法动态绑定到框架。
您需要执行上述操作,并将CoreLocation添加为弱框架。选择Link Frameworks和Binaries构建阶段,在Detail视图中找到CoreLocation,在中间列中将“Required”更改为“Weak”。
当您构建应用程序时,Xcode会将-weak_framework CoreLocation传递给链接器,无论CoreLocation是否存在,您的应用程序都将加载到所有10.5和10.6系统上。除非您实际上在10.6上运行,否则请确保不要调用任何CoreLocation方法。
答案 1 :(得分:4)
您应该可以通过更改目标的构建设置来解决此问题: