OGeek|极客世界-中国程序员成长平台

标题: ios - 存档时,Facebook调整了CocoaPods链接器错误 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 21:24
标题: ios - 存档时,Facebook调整了CocoaPods链接器错误

我通过CocoaPods将Facebook Tweaks添加到了我的项目中,现在我想通过TestFlight与一些测试人员共享该应用程序。默认情况下,Tweaks在Release版本中被停用(在存档分发时使用),因此我执行了以下操作:

  • 通过复制原始方案
  • 创建了一个新方案“MyApp TestFlight”
  • 在项目信息屏幕中添加了一个名为“TestFlight”的Build配置(除了预先配置的“Debug”和“Release”之外。当被问到我想继承哪个设置时,我使用了“Release”配置。)
  • 在“MyApp Testflight”方案中,将用于“存档”的构建配置设置为“TestFlight”。
  • 在预处理器宏中,我为FB_TWEAK_ENABLED宏定义了不同的值,Facebook Tweaks库使用该值来启用和禁用它的用法。由于我当然不希望在Release配置中启用Tweaks(例如,对于App Store),但是我确实希望能够分发通过TestFlight启用了Tweaks的应用程序,因此我在Debug和TestFlight配置中激活了Tweaks,但在发布配置。
  • 我通过在Debug配置中将FB_TWEAK_ENABLED在0和1之间切换来验证激活和停用Tweaks的有效性。

  • 到目前为止,一切正常,我可以使用预处理程序常量激活停用Tweaks。我还验证了,使用不同的方案运行会按预期更改预处理器常量。

    因此,无论是否启用Tweaks,我都可以成功运行该应用程序。但是,当我尝试对其进行存档时,它会失败并显示链接器错误:
    Undefined symbols for architecture armv7:
    "__FBTweakIdentifier", referenced from:
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_254 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_277 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2102 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2125 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2150 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2171 in SUPConfirmPaymentView.o
      ...
    

    ld:找不到架构armv7的符号
    clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

    对于armv7s和arm64,还有更多这样的错误。
    但是我的项目,目标以及Pods项目中的库和Pods项目本身都已将ArchitcturesValid Architectures设置为“arm64 armv7 armv7s”。

    记录一下:我的SUPConfirmPaymentView setup方法做了很多这样的调用:
    // setup animation constants
    FBTweakBind(self, beatEnlargementFactor, @"Confirm Payment View", @"Beat Animation", @"scale factor", 1.1, 1.0, 3.0);
    

    但是我不认为这是问题所在,因为它可以在调试版本中使用,我想这只是链接器注意到问题的第一位。

    那么有效的方法是:
  • 使用DEBUG配置在模拟器或设备上运行,该配置易于使用FB_TWEAK_ENABLED=1
  • 使用DEBUG配置在模拟器或设备上运行,该配置易于使用FB_TWEAK_ENABLED=0
  • 使用RELASE配置存档,其中FB_TWEAK_ENABLED=0
  • 使用具有FB_TWEAK_ENABLED=0
  • 的TestFlight配置在模拟器或设备上运行
  • 使用TestFlight配置存档,该配置具有FB_TWEAK_ENABLED=0

  • 什么不起作用
  • 使用具有FB_TWEAK_ENABLED=1
  • 的TestFlight配置在模拟器或设备上运行
  • 使用TestFlight配置存档,该配置具有FB_TWEAK_ENABLED=1

  • 我不明白为什么它不起作用,因为它应该与Release配置相同(我从中复制了它),并且确实起作用,除了这个常量之外。使用该常量的调试版本可以正常工作。

    任何想法出什么事了吗?

    编辑:
    感谢@alloy在CocoaPods上指出此问题:https://github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425
    似乎有关。

    因此,我从问题讨论中使用了以下代码:
    #if defined(DEBUG) && DEBUG
    #warning DEBUG=1
    #else
    #warning DEBUG=0
    #endif
    

    并将其复制到SUPConfirmPaymentView.m。

    结果是这样的:

    仅通过粘贴代码,我就已经为Debug = 1感到烦恼,这是由于Xcode的连续编译(显然使用DEBUG标志)。
    但是,当使用Archive时,我得到的结果超出了我的理解,据Target所知,那些警告都来自于此Archive版本。这意味着预处理器(?)两次传递.m文件,一次是DEBUG = 1,一次是Debug = 0,这可以解释问题。
    但这又引发了另外两个问题:
  • 为什么它会两次传递.m文件,如果它只是一个.m文件,它应该只传递一次(我知道为什么.h文件会发生这种情况)
  • 为什么DEBUG = 1?那是哪里来的

  • 编辑2:
    按照@alloy的建议,我将“TestFlight”目标重新创建为“调试”目标的副本。它仍然没有构建,这很可能是由于CocoaPods没有使用调试配置。
    如何使它使用调试配置? @alloy提到了有关:debug的内容,但是我不知道如何使用它,也没有找到有关它的任何文档。
    我当前的Podfile看起来像这样(不包括项目):
    platform :ios, '7.0'
    pod 'AFNetworking', '~> 2.0'
    pod 'Tweaks' 
    

    当将其用于“TestFlight”配置时,如何使用:debug语法使CocoaPods在调试配置中构建Tweaks库?



    Best Answer-推荐答案


    我认为您正在遇到这个问题:https://github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425

    (我不会交叉粘贴一个很长的答案及其所有上下文,最好是在票务跟踪器上阅读该问题。)

    关于ios - 存档时,Facebook调整了CocoaPods链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23013858/






    欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4