繁体   English   中英

存档时,Facebook调整了CocoaPods链接器错误

[英]Facebook Tweaks with CocoaPods linker error when archiving

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

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

  5. 我通过在Debug配置中将FB_TWEAK_ENABLED在0和1之间切换来验证激活和停用Tweaks的FB_TWEAK_ENABLED

到目前为止,一切正常,我可以使用我的预处理程序常量激活停用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,还有更多这样的错误。 但我的项目,以及目标,以及在吊舱项目库和荚项目本身都有ArchitcturesValid Architectures设置为“arm64的ARMv7 armv7s”。

记录SUPConfirmPaymentView setup :我的SUPConfirmPaymentView setup方法做了很多这样的调用:

// setup animation constants
FBTweakBind(self, beatEnlargementFactor, @"Confirm Payment View", @"Beat Animation", @"scale factor", 1.1, 1.0, 3.0);

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

那么有效的方法是:

  • 使用fas FB_TWEAK_ENABLED=1 DEBUG配置在模拟器或设备上运行
  • 使用fas FB_TWEAK_ENABLED=0 DEBUG配置在模拟器或设备上运行
  • 使用RELASE组态进行归档,其配置为FB_TWEAK_ENABLED=0
  • 使用具有FB_TWEAK_ENABLED=0 TestFlight配置在模拟器或设备上运行
  • 使用具有FB_TWEAK_ENABLED=0 TestFlight配置存档

什么不起作用

  • 使用具有FB_TWEAK_ENABLED=1 TestFlight配置在模拟器或设备上运行
  • 使用具有FB_TWEAK_ENABLED=1 TestFlight配置进行存档

我不明白为什么它不起作用,因为它应该与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,这可以解释问题。 但这又引发了另外两个问题:

  1. 为什么它会两次传递.m文件,因为它只是一个.m文件,所以应该只传递一次(我知道为什么.h文件会发生这种情况)
  2. 为什么DEBUG = 1? 那是哪里来的

EDIT2:我重新创建了“ TestFlight”目标,以作为@alloy建议的Debug目标的副本。 它仍然没有构建,这很可能是由于CocoaPods没有使用调试配置。 如何使它使用调试配置? @alloy提到了有关:debug ,但是我不知道如何使用它,也没有找到任何有关它的文档。 我当前的Podfile看起来像这样(不包括项目):

platform :ios, '7.0'
pod 'AFNetworking', '~> 2.0'
pod 'Tweaks' 

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM