将 cocoapod 依赖项添加到 cocoa touch 框架

Posted

技术标签:

【中文标题】将 cocoapod 依赖项添加到 cocoa touch 框架【英文标题】:adding cocoapod dependencies to a cocoa touch framework 【发布时间】:2015-01-22 17:53:45 【问题描述】:

我正在尝试研究如何将 cocoa pod 依赖项添加到具有嵌入式 cocoa touch 框架的 ios 应用程序中。我的 podfile 设置如下:

link_with [‘TestApp’, ‘TestAppFramework’]
platform :ios, '8.0'
source 'https://github.com/CocoaPods/Specs.git'
pod 'google-plus-ios-sdk', '~> 1.7'

然后我按照此处的说明添加一个带有登录按钮的视图控制器:

https://developers.google.com/+/mobile/ios/sign-in

一切都编译没有问题。如果我然后运行该应用程序,它将启动并显示一个 google plus 登录按钮,但我收到很多关于在两个地方定义的 google 类的警告,例如:

objc[6727]:GPPSignIn 类在 /Users/jamesburke/Library/Developer/Xcode/DerivedData/TestApp-eiqrhcijoqplxgaoodgtwzncvhjk/Build/Products/Debug-iphonesimulator/TestAppFramework.framework/TestAppFramework 和 /Users/jamesburke/ 中实现库/开发人员/CoreSimulator/Devices/730A1805-D46F-4D11-9F9E-DA37C1147F9A/data/Containers/Bundle/Application/EB7EE52A-7FB6-45CE-81B4-1E9A45875E69/TestApp.app/TestApp。将使用两者之一。哪一个是未定义的。

如果我然后单击登录按钮,我会收到一条错误消息,说我没有设置谷歌客户端 ID - 我有,但是因为 GPPSignIn 类依赖于共享实例,所以看起来重复的类混淆了事情:

2014-11-24 20:54:25.557 TestApp[6727:155282] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“您必须指定 |clientID|对于|GPPSignIn|'

查看堆栈跟踪,我们从 TestApp 范围切换到 TestAppFramework 范围,即使此时框架中没有代码

…
3   TestAppFramework                    0x000000010c7f1a9c -[GPPSignIn assertValidParameters] + 77
4   TestAppFramework                    0x000000010c7f35e7 -[GPPSignIn authenticateMaybeInteractively:withParams:] + 118
5   TestAppFramework                    0x000000010c7f5ac8 -[GPPSignInButton buttonPressed] + 164
6   UIKit                               0x000000010b4c38be -[UIApplication sendAction:to:from:forEvent:] + 75
…
19  UIKit                               0x000000010b4c2420 UIApplicationMain + 1282
20  TestApp                             0x000000010a25e9f3 main + 115

我在其他一些可可豆荚中遇到了这个问题,例如 mailcore2-ios,但其他一些豆荚似乎没有发出相同的警告。

有没有办法设置我的 podfile,以便我的框架和我的应用程序都可以访问相同的依赖项,但在运行时不会发生冲突?还是我不应该像这样设置我的依赖项?

【问题讨论】:

【参考方案1】:

link_with 应该用于(如果我错了,请纠正我)在同一个项目中链接目标。您所描述的是一个嵌入式框架(这是一个单独的项目)。

您真正想要做的是将依赖项添加到嵌入式框架中,例如:

source 'https://github.com/CocoaPods/Specs.git'

workspace 'TestApp.xcworkspace'

def import_pods
    pod 'google-plus-ios-sdk', '~> 1.7'
end

target : TestAppFramework do
    xcodeproj 'TestAppFramework.xcodeproj'
    platform :ios, '8.0'
    link_with 'TestAppFramework', 'TestAppFrameworkTests'
    import_pods
end

target : TestApp do
    xcodeproj 'TestApp.xcodeproj'
    platform :ios, '8.0'
    link_with 'TestApp', 'TestAppTests'
    import_pods
end

此示例将 google sdk 添加到两个项目中(并链接到它们的测试目标),也许您只需要在嵌入式框架中使用它。

【讨论】:

谢谢您,但是将 google sdk 添加到两个目标会导致我在上面显示的错误。我最终发现的实际工作是将应用程序的所有代码移动到框架中 - 所以应用程序委托、所有故事板、所有视图控制器等都在框架中,而主应用程序只是变成了一个空的持有者.需要注意的一件事 - 如果您尝试使用共享扩展程序做同样的事情,那么 cocoapods 无法处理它,您必须在扩展程序中有一个虚拟视图控制器,以便 cocoapods 仍然可以工作。【参考方案2】:

我不确定 pod 'google-plus-ios-sdk', '~> 1.7' 是否支持 Framework。 在你的 podfile 中

target 'YourProjectName' do
pod 'google-plus-ios-sdk', '~> 1.7'
end

尝试像这样使用它。

【讨论】:

以上是关于将 cocoapod 依赖项添加到 cocoa touch 框架的主要内容,如果未能解决你的问题,请参考以下文章

手动将 Snapkit 添加到 xcode

项目和子项目的 Cocoapods

是否可以将一个 cocoapod 包含到另一个 cocoapod 中?

使用 CocoaPods 添加 GeoFire 依赖项

添加清华大学的Cocoapods镜像

添加 cocoapods 依赖项后,Fastlane 健身房失败