动态加载 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
您可以在此处查看代码:
Xcode 项目设置:
如果您尝试构建 运行,控制台将显示以下内容:
Loaded bundle: FrameworkObjC.framework , principal class: PluginObjC
Loaded bundle: FrameworkSwift.framework , principal class: N/A
关于 Swift 框架的一些细节:
- class 是 public 并扩展了 NSObject
- 主体 class 设置在 Info.plist
- 框架未链接,它们作为二进制文件嵌入
- 框架项目拖入主项目
Swift 框架 Info.plist 中主体 class 的名称应以其模块名称开头。换句话说,如果将 principal class 从 "PluginSwift" 更改为 Info.plist 中的“FrameworkSwift.PluginSwift”,对 principalClass 的调用将 return class而不是零。
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
您可以在此处查看代码:
Xcode 项目设置:
如果您尝试构建 运行,控制台将显示以下内容:
Loaded bundle: FrameworkObjC.framework , principal class: PluginObjC
Loaded bundle: FrameworkSwift.framework , principal class: N/A
关于 Swift 框架的一些细节:
- class 是 public 并扩展了 NSObject
- 主体 class 设置在 Info.plist
- 框架未链接,它们作为二进制文件嵌入
- 框架项目拖入主项目
Swift 框架 Info.plist 中主体 class 的名称应以其模块名称开头。换句话说,如果将 principal class 从 "PluginSwift" 更改为 Info.plist 中的“FrameworkSwift.PluginSwift”,对 principalClass 的调用将 return class而不是零。