我通过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项目本身都已将Architctures 和Valid 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-推荐答案 strong>
我认为您正在遇到这个问题:https://github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425。
(我不会交叉粘贴一个很长的答案及其所有上下文,最好是在票务跟踪器上阅读该问题。)
关于ios - 存档时,Facebook调整了CocoaPods链接器错误,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23013858/
|