web-dev-qa-db-ja.com

SwiftおよびObjective-Cフレームワークへの依存性を使用してCocoapodを構築する

このテーマについては、SOですでにいくつか質問があることは知っていますが、回答を受け入れたものはほとんどなく、私とまったく同じ問題を見つけたとは思いません。

Swiftポッドを構築しており、コードでは.frameworkファイルとしてバンドルされているGoogleMaps iOS SDKに依存しています。ただし、プロジェクトはXcodeで正常に構築されます。 libをCocoapodsに公開するのに問題があります。

pod lib lintコマンドを使用してほぼ検証するPodspecファイルを作成できました。ただし、Google-Maps-iOS-SDKポッドを依存関係としてPodspecファイルに追加したため、次のメッセージが表示されて失敗します。

$ pod lib lint

[!]「ポッド」ターゲットには、静的バイナリを含む一時的な依存関係があります:(/ private/var/folders/n2/qyjfpk6n7zz_mngtwswlmsy00000gn/T/CocoaPods/Lint/Pods/Google-Maps-iOS-SDK/GoogleMaps.framework)

$

これは予想されますか?自分のSwiftベースのポッドにポッド参照としてGoogleMaps iOS SDKを追加できないのはなぜですか?

これが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

Google Maps iOS SDKを依存関係として含めないと、pod lib lintがブリッジヘッダーで失敗し、<GoogleMaps/GoogleMaps.h>が見つからないと文句を言います(ファイルが見つかりません)。

私は立ち往生していて、それがCocoapods 0.36(まだベータ版)のバグなのか、それとも何か間違ったことをしているのかわかりません。

ご協力いただきありがとうございます!

17
Romain

私はついにSO同様の問題を扱っている別のスレッドを見つけました: CocoaPodsを介して追加されたiOS用Googleマップを使用したSwiftプロジェクトのリンカーエラー =。

エラーは、悪いPodspecファイル(Google Maps iOS SDK側)とCocoapods 0.36Betaのバグの組み合わせが原因であるようです。

@fz。のGoogleマップ用の改訂されたPodspecファイルを使用することで問題を回避することが実際に可能です: https://stackoverflow.com/a/28471830/145997Podspecvendored_frameworks設定がどのように機能するかを理解するのにも非常に興味深い別の記事は次のとおりです。 http://codereaper.com/blog/2014/creating-a-pod- with-crashreporter /

したがって、ポッドプロジェクトにGoogle Maps iOS SDKを正しくインポートするには、最初に次の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!

import GoogleMapsを実行するだけで、SwiftコードからGoogleマップクラスを参照できるようになりました。ポッドを配布するために、最終的なPodspecは次のようになりました。以下:

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

これで、Xcodeで新しいiOSアプリを起動し、次のPodfileを使用して、Google Maps iOSSDKを参照する自分のポッドにリンクすることができます。

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

それほど簡単ではありませんが、結局のところ実現可能です!ただし、GoogleがすぐにPodspecファイルにSwift開発用にパッチを適用することを期待しています。

12
Romain