Використовуйте 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

Правильний спосіб зробити це - оновити свій підфайл, щоб додати лише 1 рядок:

link_with 'yourApp', 'yourAppExtension'

і оновлення стручка має вирішити проблему.


3
Правильно! Я не можу повірити, що не знайшов цього.
DanBlakemore

1
Що таке частина "youAppExtension"?
Nate Uni

6
Де у файлі pod я повинен додати ці рядки?
Dekel Maman

7
Як сказав @Sti, це більше не працює і повертає повідомлення про помилку "Недійсний Podfileфайл: [!] Специфікація link_withв підфайлі зараз не підтримується, замість цього використовуйте цільові блоки .."
Райан,

2
Специфікація link_withв підфайлі зараз не підтримується, замість цього використовуйте цільові блоки .. Це рішення застаріло.
Мехул,

85

РЕДАКТУВАТИ (10.03.2015)

Дивіться нову прийняту відповідь. Я спробував це в новому проекті, і він спрацював, хоча обидва мої тестові блоки використовували sharedApplication, що заборонено в розширеннях. Той факт, що вони показали ці помилки, означає, що це правильно пов'язано. Хороший шлях @LeChatNoir!


Успіху.

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

По-перше, обов’язково повідомте розширення програми (клацніть на файл проекту, а потім на ціль розширення), щоб зв’язати libPods.a, подібно до цілі вашої програми.

Далі у вашому фактичному проекті (клацніть на файлі проекту, потім знову на файлі проекту у розділі «Проект» на внутрішній бічній панелі) на вкладці «Інформація» встановіть конфігурацію розширення для налагодження, випуску та Inhouse для використання конфігурація "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

70

Наведені вище відповіді будуть працювати, але я хотів лише кілька стручків у своєму розширенні, тому я зробив наступне для мого Podfile:

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

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

І тоді a pod installзробить це!


2
Краща відповідь. Таким чином, я не перевантажую своє розширення iOS непотрібними
стручками

Чудово! Дякую!
user3427013

Це ідеальна відповідь. через помилку xcode: специфікація link_withв підфайлі зараз не підтримується, використовуйте замість цього цільові блоки ..
Мехул,

3

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

link_with, ви більше не використовуватимете його.

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

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

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.