iOS 两个 Swift 静态库调用问题

2022-09-20 13:07:57 +08:00
 XiaoXiaoMagician
静态库 A 和 静态库 B 之间没有依赖关系。
怎样能使 静态库 A 里面判断 静态库 B 是否存在?从而去调用 静态库 B 的某个方法?

具体需求:
自己开发的 SDK 内部需要知道是否有某个 SDK 引入到项目中了,从而去调用它的某个 API 。可以做到吗?

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/881537

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX