2015-11-07 10 views
7

Ich plane, Google Drive API in meinem Swift-Projekt zu verwenden. Ich versuche, das Drive SDK über CocoaPods (v0.39.0) hinzuzufügen. Unten ist mein Podfile.Doppelte Schnittstellendefinition für Klasse 'GTMHTTPUploadFetcher'

platform :ios, '8.0' 
use_frameworks! 

pod 'Google-API-Client/Drive' 

Ich habe die use_frameworks! Flag hinzugefügt, so dass CocoaPods Objective-C-Pods Swift Frameworks anstelle von statischen Bibliotheken umwandeln kann.

Die Pod-Installation ist erfolgreich. Wenn ich das Projekt jedoch erstelle, erhalte ich den folgenden Fehler.

doppelte Schnittstellendefinition für die Klasse ‚GTMHTTPUploadFetcher‘

Löschen DerivedData Ordner und Reinigen des Projekts hat nicht funktioniert.

Ich habe auch versucht, ohne die use_frameworks! hinzufügen und dann die Bibliothek über eine Bridging-Header-Weg hinzufügen. Das funktioniert ohne ein Problem. Die Sache ist, alle meine anderen Abhängigkeiten damit arbeiten zu lassen. Und leider CocoaPods doesn'tsupport das Flag nur für bestimmte Pods.

Gibt es eine Problemumgehung, um dieses Problem zu beheben?


Wie docs in Google angegeben, überwachen Google-Ingenieure mit google-drive-sdk getaggt angeblich Fragen so hoffe ich zumindest sie dies sehen werden und es bald beheben.

Antwort

3

Ich stieß auf das gleiche Problem. Meine Lösung war nicht installieren der Google API-Client für iOS mit CocoaPods, weil ich Swift-basierte Pods verwendet und ich konnte daher use_frameworks! nicht entfernen, um zu versuchen, um das doppelte Header-Problem zu umgehen.

ich installierte stattdessen die Bibliothek manuell durch die detaillierten Anweisungen folgen bei https://developers.google.com/drive/ios/quickstart?ver=swift für die Schritte 2, 3 und 4. ich die Anweisungen befolgt, aber wandte sie meinen vorhandenen Arbeitsbereich stattdessen einen neuen Arbeitsbereich zu schaffen.

Es ist wichtig zu beachten, dass ich die Pfade in User Header Suchpfade anpassen musste, um die Orte zu entsprechen, wo ich den Quellcode von Google tatsächlich kopierte.

Ich kopiere die Anweisungen hier als Referenz.

Schritt 2: Laden Sie die Google-Client-Bibliothek

Führen Sie die folgenden Befehle, um die Bibliothek mit Git zum Download:

  • git clone https://github.com/google/google-api-objectivec-client.git
  • git clone https://github.com/google/gtm-oauth2.git
  • git clone https://github.com/google/gtm-session-fetcher.git
  • git clone https://github.com/stig/json-framework.git -b v2.3
  • cp -R gtm-oauth2/Source google-api-objectivec-client/Source/OAuth2
  • cp -R json-framework/Classes google-api-objectivec-client/Source/JSON

Schritt 3: Vorbereiten des Arbeitsbereichs

öffnen Xcode und einen neuen Arbeitsbereich erstellen namens "Quickstart". Datei> Dateien hinzufügen „Quickstart“ ..., fügen Sie die folgenden Projekte in den Arbeitsbereich aus den Bibliotheken, die Sie im vorherigen Schritt geklont:

  • google-api-Objective-client/Quelle/GTL.xcodeproj
  • GTM-session-Abholer/Quelle/GTMSessionFetcher.xcodeproj

Wählen Sie den "GTMSessionFetcher" Projekt und folgende Änderungen vornehmen:

  • ein neues Ziel von t hinzufügen Er tippt iOS> Framework & Bibliothek> Cocoa Touch Static Library und nennt es "GTMSessionFetcherLib".
  • Fügen Sie alle M-Dateien in der GTMSessionFetcher-Gruppe des Projekts zum Abschnitt Build Phases> Compile Sources des Ziels hinzu.

Wählen Sie den "GTL" Projekt "GTLTouchStaticLib" Ziel und folgende Änderungen vornehmen:

  • Fügen Sie die Bibliothek GTMSessionFetcher/libGTMSessionFetcherLib.a Phasen Build> Link Binary mit Bibliotheken.
  • Fügen Sie den absoluten Pfad zu gtm-session-fetcher/Source/hinzu, um Einstellungen> Suchpfade für Benutzerheader zu erstellen.
  • Fügen Sie das Flag GTM_USE_SESSION_FETCHER = 1 zu Build Settings> Preprocessor Macros hinzu.
  • Löschen Sie das "GTLFramework" -Ziel des "GTL" -Projekts.
  • Löschen Sie im Projektnavigator die GTL-Quelle> Common> HTTPFetcher-Gruppe des GTL-Projekts.

Schritt 4: Bereiten Sie das Projekt

  • Erstellen Sie ein neues iOS> Anwendung> Projekt Single View Anwendung namens "QuickstartApp". Stellen Sie die Sprache auf schnell ein und beim Speichern des Projekts setzen Sie die Felder Hinzufügen zu und Gruppe auf "Schnellstart".
  • Fügen Sie die folgenden Frameworks und Bibliotheken auf der Build-Phasen des Projekts> Link Binary mit Bibliotheken Abschnitt: libGTLTouchStaticLib.a
    • Security.framework
    • SystemConfiguration.framework
  • Ändern Sie die folgenden Einstellungen beim Aufbau :
  • Fügen Sie -ObjC -all_load zu anderen Linker-Flags hinzu.
  • Fügen Sie den absoluten Pfad zu den folgenden Verzeichnissen zu User Header-Suchpfade:
    • GTM-session-Abholer/Quelle/
    • google-api-Objective-client/Quelle/**
  • Fügen Sie den Präprozessor-Makros das Flag GTM_USE_SESSION_FETCHER = 1 hinzu.
  • Fügen Sie die Datei google-api-objective-client/Source/OAuth2/Touch/GTMOAuth2ViewTouch.xib der Gruppe der unterstützenden Dateien des Projekts hinzu.
  • Fügen Sie die folgenden Dateien in der QuickstartApp Gruppe:
    • google-api-Objective-client/Quelle/Dienstleistungen/Antrieb/generiert/GTLDrive_Sources.m
    • google-api-Objective-client/Quelle/Dienstleistungen /Drive/Generated/GTLDrive.h
  • Wenn nicht automatisch erstellt, erstellen Sie eine neue Header-Datei Bridging-header.h mit folgendem Inhalt:
    • #import "GTMOAuth2ViewControllerTouch.h"
    • #import "GTLDrive.h"
  • Sets Erstellen Einstellungen> Objective-C Bridging-Header auf den absoluten Pfad des Brückenkopfes.
+0

Danke für die Antwort. Ich habe es einfach versucht und es funktioniert. Obwohl es das ursprüngliche Problem nicht behebt, da es funktioniert, werde ich es vorläufig akzeptieren. Vielen Dank. Ich kann nicht glauben, dass Google dies vernachlässigt. Es ist ein Problem, das seit Monaten existiert! – Isuru

+0

Danke @Isuru. Ich konnte nicht glauben, wie kompliziert es war zu installieren. Ich bin mir sicher, dass es einfacher wird, wenn sie den Code überarbeitet haben und Ihr ursprüngliches Problem sogar behoben sein könnte. Es war ein langjähriges Problem, wie Sie gesagt haben. – Daniel

+0

Ja. Es ist lächerlich kompliziert. Ich erwarte ein wenig mehr Unterstützung von Google für die Verbreitung ihrer iOS-SDKs, da diese explizit CocoaPods als Hauptkanal verwenden. – Isuru

0

Die einzige Problemumgehung, die ich gefunden habe, war, dass Sie in die drei von Google Drive importierten Projekte gehen und prüfen müssen, wie die Importe durchgeführt werden. Im Moment ist das Importieren von Headern, nicht Frameworks (die drei Frameworks hängen voneinander ab). Sie müssen es nur manuell tun und es wird funktionieren.

Ich habe keine Code-Beispiele, um Ihnen zu zeigen, aber ich weiß, ich habe es zum letzten Mal auf diese Weise arbeiten.

+0

[drei Projekte] (http://i.imgur.com/i34BYio laufen.png), meinst du "Google-API-Client", "gtm-http-fetcher" und "gtm-oauth2"? – Isuru

+0

Oder meinst du das hinzufügen sie manuell in der ['Podfile'] (http://pastie.org/10540347)? Ich habe das auch versucht, aber immer noch den gleichen Fehler. – Isuru

+0

@isurur haben Sie eine Lösung gefunden? –

0

Einfache Lösung hier:

Go Schema bearbeiten -> Wählen Sie Erstellen -> Option Erstellen untick PARALLELIZE

Bauen

Jetzt ist Ihre App

Verwandte Themen