请教大佬们关于 SDK 对接方面的问题 - 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

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

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

    部门 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
    nbsp;   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
      &bsp; 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     Solana     5730 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:21 PVG 14:21 LAX 23:21 JFK 02:21
    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