美文网首页iOS进阶专栏
iOS framework/.a互换

iOS framework/.a互换

作者: 突刺刺 | 来源:发表于2019-04-18 19:51 被阅读0次

需求

  • 有一个工程test.project,接入了自写的SDKSDK.framework,SDK.framework里同时有引用另外自写的other.framework,每次都要一一添加,于是想把other.framework融合进SDK.framework,以后只需要添加一次就好了。

思路

思路1

  • SDK.frameworkother.framework,进行多工程联调。把other.framework当作SDK.framework的子静态库,拿到重新封装后SDK.framework给工程test.project用。如图-1:
    • 结果:
      • 直接运行test.project,报错。
      • other.framework也导入test.project中,运行成功。如图-2:
      • test.projectproducts文件夹,右键show in finder,发现SDK.framworkother.framework并没有融合。如图-3:
    • 结论:这只是在SDK.framework中引用other.framework联调的常规操作,并没有融合,需要在工程test.project中导入other.framework才能正确运行,与 需求不符。
      图-1
      图-2
      图-3

思路2

  • other.framework变成other.a,把other.a融合进SDK.framework中,再把重新封装后SDK.framework给工程test.project用。如图-4:
    • 结果:
      • 工程test.project只导入SDK.framework,运行成功!
      • test.projectproducts文件夹下,用命令class-dump导出test.app.h,发现静态库other.a头文件也在里面,SDK.framework的确融合了other.a。如图-5:
    • 结论: 静态库other.a完全融合进SDK.framework。符合需求
      图-4

如何把 . framework变成 . a

情况1

  • other.framework直接修改成other.a。步骤:
    • framework只是个文件夹,打开other.framework,找到同名的/ 无后缀的文件other,直接改名->other.a,选择添加该扩展名到文件末尾,拖到SDK.framework中引用。
    • 打开other.framework,找到Headers文件夹,拖到SDK.framework中引用。
    • 融合,编译后的SDK.framework拖到test.project中引用
    • 运行test.project,完成。

情况2

  • other.frameworkSDK.framework都是自己写的。会出现以下几种情况比较麻烦:
    • 每次修改other.framework后,要手动按照情况1,把other.framework->other.a,进行融合,太麻烦。
    • other.frameworkSDK.framework进行联调,是可以实时得到最新的other.framework,随时联调。但是这种方式,test.project需要同时拖入other.frameworkSDK.framework,这样又不是本文的需求
  • 思路:
    • .framwork.a都是静态库,本质上是一回事。
    • 上面情况1,说明添加一下后缀就能实现.framework->.a 。反过来去掉后缀,就变成了framework中的二进制文件。
  • 猜测:
    • 那么我们建立一个静态库工程应该可以同时得到.framework.a两种不同后缀的静态库。(如图-5):
      图-5
  • 实践:
    • 按照建立一个framework静态库的方法,建立一个叫other.framework的工程,工程自动生成一个target--->other
    • 在工程上,新添加一个targetlibtest。如图-6/图-7:
    • 运行静态库工程,成功,得到静态库liblibtest.a。如图-8:
    • show in finder,发现不仅有other.framework,而且libtest.a头文件还是齐全的。
    • 按照常规导入.a静态库方法,把libtest.a静态库导入SDK.framework,联调成功!
    • 情况2完成。
      图-6
      图-7
      图-8

细节修改

  • 按照常规静态库工程方法,targetlibtest->Build Phases->Headers/Copy Fiels,选择暴露libtest.h文件
  • 按照常规静态库工程方法,targetlibtest->Build Phases->Compile Sources,选择libtest参与编译的.m文件
  • 设置targetlibtest,最高支持的iOS版本:targetlibtest->Build Settings->Deployment->iOS Deployment Target->iOS10.xxx
  • 设置targetlibtest,最高支持的iOS版本:targetlibtest->Build Settings->Deployment->iOS Deployment Target->iOS10.xxx
  • 设置targetlibtest头文件输出路径:targetlibtest->Build Settings->Packaging->Public Headers Folder Path->$(CONTENTS_FOLDER_PATH)/Headers
  • 设置targetlibtest的名字:targetlibtest->Build Settings->Packaging->Product Name->随便取名
  • 取消targetlibtest自动在名字前加上libtargetlibtest->Build Settings->Executable Prefix->删掉lib
  • 新建一个targetlibtest,配置好.h/.m后,运行报错,发现主头文件other.h中的#import<other/aaa.h>/#import<other/bbb.h>都找不到,解决办法:
    • 设置一个宏定义,当前是编译other.framework时,主头文件other.h加载:
       #import <other/aaa.h>
       #import <other/bbb.h>
      
    • 设置一个宏定义,当前是编译libtest.a时,主头文件other.h加载:
       #import <aaa.h>
       #import <bbb.h>
      
    • 设置targetlibtesttargetlibtest->Build Settings->Apple Clang-Preprocessing->Preprocessor Macros->DebugRelease->FWMK=0
    • 设置targetothertargetother->Build Settings->Apple Clang-Preprocessing->Preprocessor Macros->DebugRelease->FWMK=1
    • 主头文件other.h的代码修改为:
      #if FMWK
      #import <other/aaa.h>
      #import <other/bbb.h>
      #else
      #import <aaa.h>
      #import <bbb.h>
      #endif
      
    • 利用lipo对不同arm.a合并。

相关文章

网友评论

    本文标题:iOS framework/.a互换

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