【问题标题】:Dynamically loaded Swift framework bundle's principalClass is NIL动态加载的 Swift 框架包的 principalClass 是 NIL
【发布时间】:2018-07-03 02:25:07
【问题描述】:

iOS 应用需要按需加载/执行/卸载捆绑代码的罕见情况。虽然它适用于 Objective-C 框架,但事实证明 Swift 框架是一个障碍:Bundle.principleClass 始终返回 nil

我遵循了这篇博文Plugin Architecture in Swift(ish) 中的示例以及类似Apple forum post 的其他一些来源。

需要的是 3 个单独的项目(而不是单个项目中的 3 个目标):

FrameworkSwift - framework A
FrameworkObjC - framework B
Main App - loads frameworks on demand

您可以在这里查看代码:

  1. Main app

  2. Objective-C framework

  3. Swift framework

Xcode 项目设置:

如果您尝试构建并运行,控制台将讲述故事:

Loaded bundle: FrameworkObjC.framework , principal class: PluginObjC
Loaded bundle: FrameworkSwift.framework , principal class: N/A

关于 Swift 框架的一些细节:

  • 类是公共的并且扩展了 NSObject
  • 在 Info.plist 中设置了主体类
  • 框架未链接,它们作为二进制文件嵌入
  • 框架项目拖入主项目

【问题讨论】:

    标签: ios objective-c swift cocoa-touch nsbundle


    【解决方案1】:

    Swift 框架的 Info.plist 中的主体类的名称应以其模块名称开头。换句话说,如果您在 Info.plist 中将主体类从“PluginSwift”更改为“FrameworkSwift.PluginSwift”,则对 principalClass 的调用将返回该类而不是 nil。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2010-12-08
      • 1970-01-01
      • 2015-03-04
      相关资源
      最近更新 更多