Braintree iOS SDK 和 Card I/O iOS SDK 之间的冲突:架构 armv7 的重复符号

Posted

技术标签:

【中文标题】Braintree iOS SDK 和 Card I/O iOS SDK 之间的冲突:架构 armv7 的重复符号【英文标题】:Conflict between the Braintree iOS SDK & Card I/O iOS SDK: duplicate symbols for architecture armv7 【发布时间】:2014-12-20 08:50:50 【问题描述】:

在我正在开发的应用程序中(使用 Xcode 6.1,适用于 ios 7&8),我使用 Card IO 捕获信用卡信息并使用 Braintree 作为付款方式。当我包含 Card IO iOS SDK 以及由 Cocoapods 导入的 Braintree iOS SDK 时出现问题,我得到了错误:

重复符号 _OBJC_CLASS_$_CardIOCreditCardInfo 在: /MyApp/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) 重复符号 _OBJC_CLASS_$_CardIOPaymentViewController 在: /MyApp/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) 重复符号 _OBJC_CLASS_$_CardIOView 在: /MyApp/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) 重复符号 _OBJC_METACLASS_$_CardIOCreditCardInfo 在: /MyApp/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) 重复符号 _OBJC_METACLASS_$_CardIOPaymentViewController 在: /MyApp/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) 重复符号 _OBJC_METACLASS_$_CardIOView 在: /MyApp/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile.a(libCardIO.a-armv7-master.o) /MyApp/CardIO/libCardIO.a(libCardIO.a-armv7-master.o) ld:架构 armv7 的 6 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

原来 Braintree 包含 Paypay SDK,其中已经包含 CardIO 的库。

我试过了 1)删除(remove reference) CardIO文件夹下的libCardIO.a,APP可以编译运行,但是CardIO的view controller和camera无法正常打开。 2)从 Braintree 中删除(删除引用)Paypal 文件夹,出现以下错误。

架构 armv7 的未定义符号: “_OBJC_CLASS_$_BTPayPalButton”,引用自: libPods-Vinyo-2-Braintree.a(Braintree.o) "_OBJC_CLASS_$_BTPayPalViewController" 中的 objc-class-ref,引用自: libPods-Vinyo-2-Braintree.a(BTPaymentProvider.o) 中的 objc-class-ref “_OBJC_CLASS_$_BTPayPalAppSwitchHandler”,引用自: libPods-Vinyo-2-Braintree.a(BTPaymentProvider.o) 中的 objc-class-ref libPods-Vinyo-2-Braintree.a(Braintree.o) ld 中的 objc-class-ref:未找到架构 armv7 clang 的符号:错误:链接器 命令失败,退出代码为 1(使用 -v 查看调用)

寻找一种可行且安全的方法来正确集成这两个 SDK 并使其工作。任何想法表示赞赏!提前谢谢!

【问题讨论】:

【参考方案1】:

来自 card.io 的 Dave。

您的第一种方法是正确的。根据您迄今为止提供的信息,我不确定为什么它对您不起作用。

请参阅https://github.com/braintree/braintree_ios/issues/53#issuecomment-58379403 了解一些具体建议。

(再过一两周,这应该会变得更容易,因为正确的 card.io 标头将包含在 Braintree iOS SDK 中。)

【讨论】:

非常感谢您的回复和您提供的链接。我尝试删除 libCardIO.a 并添加所有标题。但是 CardIOPaymentViewController 仍然无法正确初始化。甚至在 viewWillApprear 中出现错误:“+[CardIOPaymentViewController preload]: unrecognized selector sent to class 0x365ffc。”在添加 Braintree SDK 之前,CardIO 运行良好。 @willyang preload 方法在 3.9.0 版中添加到 card.io。由于您已将 card.io 标头恢复为 Braintree SDK 使用的 3.8.2 版本,因此未定义该方法。 -> 我认为您最简单的解决方案是等待几天,直到 Braintree SDK 的下一次更新,这应该可以一劳永逸地解决问题。 太好了!期待新的SDK。非常感谢您的回答! 已经更新到最新的braintree sdk,经过几次Xcode的配置,一切都像魅力一样。谢谢!

以上是关于Braintree iOS SDK 和 Card I/O iOS SDK 之间的冲突:架构 armv7 的重复符号的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Braintree iOs SDK 中获取 nonce

PayPal Checkout 直接使用 Braintree SDK - Swift

Braintree v.zero iOS SDK 是不是支持自适应支付?

Braintree 信用卡/借记卡集成不起作用

如何在 iOS 中使用 Braintree 实现支付应用

如何在 iOS 混合应用程序中集成 card.io sdk?