美文网首页Swift开发
Framework 嵌套与依赖

Framework 嵌套与依赖

作者: 幸运者_Lucky | 来源:发表于2019-11-04 17:37 被阅读0次

    本文都是以 Swift 为基础做测试的.

    静态库 嵌套 其他静态库

    在你的项目中, 使用了一个静态库, 它里面嵌套了另一个静态库.

    1. 如果这个静态以 Embed(嵌套) 的形式引入另一个静态库, 那么嵌套的静态库会包含在当前的静态库的 Frameworks 文件夹中, 如下:

      虽然包含, 但在其他项目使用这个静态库的时候, 并不会动态的把依赖的静态库 link 到这个项目, 直接 build 会报如下错误:

      需要自己手动 link 嵌套的 framework, 如下图:

      把那个依赖库拖入到 Build Phases -> Link Binary With Libraries, 即可解决上面的错误
    2. 如果以 Do Not Embed 的形式引入另一个静态库, 构建这个静态库, 它本身就不包含 Frameworks 文件夹, 需要找到那个依赖的库, 并且拖入到 Build Phases -> Link Binary With Libraries

    动态库 嵌套 其他静态库

    与上面的基本相同, 但使用时, 不需要 link 嵌套的 framework, 拖入即可以使用.
    即使在动态库中, 对这个静态库 Do Not Embed, 在项目中使用动态库的时候依然不需要拖入这个静态库.
    所以动态库引入其他静态库, 无论是 Embed 还是 Do Not Embed, 都会把其他的静态库嵌入到本身, 而且你还可以在你的项目中通过 import StaticFramework 的形式引入这个静态库, 使用他的 public 部分, 但是无法查看 API, 查看的时候会显示:

    ???

    动态库 嵌套 其他动态库

    当前的项目可以给引入的 framework 进行签名, 但是不可以给这个 framework 嵌套的动态库签名, 所以如果你的动态库嵌套其他的动态库, 需要在你构建动态库的时候给他签名, 但是这种签名之后就无法被其他 team 使用, 如下:

    如果在动态库引入另一个动态库使用:

    1. 选择了 Embed & Sign, 则需要上面所描述的
    2. 选择了 Embed & Without Signing, 这个不可以应用在两个动态库嵌套, 会出现如下错误
    dyld: Library not loaded: @rpath/StaticFramework.framework/StaticFramework
      Referenced from: /private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/StaticFramework2
      Reason: no suitable image found.  Did find:
        /private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework: code signature in (/private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
    (lldb) 
    
    1. 选择了 Do Not Embed, 表示这个动态库不嵌入, 但依赖这个库, 所以在使用时需要同时引入这两个动态库.
      所以动态库尽量不要嵌套其他动态库, 而是在项目中同时引入两个动态库进行使用.

    静态库 嵌套 其他动态库

    如果在静态库引入另一个动态库使用:

    1. 选择了 Do Not Embed, 则需要在项目中同时引入两个库, 因为静态库依赖那个动态库, 但没有嵌入.
    2. 选择了 Embed & Sign, 与 静态库 嵌套 其他静态库 相同, 需要拖入依赖的动态库

    总结:

    1. Static Framework
      无论选择 Do Not Embed, 还是 Embed & Sign, 都不会动态连接依赖的库, 需要手动链接.
      但选择 Embed的静态库, 会把依赖的库一起打包到它本身. 如下:


      如果选择 Do Not Embed, 就不会包含 Frameworks 这个文件夹.
    2. Dynamic Framework
      1.嵌套静态库, 始终会把静态库嵌入其中.
      2.引入动态库, 选择 Do Not Embed, 则需要在使用的时候引入依赖的动态库
      选择 Embed 需要对内嵌的动态库进行签名, 而且签名过的库, 只允许同一个 Team 使用.

    所以无论静态库还是动态库都尽量不要嵌套使用, 而是以依赖的方式引用, 这样才更优雅一些.

    IPA processing failed
    上传到 AppStore 不可以包含 x86_64i386

    lipo <文件夹/文件> -remove x86_64 -o <文件夹/文件> // 去除x86_64
    

    使用 Script 删除 x86_64 和 i386

    Todo: Found an unexpected Mach-O header code: 0x72613c21

    Static Library 不可以以嵌入的方式, 而是在 Build Phases -> Link Binary With Libraries 中引用.
    如果加入到 Embed Frameworks 中, 就会报上面的错误

    目前没有测试动态 framework 以嵌入的方式引用静态 framework , 是否会报错.

    相关文章

      网友评论

        本文标题:Framework 嵌套与依赖

        本文链接:https://www.haomeiwen.com/subject/hnvrbctx.html