Użyj Cocoapods z rozszerzeniem aplikacji


83

Próbuję zbudować rozszerzenie aplikacji do zdjęć w Xcode 6 Beta-6, które korzysta z bibliotek cocoapods. Nagłówek mostkujący, który Xcode tworzy dla rozszerzenia zdjęć, nie widzi niczego z cocoapods.

Na przykład: #import <GPUImage/GPUImage.h>powoduje błąd "GPUImage/GPUImage.h" file not found.

Wypróbowałem każdą możliwą ścieżkę importu (z nawiasami kwadratowymi i cudzysłowami) i prawie bez powodzenia. Wyjątkiem jest to, że za proste jak strąki SVProgressHUD, następujące brzydki straszny Hack działa: #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h".

Ale w przypadku GPUImage wchodzi do GPUImage.hnagłówka i decyduje, że nagle nie widzi, GPUImageContext.hmimo że nie ma problemu, gdy jest importowany z nagłówkiem mostkującym dla normalnego szybkiego kodu, który nie jest częścią rozszerzenia aplikacji.

Czym różni się kompilacja rozszerzeń aplikacji, która uniemożliwia prawidłowe zachowanie nagłówka mostkującego?

Uwaga: przeczytałem każdą możliwą permutację tego samouczka i nie ma ona natychmiastowego zastosowania, na wypadek gdyby ktoś pomyślał, że znalazł tam odpowiedź.

Ponadto problem opisany w tym pytaniu SO może być powiązany, ale i tak zadałem to pytanie na wypadek, gdyby mój problem dotyczył rozszerzeń aplikacji.


to jest dla mnie właściwe rozwiązanie [Cocopoads także dla widgetu (lub celów)] [1] [1]: stackoverflow.com/a/17850444/1415713
kurtanamo

Odpowiedzi:


65

Właściwym sposobem na to jest zaktualizowanie pliku podfile, aby dodać tylko 1 linię:

link_with 'yourApp', 'yourAppExtension'

a aktualizacja poda powinna rozwiązać problem.


3
Poprawny! Nie mogę uwierzyć, że tego nie znalazłem.
DanBlakemore

1
Co to jest część „youAppExtension”?
Nate Uni

6
Gdzie w pliku pod powinienem dodać te linie?
Dekel Maman

7
Jak powiedział @Sti, to już nie działa i zwraca komunikat o błędzie „Nieprawidłowy Podfileplik: [!] Specyfikacja pliku link_withPodfile jest teraz nieobsługiwana, zamiast tego użyj bloków docelowych ..”
Ryan

2
Specyfikacja link_withw pliku Podfile nie jest teraz obsługiwana. Zamiast tego użyj bloków docelowych. To rozwiązanie jest przestarzałe.
Mehul

85

EDYCJA (2015/03/10)

Zobacz nową zaakceptowaną odpowiedź. Wypróbowałem to w nowym projekcie i zadziałało, chociaż moje pody testowe używały sharedApplication, co jest niedozwolone w rozszerzeniach. Fakt, że pokazali te błędy, oznacza, że ​​jest prawidłowo połączony. Tak trzymaj @LeChatNoir!


Powodzenie.

Rozwiązanie jest następujące: gdy masz już rozszerzenie aplikacji i jest on połączony z nagłówkiem w projekcie używającym cocoapods i chcesz użyć jednej z tych bibliotek cocoapods, próba dołączenia kapsuły #import <GPUImage/GPUImage.h>się nie powiedzie file not found.

Najpierw upewnij się, że podałeś rozszerzenie aplikacji (kliknij plik projektu, a następnie cel rozszerzenia), z którym ma się łączyć libPods.a, podobnie jak cel aplikacji.

Następnie w swoim aktualnym projekcie (kliknij plik projektu, a następnie ponownie plik projektu w sekcji „Projekt” na wewnętrznym pasku bocznym) na karcie Informacje ustaw konfigurację rozszerzenia Debug, Release i Inhouse do użycia konfigurację „Podów” z listy rozwijanej. Pod Install nie zrobi tego za Ciebie, więc będziesz musiał to zrobić samodzielnie.

Na koniec upewnij się, że zarówno cele projektu Pods, jak i cele projektu mają wszystkie architektury, dla których musisz zbudować w zmiennej Valid Architectures, w przeciwnym razie otrzymasz zawsze zabawny błąd niezdefiniowanych symboli.

To powinno działać i pozwala na importowanie strąków wyboru jak zwykle.


EDYCJA (2014/10/14): Na marginesie, ponieważ możesz również dołączać pliki Objective-C z własnego kodu projektu do rozszerzenia Swift, powinieneś upewnić się, że wszystkie .mpliki, które umieścisz w nagłówku mostkowania, są również skompilowane przez cel rozszerzenia. Możesz to zrobić z menu kompilacji źródeł dla celu lub w samym .mpliku, używając sekcji „Członkostwo docelowe” na prawym pasku bocznym w Xcode.


mam implementację ponad wszystkie kroki .. ale mam problem .. Niezdefiniowane symbole dla architektury armv7: „_OBJC_CLASS _ $ _ Location”, do którego odwołuje się: objc-class-ref w TodayViewController.o, pomóż mi. jak to rozwiązać
Urmi

Mam plik importu "Location.h" i używam metody klasy + w dzisiejszym rozszerzeniu ... wtedy dostanę powyższy problem.
Urmi

1
Czy upewniłeś się, że plik jest także elementem docelowym rozszerzenia? Sprawdź również, czy budujesz dla poprawnej architektury.
DanBlakemore

Sprawdziłem, czy architektura jest poprawna. ale plik, jeśli nie jest członkiem docelowego rozszerzenia. ale czy nie mogę używać plików, które są już w aplikacji?
Urmi

3
Musiałem też umieścić $ (inherited) for OTHER_LD_FLAGS w ustawieniach kompilacji rozszerzenia.
TWilly

71

Powyższe odpowiedzi będą działać, ale chciałem mieć tylko kilka podów w moim rozszerzeniu, więc wykonałem następujące czynności w moim pliku Podfile:

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

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

A potem pod installzrobi to!


2
Najlepsza odpowiedź. W ten sposób nie przeciążam mojego rozszerzenia iOS niepotrzebnymi podami
marcelosalloum

Niesamowite! Dzięki!
user3427013

1
To jest doskonała odpowiedź. z powodu błędu xcode: specyfikacja link_withw Podfile jest teraz nieobsługiwana, zamiast tego użyj bloków docelowych ..
Mehul

4

wprowadź opis obrazu tutaj

link_with, nie będziesz go już używać.

Nieprawidłowy Podfileplik: [!] Specyfikacja link_withw Podfile jest teraz nieobsługiwana, zamiast tego użyj bloków docelowych ..

Poniżej znajduje się idealna odpowiedź, również przetestowana.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.