将Cocoapods与App Extension一起使用


83

我正在尝试使用Cocoapods库在Xcode 6 Beta-6中构建照片应用程序扩展。Xcode为照片扩展名创建的桥接标题无法从cocoapods中看到任何东西。

例如:#import <GPUImage/GPUImage.h>导致错误"GPUImage/GPUImage.h" file not found

我已经尝试了导入的所有可能路径(带有方括号和引号),但几乎没有成功。唯一的例外是,简单的豆荚一样SVProgressHUD,下面的丑陋可怕的黑客作品: #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"

但是对于GPUImage,它会导入GPUImage.h标头,并决定将其GPUImageContext.h与不属于应用扩展名的普通swift代码的桥接标头一起导入时,尽管没有问题,但突然还是看不到它。

应用程序扩展的编译有什么不同,可防止桥接标头正常运行?

注意:我已经阅读了本教程的所有可能排列,并且如果有人认为自己在此找到了答案,则它并不立即适用。

此外,此SO问题中描述的问题可能是相关的,但无论如何我还是问了这个问题,以防我的问题特定于应用扩展。


这对我来说是正确的解决方案[Cocopoads也适用于小部件(或目标)] [1] [1]:stackoverflow.com/a/17850444/1415713
kurtanamo 2014年

Answers:


65

正确的方法是将您的podfile更新为仅添加1行:

link_with 'yourApp', 'yourAppExtension'

并且pod更新应该可以解决问题。


3
正确!我不敢相信我没有找到这个。
DanBlakemore 2015年

1
什么是“ youAppExtension”部分?
Nate Uni

6
我应该在Pod文件中的哪一行添加行?
Dekel Maman

7
正如@Sti所说,这不再起作用,并返回错误消息“无效Podfile文件:[!] link_withPodfile中的规范现在不受支持,请改用目标块。”
Ryan

2
link_with现在不支持Podfile中的规范,请改为使用目标块。.不建议使用此解决方案。
Mehul

85

编辑(2015/03/10)

查看新接受的答案。我在一个新项目中尝试了它,但我的测试引擎都使用了sharedApplication,但扩展中不允许使用它,尽管它可以工作。他们显示出这些错误的事实意味着它已正确链接。@LeChatNoir要走的路!


成功。

解决方案如下:一旦有了您的应用程序扩展并将其桥接在使用cocoapods的项目中,并且您想使用这些cocoapods库之一,则尝试包含pod的尝试#import <GPUImage/GPUImage.h>将失败file not found

首先,请确保您告诉应用扩展程序(单击您的项目文件,然后在扩展程序目标上)链接到libPods.a,就像您的应用程序目标一样。

接下来,在您的实际项目中(单击您的项目文件,然后在内部侧栏的“项目”部分中再次在该项目文件上),在“调试”,“发布”和“内部”扩展名的配置中使用下拉菜单中的“ Pods”配置。Pod Install不会为您执行此操作,因此您需要自己执行此操作。

最后,请确保Pods项目的目标和项目的目标都具有在Valid Architectures变量中需要构建的所有体系结构,否则您将得到无休止的未定义符号错误。

应该可以正常工作,并允许您像平常一样导入所选的容器。


编辑(2014/10/14):顺便说一句,由于您可能还会在Swift扩展程序中从您自己的项目代码中包含Objective-C文件,因此您应确保.m放置在桥接头文件中的所有文件也已编译通过扩展目标。您可以从目标的编译源菜单执行此操作,也可以.m使用Xcode右侧边栏的“目标成员资格”部分在文件本身中执行此操作。


我已经执行了所有步骤。.但是有问题。。体系结构armv7的未定义符号:“ _ OBJC_CLASS _ $ _ Location”,引用自TodayViewController.o中的objc-class-ref,请帮助我。如何解决
Urmi 2014年

我已经导入了“ Location.h”文件并在今天的扩展名中使用+类方法...然后我将得到上述问题。
Urmi 2014年

1
您是否确定文件也是扩展目标的成员?还要检查您是否在构建正确的体系结构。
DanBlakemore

我已经检查过架构是正确的。但是如果不是扩展目标的成员则归档。但我不能使用应用程序中已有的文件吗?
Urmi 2014年

3
我还必须在扩展程序构建设置中将OTHER_LD_FLAGS的$(继承)。
TWilly,2014年

70

上面的答案是可行的,但是我在扩展名中只需要几个Pod,所以我对Podfile做了以下操作:

target '[Main App Target Name]' do
        pod ...
        pod ...
        pod ...
end

target '[Extension Target Name]' do
        pod ...
end

然后一个pod install会做到的!


2
最佳答案。这样,我就不会在我的iOS扩展中
加载

太棒了!谢谢!
user3427013

这是一个完美的答案。由于xcode错误:link_withPodfile中的规范现在不受支持,请改为使用目标块。–
Mehul

3

在此处输入图片说明

link_with,您将不再使用它。

无效的Podfile文件:[!] link_withPodfile中的规范现在不受支持,请改为使用目标块。

下面是完美的答案,也经过了测试。

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘9.0’
use_frameworks!
inhibit_all_warnings!

target 'DemoTodayWidget' do
    pod 'Reachability',                         '~> 3.2'
end

target 'My Widget' do
    pod 'Reachability',                         '~> 3.2'
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.