2015-03-07 13 views
16

Ich weiß, es gibt bereits ein paar Fragen zu diesem Thema hier auf SO, aber sehr wenige haben Antworten akzeptiert, und ich glaube nicht, dass ich das exakt gleiche Problem gefunden habe so wie meins.Aufbau einer Cocoapod mit Swift und Abhängigkeit von Objective-C-Framework

Ich baue einen Swift Pod, und in meinem Code verlasse ich mich auf das Google Maps iOS SDK, das als .framework Datei gebündelt ist. Das Projekt baut OK in Xcode auf, aber ich habe Probleme, die Lib zu Cocoapods zu veröffentlichen.

Ich schaffte es, eine Podspec Datei zu haben, die fast mit dem pod lib lint Befehl validiert. Aber jetzt, dass ich die Google-Maps-iOS-SDK pod als eine Abhängigkeit in der Podspec-Datei hinzugefügt haben, schlägt es mit der folgenden Meldung:

$ pod lib Flusen

Die 'Pods' Ziel hat transitiv [!] Abhängigkeiten, die statische Binärdateien sind: (/private/var/folders/n2/qyjfpk6n7zz_mngtwswlmsy00000gn/T/CocoaPods/Lint/Pods/Google-Maps-iOS-SDK/GoogleMaps.framework)

$

Wird das erwartet? Warum kann ich das Google Maps iOS SDK nicht als Pod-Referenz in meinem eigenen Swift-basierten Pod hinzufügen?

Hier ist die Podspec:

Pod::Spec.new do |s| 
s.name     = '(name)' 
s.version    = '1.0.0' 
s.summary    = '(summary)' 
s.platforms    = { :ios => '8.0', :osx => '10.10' } 
s.ios.deployment_target = '8.0' 
s.osx.deployment_target = '10.10' 
s.license    = { :type => 'BSD', :file => 'LICENSE' } 
s.source_files   = 'Sources/*.{h,swift}', '*.framework' 
s.source    = { :git => "https://github.com/(Github repo).git", :tag => "1.0.0" } 
s.requires_arc   = true 
s.frameworks    = "Foundation", "CoreLocation" 
s.author    = { 'Romain L' => '(email)' } 
s.dependency 'Google-Maps-iOS-SDK' 
end 

Wenn ich beinhalten nicht die Google Maps iOS SDK als Abhängigkeit, dann pod lib lint im Bridging-Header aus, und beschwert sich nicht <GoogleMaps/GoogleMaps.h> (Datei nicht gefunden) finden können.

Ich bin fest, und ich weiß nicht, ob es ein Fehler von Cocoapods 0.36 ist (noch in der Beta) oder wenn ich etwas falsch mache.

Danke für Ihre Hilfe!

Antwort

12

Ich habe endlich einen anderen Thread über SO gefunden, der sich mit ähnlichen Problemen beschäftigt: Linker errors in a Swift project with Google Maps for iOS added via CocoaPods.

Es scheint, dass die Fehler auf eine Kombination aus schlechter Podspec-Datei (auf der Google Maps iOS SDK-Seite) und Fehlern in Cocoapods 0.36 Beta zurückzuführen sind.

Es ist tatsächlich möglich, die Probleme zu umgehen, indem Sie die überarbeitete Podspec-Datei von @fz für Google Maps verwenden: https://stackoverflow.com/a/28471830/145997. Ein weiterer Artikel, der auch von großem Interesse war zu verstehen, wie die vendored_frameworks Einstellung in Podspec funktioniert, ist: http://codereaper.com/blog/2014/creating-a-pod-with-crashreporter/.

So importieren korrekt die Google Maps iOS SDK in einem Pod-Projekt zuerst verwenden Sie die folgende Podfile:

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 
# altered version of Google's Podspec 
pod 'Google-Maps-iOS-SDK', :podspec => "https://raw.githubusercontent.com/Reflejo/GoogleMapsPodspec/master/Google-Maps-iOS-SDK.podspec.json" 
use_frameworks! # don't forget this! 

Ich bin jetzt in der Lage einfach Google Maps Klassen von meinem Swift Code verweisen import GoogleMaps, indem Sie .Und das Pod zu verteilen, meine letzte Podspec jetzt ähnelt dem folgenden:

Pod::Spec.new do |s| 
    s.name     = 'MyPod' 
    s.version    = '1.0.0' 

    s.homepage    = "https://github.com/..." 
    s.summary    = '(pod summary)' 
    #s.screenshot   = "" 

    s.author    = { 'Romain L' => '(email)' } 
    s.license    = { :type => 'BSD', :file => 'LICENSE' } 
    s.social_media_url  = "https://twitter.com/_RomainL" 
    s.platforms    = { :ios => '8.0' } 
    s.ios.deployment_target = '8.0' 

    s.source_files   = 'MyCode/*.{h,swift}' 
    s.module_name   = 'MyPod' 
    s.source    = { :git => "https://github.com/....git", :tag => "1.0.0" } 
    s.requires_arc   = true 
    s.libraries    = "c++", "icucore", "z" # required for GoogleMaps.framework 
    s.frameworks   = "AVFoundation", "CoreData", "CoreLocation", "CoreText", "Foundation", "GLKit", "ImageIO", "OpenGLES", "QuartzCore", "SystemConfiguration", "GoogleMaps" # required for GoogleMaps.framework 
    s.vendored_frameworks = "Dependencies/GoogleMaps.framework" # Put the Google-provided framework in that subfolder of your Pod project 
    #s.dependency    'Google-Maps-iOS-SDK' # Careful! this will cause errors if enabled! 
end 

Ich bin jetzt in der Lage eine neue iOS-App in Xcode zu starten und verwenden Sie die folgende Podfile gegen meine eigene pod zu verknüpfen, verweisen selbst die Google Maps iOS SDK:

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 
pod 'MyPod' 
use_frameworks! # do not forget this! 

Nicht so einfach, aber machbar! Hoffentlich wird Google bald seine Podspec Datei für Swift-Entwicklungen patchen.

+0

können wir dies mit Google Analytics und Aufruhr? – Esqarrouth

+1

Das ist perfekt. Es hat mir geholfen, das Google-Mobile-Ads-SDK jetzt auf 0.38.2 laufen zu lassen, indem ich diesen podspec im benutzerdefinierten Stil erstelle. Danke, @Romain! – ArtSabintsev

+1

danke! Das ist eine sehr hilfreiche Antwort. Zur Info: Zur Zeit benötigt 'GoogleMaps 1.12.3'' Accelerate.framework'. –