解决swift生成framework静态库让oc程序调用模拟器和真机都能通过的合并方法
预备知识
假设你看了我这篇文章:xcode写framework静态库脚本文件合并fat文件教程和踩坑
那么你就学会了用swift生成静态库并且给swift调用无问题,但是给oc调用只能选择真机,或者模拟器,那么oc调用swift静态库真机和模拟器都没问题就要看下面的内容.
swift制作静态库被oc代码调用的问题
假设你已经学会了用swift制作framework静态库,并且用swift写了能让oc调用的类扩展,但是合并文件以后,只能给swift调用,给oc调用的话,就只能选择给真机调用或者是模拟器调用.这个问题,也许是xcode12才出现的,反正以前我没遇到过.
只能给真机或者模拟器使用的原因
原因如下:脚本中的操作,只是合并了fat文件和moudles文件目录,这样给swift调用真机和模拟器都行,但是反向给oc调用会报如下错误:
No visible @interface for ‘xxx’ declares the selector ‘xxx’
这个句话是说没有找到方法定义,
经过2天的反复研究,终于找到了
原因如下:framework中的header目录下有2个文件:
项目名-Swift.h
项目名.h
目录结构如下图所示:
之所以合并了framework文件夹以后,只能选择真机或者模拟器的原因就是这个文件不能合并,只能被覆盖,真机和模拟器这个文件内容不同
解决方法
方法1.手动更改项目名–Swift.h
这个文件如果你是用模拟器生成的静态库framework文件,那么内容如下:
#if 0
#elif defined(__x86_64__) && __x86_64__
#下面省略460行代码..
这个文件如果你是用真机生成的静态库framework文件,那么内容如下:
#if 0
#elif defined(__arm64__) && __arm64__
#下面省略460行代码..
经过对比,这个文件真机和模拟器只有第二行代码不同,这行代码只有__x86_64__ 或者是 arm64_ ,所以当oc调用的时候才只能选择真机或者模拟器
改动如下:
删掉:第1行和第2行,第一行意思是如果是假,则else if ,那么就相当于 是一定执行第2行,第一行一定失败,感觉这句话是用来作为做预留用的.
我把2行改成1行,在中间加了一个||逻辑或符号,代表x86_64或者是 arm64架构都可以运行,这样就完美了.
#if defined(__x86_64__) && __x86_64__ || (__arm64__) && __arm64__
本文地址:https://blog.csdn.net/boildoctor/article/details/112637836