【问题标题】:How to tell (at runtime) if a library was linked using cocoapods or not?如何判断(在运行时)库是否使用 cocoapods 链接?
【发布时间】:2017-10-17 01:42:26
【问题描述】:

我知道这可能是不可能的,但是 cocoapods 留下的足迹是否可以指出(在运行时)是否使用 cocoapods 安装了库?

我目前能够通过获取类名称列表然后查找具有PodsDummy_Pods_ 前缀的类来确定是否使用了 CocoaPods。但是我无法知道给定的库是否使用 CocoaPods 链接。

编辑

澄清:我可以访问库源代码,但我无法控制最终项目。该库作为二进制(静态库)分发,我们想知道用户是否使用 CocoaPods 安装了它。

【问题讨论】:

  • 这个问题来自二进制文件吗?还是来自一个项目?我的意思是,你想知道是否使用了任何 Cocoapods 库.. 对吗?你想从哪里找到它?来自 IPA 文件还是来自项目本身?
  • 这是一个二进制(静态)库,我可以访问该库的源代码。

标签: ios runtime cocoapods


【解决方案1】:

我想这主要取决于您是否可以控制库。

如果你不这样做,不,不是真的。那些PodsDummy- 类存在于目标级别,因此它们只是表明 CocoaPods已被使用。但是,它不会告诉您某个特定的库是否使用了 CocoaPods。

对于源代码库,CocoaPods 可以添加额外的构建标志,这些标志可以公开额外的 API 或字符串,您可以以相同的方式查找它们。已经添加了一个 "COCOAPODS" 构建标志,所以它可以使用它。

对于二进制库,这是可能的,但有点棘手。理论上:您可以在 lib/framework 中添加一个可以在运行时发现的符号,然后在 Podspec 的 prepare_command 中添加可以删除的符号。我不知道什么命令会这样做,但可能是arstriplipo

【讨论】:

  • 我对库有控制权,Pod提供了二进制文件,所以这里只应用第三种选项,这是个好主意,但是库是一个静态框架,这意味着只有符号实际使用的将在最终版本中复制,因此在发布模式下不会出现此虚拟符号...
  • 现在......我们可以在代码中引用这个符号,但只有当符号存在时,这可能会欺骗编译器以始终包含它。
  • 我会给你赏金给你,因为这是迄今为止我见过的最好的主意。但我不会给你票。
【解决方案2】:

一种可能的解决方案是将所有 Pod 库放入单独的包中。您的项目可能有几个捆绑包。因此,您可以在 Swift 中的运行时 Bundle(for: type(of: self)) 或 [NSBundle bundleForClass:[self class]] 在 ObjC 中

【讨论】:

  • 我可以控制库,但不能控制最终项目,所以我无法强制执行。
  • 如果您的情况可以接受一些初步注册类的想法,有 2 种可能的解决方案允许在库的图像加载到内存后运行一些注册代码 1. 主体类的用法框架及其加载方法 2. 在库的单独文件中使用 C 函数和 __attribute 构造函数将由应用加载}
  • 我明白这一点,但是如果你在两个不同的应用程序中拥有同一个库的副本,一个使用 cocoapods 安装它,一个没有,你如何区分两者使用这个?
  • 据我所知,Cocoa pods 规范允许为库分配特定的编译标志,您可以尝试分配自定义 .compiler_flags -DCOCOAPODS 然后您可以在源代码中使用以分隔代码中的 2 个分支。下一个可能的方法是使用 .source_files 列表并添加一些特定文件以通过可可豆进行安装
  • 但是编译标志只存在于编译时,而且库已经编译好了,所以不会有任何区别。
【解决方案3】:

这似乎是不可能自动检测到的,所以我们解决了这个问题:我们在 Podfile 中添加了一个自定义的resource_bundle,然后我们只是在运行时检查它是否存在,如果存在我们确定该库是使用 CocoaPods 安装的。

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多