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.