Используйте Cocoapods с расширением приложения


83

Я пытаюсь создать расширение приложения для фотографий в Xcode 6 Beta-6, которое использует библиотеки cocoapods. Заголовок моста, который Xcode создает для расширения фотографий, не может видеть ничего от cocoapods.

Например: #import <GPUImage/GPUImage.h>приводит к ошибке "GPUImage/GPUImage.h" file not found.

Я пробовал все мыслимые пути для импорта (в скобках и кавычках) и почти не добился успеха. Исключением является то , что для простых стручки нравится SVProgressHUDследующая некрасиво ужасный хак работает: #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h".

Но для GPUImage он входит в GPUImage.hзаголовок и решает, что внезапно не видит, GPUImageContext.hнесмотря на отсутствие проблем, когда он импортируется с заголовком моста для обычного быстрого кода, который не является частью расширения приложения.

Чем отличается компиляция расширений приложений, которая мешает нормальному поведению заголовка моста?

Примечание: я прочитал все возможные варианты этого руководства, и они не применимы сразу, на всякий случай, если кто-то думает, что нашел там ответ.

Кроме того, проблема, описанная в этом вопросе SO, может быть связана, но я все равно задал этот вопрос, если моя проблема связана с расширениями приложений.


это правильное решение для меня [Cocopoads также для виджетов (или целей)] [1] [1]: stackoverflow.com/a/17850444/1415713
kurtanamo

Ответы:


65

Правильный способ сделать это - обновить ваш подфайл, добавив только одну строку:

link_with 'yourApp', 'yourAppExtension'

и обновление модуля должно решить проблему.


3
Верный! Не могу поверить, что не нашел этого.
Дэн Блейкмор

1
Что такое «youAppExtension»?
Nate Uni

6
Где в файле pod я должен добавить эти строки?
Dekel Maman

7
Как сказал @Sti, это больше не работает и возвращает сообщение об ошибке «Недопустимый Podfileфайл: [!] Спецификация link_withв Podfile теперь не поддерживается, используйте вместо этого целевые блоки ..»
Райан

2
Спецификация link_withв Podfile теперь не поддерживается, используйте вместо них целевые блоки. Это решение устарело.
Mehul

85

РЕДАКТИРОВАТЬ (2015/03/10)

См. Новый принятый ответ. Я попробовал это в новом проекте, и это сработало, хотя оба моих тестовых модуля использовали sharedApplication, что запрещено в расширениях. Тот факт, что они показали эти ошибки, означает, что они правильно связаны. Вперед, @LeChatNoir!


Успех.

Решение заключается в следующем: если у вас есть расширение приложения и его заголовок моста в проекте, использующем cocoapods, и вы хотите использовать одну из этих библиотек cocoapods, попытка включить модуль, например, #import <GPUImage/GPUImage.h>не удастся с file not found.

Во-первых, убедитесь, что вы указали расширение приложения (щелкните файл проекта, а затем цель расширения) для ссылки libPods.a, так же как и цель вашего приложения.

Затем в вашем фактическом проекте (щелкните файл проекта, затем снова файл проекта в разделе «Проект» на внутренней боковой панели) на вкладке «Информация» установите конфигурацию расширения для отладки, выпуска и внутреннего использования. конфигурацию «Pods» из раскрывающегося списка. Pod Install не сделает этого за вас, поэтому вам нужно будет сделать это самостоятельно.

Наконец, убедитесь, что и цели проекта Pods, и цели вашего проекта имеют все архитектуры, которые вам нужно построить в переменной Valid Architectures, иначе вы получите вечно забавную ошибку неопределенных символов.

Это должно работать и позволить вам импортировать выбранные вами модули как обычно.


РЕДАКТИРОВАТЬ (2014/10/14): в стороне, поскольку вы также можете включать файлы Objective-C из собственного кода проекта в расширение Swift, вы должны убедиться, что все .mфайлы, которые вы помещаете в заголовок моста, также скомпилированы по цели расширения. Вы можете сделать это из меню источников компиляции для целевого объекта или в самом .mфайле, используя раздел «Целевое членство» на правой боковой панели в Xcode.


У меня есть реализация выше всех шагов .. но возникла проблема .. Неопределенные символы для архитектуры armv7: "_OBJC_CLASS _ $ _ Location", ссылка на которую: objc-class-ref в TodayViewController.o, пожалуйста, помогите мне. как решить
Urmi

У меня есть импортный файл "Location.h" и использование метода + class в сегодняшнем расширении ... тогда я получу вышеуказанную проблему.
Urmi

1
Вы убедились, что файл также является членом целевого расширения? Также убедитесь, что вы строите правильную архитектуру.
DanBlakemore

Я проверил правильность архитектуры. но файл, если он не является членом целевого расширения. но я не могу использовать файлы, которые уже есть в приложении?
Urmi

3
Мне также пришлось указать $ (унаследованный) для OTHER_LD_FLAGS в настройках сборки расширения.
TWilly

71

Вышеупомянутые ответы будут работать, но мне нужна была только пара модулей в моем расширении, поэтому я сделал следующее со своим Podfile:

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

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

И тогда он это pod installсделает!


2
Лучший ответ. Таким образом, я не перегружаю свое расширение iOS ненужными
модулями,

Потрясающе! Благодаря!
user3427013 08

1
Это прекрасный ответ. из-за ошибки xcode: спецификация link_withв Podfile теперь не поддерживается, пожалуйста, используйте вместо этого целевые блоки ..
Мехул

4

введите описание изображения здесь

link_with, вы больше не будете его использовать.

Неверный Podfileфайл: [!] Спецификация link_withв Podfile теперь не поддерживается, используйте вместо этого целевые блоки ..

Ниже приведен идеальный ответ, также проверенный.

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.