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 · 9139 次点击
    这是一个创建于 780 天前的主题,其中的信息可能已经有所发展或是发生改变。
    静态库 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   ·   实用小工具   ·   5184 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.