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

时间:2018-01-24 06:00:49

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

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

  4. Xcode项目设置:

    Xcode project setup looks like so

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

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

    有关Swift框架的一些细节:

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

1 个答案:

答案 0 :(得分:0)

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