【问题标题】:How do you #include frameworks at run time你如何在运行时#include 框架
【发布时间】:2016-01-02 14:58:24
【问题描述】:

我在 App Store 中有一个应用,其支持的最低版本是 iOS 7.1。

对于下一个版本,我对其进行了增强,以使用 iOS 8 中引入的 Photos 框架。

在应用程序的下一个版本的代码中,我确保如果它在 iOS 7 设备上运行,新功能是隐藏的。

但是,当我尝试在我的 iOS 7.1 测试设备上运行该应用程序时,它失败了,因为我在许多类中包含了 Photos 框架,使用:

#import <Photos/Photos.h>

我在 Xcode 中收到的错误是:

“dyld:库未加载:/System/Library/Frameworks/Photos.framework/Photos 引用自:/var/mobile/Applications/2CA13C9B-EABC-47C3-A198-A7C703EACD59/ABCapp.app/ABCapp 原因:找不到图片”

有什么方法可以在运行时而不是编译时执行此操作,以确保我仍然可以支持 iOS 7?

谢谢。

【问题讨论】:

  • #import 语句在运行时不会导致任何问题。那不是你的问题。 1) 使用有关崩溃的详细信息更新您的问题。 2) 请务必阅读 iOS 文档中的“SDK 兼容性指南”,了解如何执行所需操作的详细信息。
  • 参见stackoverflow.com/questions/14002304/… 了解如何操作的示例。
  • 谢谢@rmaddy 我在上面添加了更多细节。看起来我需要对整个照片框架进行弱链接,而不仅仅是一个类。 .. 正在尝试找到正确的语法。
  • 您没有将框架设为可选。
  • 成功了,谢谢@rmaddy。

标签: ios objective-c frameworks include photosframework


【解决方案1】:

使用framework weak linking

当框架中的符号被定义为弱链接时,该符号不必在运行时出现以使进程继续运行。静态链接器在引用该符号的任何代码模块中识别弱链接符号。动态链接器在运行时使用相同的信息来确定进程是否可以继续运行。如果框架中不存在弱链接符号,则代码模块只要不引用该符号就可以继续运行。

还有here's Marco Arment take on weak linking

如果您希望您的 iPhone 或 iPad 应用程序与旧版本的操作系统一起使用,或者如果您想制作一个可在 iPhone 和 iPad 上运行的通用应用程序,您需要确保代码永远不会尝试调用方法或实例化其操作系统上不存在的对象。 [...] 避免所有这些的另一个选项是弱链接,这使得运行时在第一次使用之前手动查找每个符号的存在。

【讨论】:

  • 这是一个 iOS 问题。您应该链接到 iOS 文档,而不是 Mac 文档。
  • @rmaddy 刚刚发现它的内容完全相同,但在“iOS 开发人员库”中。呵呵,我不认为 Apple 会费心为 iOS 开发者改编文档:/
  • 感谢@GuillaumeAlgis,看起来我需要做的是整个照片框架的弱链接,尽管我正在努力寻找正确语法的示例。 #import -weak_framework <Photos/Photos.h> 不起作用,Apple 文档也不是很清楚。现在正在搜索,但如果您碰巧知道,那将非常有帮助,谢谢。
  • -weak_framework 是一个 clang 标志,而不是一个 #import 参数。见stackoverflow.com/questions/6480765/…。但我建议您继续搜索,了解您的工作总是很好:)
  • 感谢@GuillaumeAlgis,与整个框架的弱链接就是答案。让我感到困惑的是我没有在项目目标中包含照片框架,我只是将它包含在代码中。一旦我将它添加到目标并使其成为可选,根据 rmaddy 的建议,它工作得很好。谢谢!
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 2023-03-24
  • 2011-12-05
  • 2017-09-13
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多