1
luckyzd 2022-09-20 13:35:34 +08:00
用 respondsToSelector 判断下 B 的方法是否能调用
|
2
XiaoXiaoMagician OP @luckyzd 没办法获取到方法,返回的结果一直就是 false
|
3
Building 2022-09-20 15:05:11 +08:00
对象用 id ,NSSelectorFromString 声明方法,PerformSelectorWithObject 执行,但是不太安全
|
4
loarland 2022-09-20 15:20:05 +08:00
__has_include
|
5
xtinput 2022-09-20 15:40:07 +08:00
swift ? #if canImport(xxx) 不就 OK 了?
|
6
XiaoXiaoMagician OP @xtinput 试了一下,不行。我加了对应静态库去判断还是没走到逻辑内。
|
7
xtinput 2022-09-20 16:08:10 +08:00
@XiaoXiaoMagician 用协议吧,在 A 里面定义一个协议,协议定义一个方法,在主项目里面实现这个协议,然后在协议的方法里面调用 B 的方法,这样 A 就不需要和 B 有依赖关系了,我就是这么处理的。
|
8
MrKrabs 2022-09-20 16:18:16 +08:00
dlsym
|
9
XiaoXiaoMagician OP @xtinput 那也不行,因为我是 SDK 提供方,所以是想像组件化那样做。但是某个库它是不需要依赖的,可以独立运行。
所以想着,对接方如果接入了我们体系下的 SDK 只需要调用主库的初始化就好。其他库的初始化内部一起帮他调用了。 |
10
XiaoXiaoMagician OP 找到方法了。需要让项目方在 Build Settings -> Other Linker Flags 里添加 -ObjC 标识。这样其实就类似把静态库变成了动态库。让 OC 的类会调用到 load 方法。然后在 load 方法里处理相关接口的注册。
单纯 Swift 的话暂时找不到实现方案。只能通过添加一个 OC 的类利用它的 load 方法来实现处理。 |
11
xtinput 2022-09-21 07:43:04 +08:00
@XiaoXiaoMagician 在 load 方法里面判断是否有你需要的接口?没有就自己注册一个?协议的默认实现也能做到 load 方法的效果
|
12
MrKrabs 2022-09-21 08:31:17 +08:00
@_silgen_name("lib_func")
public func lib_func() { print(#fileID) } let symbol = dlsym(UnsafeMutableRawPointer(bitPattern: Int(-2)), "lib_func") let functionPointer = unsafeBitCast(symbol, to: (@convention(c) () -> ()).self) functionPointer() |
13
XiaoXiaoMagician OP @xtinput 协议的默认实现需要怎么做类似效果?能详细说明一下吗?
|
14
xtinput 2022-09-21 10:39:18 +08:00
@XiaoXiaoMagician 把你的 OC load 方法里面的实现直接用 swift 在调用之前执行也一样呀,不建议用 load ,load 方法是有加载顺序的,如果你的 load 调用的时候 B 还没加载那就有问题了。
|
15
XiaoXiaoMagician OP @xtinput 但是这样就总会有一方依赖呀。需要在互相不依赖的情况下去注册到服务。
|
16
XiaoXiaoMagician OP @xtinput 至于你说的 load 顺序问题,也可以被解决。就简单的通知收发处理都可以。
被调用就都先注册通知,然后发送对应通知。两边在通知接收处理里发送完 object 后移除掉对应接收通知就好了。 |
17
xtinput 2022-09-21 17:32:26 +08:00
@XiaoXiaoMagician 在 A 里面调用前判断是否存在 B ,然后进行调用也是一样的呀,只是把判断时机从 load 延迟到运行时了
|
18
XiaoXiaoMagician OP @xtinput 噢,我明白了。感谢大佬
|