动态加载 Swift 框架包的 principalClass 为 NIL

Dynamically loaded Swift framework bundle's principalClass is NIL

iOS 应用需要 load/execute/unload 按需捆绑代码的罕见情况。虽然它适用于 Objective-C 框架,但 Swift 框架被证明是一个障碍:Bundle.principleClass 始终如一 returns nil.

我已按照此博客中的示例进行操作 post Plugin Architecture in Swift(ish) plus some other sources like this 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 框架的一些细节:

Swift 框架 Info.plist 中主体 class 的名称应以其模块名称开头。换句话说,如果将 principal class 从 "PluginSwift" 更改为 Info.plist 中的“FrameworkSwift.PluginSwift”,对 principalClass 的调用将 return class而不是零。