iOS 两个 Swift 静态库调用问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
XiaoXiaoMagician
V2EX    iDev

iOS 两个 Swift 静态库调用问题

  •  
  •   XiaoXiaoMagician 2022-09-20 13:07:57 +08:00 9573 次点击
    这是一个创建于 1116 天前的主题,其中的信息可能已经有所发展或是发生改变。
    静态库 A 和 静态库 B 之间没有依赖关系。
    怎样能使 静态库 A 里面判断 静态库 B 是否存在?从而去调用 静态库 B 的某个方法?

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

    自己试了一下用 NSClassFromString(className) 在静态库下获取不到对应的类,都是返回的 nil 。
    18 条回复    2022-09-21 17:54:07 +08:00
    luckyzd
        1
    luckyzd  
       2022-09-20 13:35:34 +08:00
    用 respondsToSelector 判断下 B 的方法是否能调用
    XiaoXiaoMagician
        2
    XiaoXiaoMagician  
    OP
       2022-09-20 14:02:34 +08:00
    @luckyzd 没办法获取到方法,返回的结果一直就是 false
    Building
        3
    Building  
       2022-09-20 15:05:11 +08:00
    对象用 id ,NSSelectorFromString 声明方法,PerformSelectorWithObject 执行,但是不太安全
    loarland
        4
    loarland  
       2022-09-20 15:20:05 +08:00
    __has_include
    xtinput
        5
    xtinput  
       2022-09-20 15:40:07 +08:00
    swift ? #if canImport(xxx) 不就 OK 了?
    XiaoXiaoMagician
        6
    XiaoXiaoMagician  
    OP
       2022-09-20 16:00:06 +08:00
    @xtinput 试了一下,不行。我加了对应静态库去判断还是没走到逻辑内。
    xtinput
        7
    xtinput  
       2022-09-20 16:08:10 +08:00
    @XiaoXiaoMagician 用协议吧,在 A 里面定义一个协议,协议定义一个方法,在主项目里面实现这个协议,然后在协议的方法里面调用 B 的方法,这样 A 就不需要和 B 有依赖关系了,我就是这么处理的。
    MrKrabs
        8
    MrKrabs  
       2022-09-20 16:18:16 +08:00
    dlsym
    XiaoXiaoMagician
        9
    XiaoXiaoMagician  
    OP
       2022-09-20 16:55:20 +08:00
    @xtinput 那也不行,因为我是 SDK 提供方,所以是想像组件化那样做。但是某个库它是不需要依赖的,可以独立运行。
    所以想着,对接方如果接入了我们体系下的 SDK 只需要调用主库的初始化就好。其他库的初始化内部一起帮他调用了。
    XiaoXiaoMagician
        10
    XiaoXiaoMagician  
    OP
       2022-09-20 17:28:53 +08:00
    找到方法了。需要让项目方在 Build Settings -> Other Linker Flags 里添加 -ObjC 标识。这样其实就类似把静态库变成了动态库。让 OC 的类会调用到 load 方法。然后在 load 方法里处理相关接口的注册。
    单纯 Swift 的话暂时找不到实现方案。只能通过添加一个 OC 的类利用它的 load 方法来实现处理。
    xtinput
        11
    xtinput  
       2022-09-21 07:43:04 +08:00
    @XiaoXiaoMagician 在 load 方法里面判断是否有你需要的接口?没有就自己注册一个?协议的默认实现也能做到 load 方法的效果
    MrKrabs
        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()
    XiaoXiaoMagician
        13
    XiaoXiaoMagician  
    OP
       2022-09-21 10:02:04 +08:00
    @xtinput 协议的默认实现需要怎么做类似效果?能详细说明一下吗?
    xtinput
        14
    xtinput  
       2022-09-21 10:39:18 +08:00
    @XiaoXiaoMagician 把你的 OC load 方法里面的实现直接用 swift 在调用之前执行也一样呀,不建议用 load ,load 方法是有加载顺序的,如果你的 load 调用的时候 B 还没加载那就有问题了。
    XiaoXiaoMagician
        15
    XiaoXiaoMagician  
    OP
       2022-09-21 14:05:16 +08:00
    @xtinput 但是这样就总会有一方依赖呀。需要在互相不依赖的情况下去注册到服务。
    XiaoXiaoMagician
        16
    XiaoXiaoMagician  
    OP
       2022-09-21 14:31:45 +08:00
    @xtinput 至于你说的 load 顺序问题,也可以被解决。就简单的通知收发处理都可以。
    被调用就都先注册通知,然后发送对应通知。两边在通知接收处理里发送完 object 后移除掉对应接收通知就好了。
    xtinput
        17
    xtinput  
       2022-09-21 17:32:26 +08:00
    @XiaoXiaoMagician 在 A 里面调用前判断是否存在 B ,然后进行调用也是一样的呀,只是把判断时机从 load 延迟到运行时了
    XiaoXiaoMagician
        18
    XiaoXiaoMagician  
    OP
       2022-09-21 17:54:07 +08:00
    @xtinput 噢,我明白了。感谢大佬
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5462 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:41 PVG 14:41 LAX 23:41 JFK 02:41
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86