解决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__

方法2.脚本自动更改 项目名–Swift.h

脚本内容如下:添加脚本方法,请查看我的另一篇教程

#在 项目名.framework/Headers/项目名-Swift.h里面修改内容内容
str1="#if 0"
str2="#elif defined(__arm64__) && __arm64__"
str3="#if defined(__x86_64__) && __x86_64__ || (__arm64__) && __arm64__"
#修改
#1.查找#if 0替换成空
sed -i '' 's/#if 0//g' $fileSwift
#2.查找#elif defined(__arm64__) && __arm64__替换成空
sed -i '' 's/#elif defined(__arm64__) && __arm64__//g' $fileSwift
#3.在1第一行添加字符串#if defined( __x86_64__ ) && __x86_64__ || (__arm64__) && __arm64__
sed -i '' "1 a\\ 
$str3" $fileSwift

完整合并脚本和脚本使用教程

请参照我这篇文章:
swift framework静态库脚本合并教程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Objective-C工程中调用Swift库,需要执行以下步骤: 1. 创建Swift库和Objective-C工程 首先,您需要创建一个Swift库和一个Objective-C工程。在Xcode中,选择File > New > Project,然后选择Swift库和Objective-C工程分别创建它们。 2. 添加Swift库到Objective-C工程 在Objective-C工程中,选择File > Add Files to "工程名",然后选择Swift库的文件。确保选择“Copy items if needed”选项,以便将Swift库文件复制到Objective-C工程中。 3. 创建一个桥接文件 在Objective-C工程中,创建一个桥接文件,用于将Swift库导入Objective-C工程。选择File > New > File > Header File,然后将其命名为“工程名-Bridging-Header.h”。 4. 导入Swift库到桥接文件中 打开桥接文件“工程名-Bridging-Header.h”,添加以下代码: #import "Swift库名称-Swift.h" 这将导入Swift库到Objective-C工程中。 5. 调用Swift库中的方法 现在,您可以在Objective-C代码中调用Swift库中的方法了。首先,确保在需要调用Swift库的Objective-C文件中导入桥接头文件: #import "工程名-Bridging-Header.h" 然后,您可以使用以下代码调用Swift库中的方法Swift库类名 *swiftObj = [[Swift库类名 alloc] init]; [swiftObj Swift方法名称]; 注意:Swift库中的类和方法必须使用@objc修饰符进行标记,以便它们可以在Objective-C代码中使用。例如: @objc class Swift库类名: NSObject { @objc func Swift方法名称() { // Swift方法代码 } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值