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

请教大佬们关于 SDK 对接方面的问题

  •  
  •   XiaoXiaoMagician · 2022-09-19 10:33:15 +08:00 · 8484 次点击
    这是一个创建于 773 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前置说明:

    部门 A ,提供了一个授权认证的 Framework 动态库。
    部门 B ,提供了一个数据收集的 Framework 静态库。
    部门 C ,需要对接 部门 A 和 部门 B 的 SDK 库。

    因为部门 A 的 SDK 的内部含有部门 B 的静态库。导致部门 C 对接两边 SDK 时编译冲突。

    问题:

    1 、部门 A 这边有没有好的办法隔离自身内部包含的 Framework ?(如没有,请看问题 2 )
    2 、由于部门 A 的 SDK 内部需要做数据收集,部门 C 的业务上也需要数据收集,部门 B 则是提供这个服务方。那么有没有什么好的方案能解决这种类似的情况?

    ---------------------------------------------------
    还请大佬们看看如何处理?感激不尽!
    timelessg
        1
    timelessg  
       2022-09-19 10:40:45 +08:00 via Android
    不确定你是什么平台,但都大同小异。首先这个是符号冲突,无解,除非改类名,静态变量,枚举等等。最好的解决办法是两边搞一个 base 库去依赖
    XiaoXiaoMagician
        2
    XiaoXiaoMagician  
    OP
       2022-09-19 10:55:46 +08:00
    @timelessg 就是我们这边是提供授权认证的部门,有个内部对接埋点的需求,数据要上报到数据那边的部门。
    别的部门的 APP 一些业务服务上也需要用到埋点收集。所以,用依赖的话会有初始化数据 SDK 这块的顺序问题。而且上报的数据对应的后台无法区分是哪块的数据。
    xuanbg
        3
    xuanbg  
       2022-09-19 11:02:45 +08:00
    让 A 部门用部门 B 的新版本静态库重新编译动态库,然后你之间用部门 A 编译的动态库就行了。
    shawndev
        4
    shawndev  
       2022-09-19 11:10:46 +08:00
    方案:
    1. 首先通过 lipo 分离部门 A 不同架构的静态库。
    2. 通过 ar -x 将静态库拆解为 .o 文件。
    3. 移除部门 A 中,部门 B 静态库的相关.o
    4. 通过 ar 命令重新生成部门 A 的动态库。

    注意需要确保部门 C 对接的部门 B 库,和部门 A 对接的部门 B 库是同一个版本。不然只能通过阻止符号冲突解决了。
    XiaoXiaoMagician
        5
    XiaoXiaoMagician  
    OP
       2022-09-19 11:12:38 +08:00
    @xuanbg 你的意思是 部门 C 只使用 部门 A 提供的动态库就行了是吗?主要是应为 部门 B 的 SDK 也会给其他部门使用的。毕竟业务不同。
    XiaoXiaoMagician
        6
    XiaoXiaoMagician  
    OP
       2022-09-19 11:24:10 +08:00
    @shawndev 主要是因为数据收集的 SDK 会有一个初始化的调用来设置参数,然后根据参数将数据发往不同的服务器上的。如果只用 1 个库的话就有这种问题。
    是不是直接让 部门 A 通过直接对接服务端 API 的方式去收集数据的好?避免外部依赖?
    dayeye2006199
        7
    dayeye2006199  
       2022-09-19 11:28:45 +08:00 via Android
    典型的💎依赖问题
    XiaoXiaoMagician
        8
    XiaoXiaoMagician  
    OP
       2022-09-19 11:30:21 +08:00
    想知道其他平台对于自身 SDK 内部做数据收集是用什么方案?直接通过接口上报给自己的服务器吗?不使用外部依赖?
    xylophone21
        9
    xylophone21  
       2022-09-19 13:52:12 +08:00
    授权认证模块产生的埋点信息, 其分析责任在部门 A 还是部门 C?

    1. 如果在部门 C,可以使用依赖倒置的方式, 让部门 C 来依赖埋点信息. 授权认证模块只需要把必要信息通知给接口, 不再关心具体埋点数据到哪里了.
    2. 如果在部门 A, 那么数据收集模块应该具备多实例和一定的 API 兼容特性. A 和 C 各自使用自己初始化(参数)的实例.
    3. 如果部门 A 和 C 都要关注, 那么说明 C 这样的业务单元不会太多, 或者在部门 A 内部有负责人, 那么 1 或 2 都可以.
    XiaoXiaoMagician
        10
    XiaoXiaoMagician  
    OP
       2022-09-19 14:40:33 +08:00
    @xylophone21 感谢大佬,大体明白了需要怎样处理的思路。
    pheyer
        11
    pheyer  
       2022-09-19 15:42:14 +08:00
    部门 A 的 SDK 只导出对外公开的符号就行,build setting 有一个设置是类似于 exported symbol 的选项
    XiaoXiaoMagician
        12
    XiaoXiaoMagician  
    OP
       2022-09-19 15:45:31 +08:00
    @pheyer 主要是 部门 A 的 SDK 内部打包了 部门 B 的 SDK ,设置不了对 部门 B 里面的公开符号把?
    BigDogWang
        13
    BigDogWang  
       2022-09-19 16:11:35 +08:00
    部门 A 改成 compileOnly B SDK 就可以了
    pheyer
        14
    pheyer  
       2022-09-19 19:09:54 +08:00
    @XiaoXiaoMagician 相反设置也可以的,指定哪些符号不对外公开,unexported symbol
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2786 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:29 · PVG 08:29 · LAX 17:29 · JFK 20:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.