Verwenden Sie Cocoapods mit einer App-Erweiterung


81

Ich versuche, eine Foto-App-Erweiterung in Xcode 6 Beta-6 zu erstellen, die Cocoapods-Bibliotheken verwendet. Der Bridging-Header, den Xcode für die Fotoerweiterung erstellt, kann nichts von Cocoapods sehen.

Zum Beispiel: #import <GPUImage/GPUImage.h>führt zu dem Fehler "GPUImage/GPUImage.h" file not found.

Ich habe jeden erdenklichen Weg für den Import ausprobiert (mit Klammern und Anführungszeichen) und hatte fast keinen Erfolg. Die Ausnahme ist, dass für einfache Pods wie SVProgressHUDder folgende hässliche schreckliche Hack funktioniert : #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h".

Für GPUImage wird jedoch der GPUImage.hHeader aufgerufen und es wird plötzlich nicht mehr angezeigt, GPUImageContext.hobwohl beim Importieren mit dem Bridging-Header für den normalen schnellen Code, der nicht Teil der App-Erweiterung ist, kein Problem auftritt .

Was ist anders an der Kompilierung von App-Erweiterungen, die verhindert, dass sich der Bridging-Header ordnungsgemäß verhält?

Hinweis: Ich habe alle möglichen Permutationen dieses Tutorials gelesen und es ist nicht sofort anwendbar, nur für den Fall, dass jemand glaubt, die Antwort dort gefunden zu haben.

Das in dieser SO-Frage beschriebene Problem kann auch verwandt sein, aber ich habe diese Frage trotzdem gestellt, falls mein Problem spezifisch für App-Erweiterungen ist.


Dies ist die richtige Lösung für mich [Cocopoads auch für Widget (oder Ziele)] [1] [1]: stackoverflow.com/a/17850444/1415713
Kurtanamo

Antworten:


65

Der richtige Weg, dies zu tun, besteht darin, Ihre Poddatei zu aktualisieren, um nur eine Zeile hinzuzufügen:

link_with 'yourApp', 'yourAppExtension'

und ein Pod-Update sollte das Problem beheben.


3
Richtig! Ich kann nicht glauben, dass ich das nicht gefunden habe.
DanBlakemore

1
Was ist der Teil "youAppExtension"?
Nate Uni

6
Wo in der Pod-Datei sollte ich diese Zeilen hinzufügen?
Dekel Maman

7
Wie @Sti sagte, funktioniert dies nicht mehr und gibt die Fehlermeldung "Ungültige PodfileDatei: [!] Die Angabe link_within der Pod-Datei wird jetzt nicht unterstützt, bitte verwenden Sie stattdessen Zielblöcke .."
Ryan

2
Die Angabe link_withim Podfile wird jetzt nicht mehr unterstützt. Verwenden Sie stattdessen Zielblöcke. Diese Lösung ist veraltet.
Mehul

85

BEARBEITEN (10.03.2015)

Siehe neue akzeptierte Antwort. Ich habe es in einem neuen Projekt versucht und es hat funktioniert, obwohl meine Test-Pods beide sharedApplication verwendeten, was in Erweiterungen nicht zulässig ist. Die Tatsache, dass sie diese Fehler zeigten, bedeutet, dass sie richtig verknüpft sind. Weiter so @LeChatNoir!


Erfolg.

Die Lösung lautet wie folgt: Sobald Sie Ihre App-Erweiterung und den Bridging-Header in einem Projekt mit Cocoapods haben und eine dieser Cocoapods-Bibliotheken verwenden möchten, schlägt der Versuch, den Pod wie einzuschließen, #import <GPUImage/GPUImage.h>fehl file not found.

Stellen Sie zunächst sicher, dass Sie die App-Erweiterung (klicken Sie auf Ihre Projektdatei und dann auf das Erweiterungsziel) anweisen libPods.a, mit der sie verknüpfen soll , ähnlich wie bei Ihrem App-Ziel.

Legen Sie als Nächstes in Ihrem eigentlichen Projekt (klicken Sie auf Ihre Projektdatei und dann erneut auf die Projektdatei im Abschnitt "Projekt" der inneren Seitenleiste) auf der Registerkarte "Info" die Konfiguration der Erweiterung für Debug, Release und Inhouse fest die "Pods" -Konfiguration aus der Dropdown-Liste. Pod Install erledigt dies nicht für Sie, daher müssen Sie es selbst tun.

Stellen Sie schließlich sicher, dass sowohl die Pods-Projektziele als auch die Ziele Ihres Projekts alle Architekturen enthalten, für die Sie in der Variablen Valid Architectures erstellen müssen. Andernfalls wird der immer wieder auftretende Fehler mit undefinierten Symbolen angezeigt.

Dies sollte funktionieren und es Ihnen ermöglichen, die Pods Ihrer Wahl wie gewohnt zu importieren.


BEARBEITEN (14.10.2014): Abgesehen davon sollten Sie sicherstellen, dass alle .mDateien, die Sie in den Bridging-Header einfügen, auch kompiliert werden , da Sie möglicherweise auch Objective-C-Dateien aus Ihrem eigenen Projektcode in die Swift-Erweiterung aufnehmen durch das Erweiterungsziel. Sie können dies entweder über das Menü zum Kompilieren von Quellen für das Ziel oder in der .mDatei selbst über den Abschnitt "Zielmitgliedschaft" in der rechten Seitenleiste von Xcode tun .


Ich habe vor allem Schritte implementiert .. aber mit Problem .. Undefinierte Symbole für Architektur armv7: "_OBJC_CLASS _ $ _ Location", referenziert von: objc-class-ref in TodayViewController.o Bitte helfen Sie mir. wie man es löst
Urmi

Ich habe "Location.h" -Datei importiert und benutze die + class-Methode in der heutigen Erweiterung ... dann werde ich über das Problem kommen.
Urmi

1
Haben Sie sichergestellt, dass die Datei auch Mitglied des Erweiterungsziels ist? Überprüfen Sie auch, ob Sie für die richtige Architektur erstellen.
DanBlakemore

Ich habe überprüft, ob die Architektur korrekt ist. aber Datei, wenn nicht Mitglied des Erweiterungsziels. Aber kann ich keine Dateien verwenden, die bereits in der App enthalten sind?
Urmi

3
Ich musste auch $ (geerbt) für OTHER_LD_FLAGS in die Einstellungen für den Erweiterungsaufbau einfügen.
TWilly

70

Die obigen Antworten werden funktionieren, aber ich wollte nur ein paar Pods in meiner Erweiterung, also habe ich Folgendes mit meinem Podfile gemacht:

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

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

Und dann pod installwird es ein Wille tun!


2
Beste Antwort. Auf diese Weise überlade ich meine iOS-Erweiterung nicht mit nicht benötigten Pods
marcelosalloum

Genial! Vielen Dank!
user3427013

Dieser ist die perfekte Antwort. Wegen eines Xcode-Fehlers: Die Angabe link_within der Pod-Datei wird jetzt nicht mehr unterstützt. Bitte verwenden Sie stattdessen
Zielblöcke

3

Geben Sie hier die Bildbeschreibung ein

link_with, du wirst es nicht mehr benutzen.

Ungültige PodfileDatei: [!] Die Angabe link_within der Pod-Datei wird jetzt nicht mehr unterstützt. Verwenden Sie stattdessen Zielblöcke.

Unten ist die perfekte Antwort, die auch getestet wurde.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.