Swift Embedded Framework内でCやObjective-Cのライブラリを使う方法
背景
運用しているSwiftアプリでObjective-C製のCocoaPodsライブラリをSwift Embedded Frameworkに閉じて使いたかった。 アプリケーション側で使うならお決まりのBridging Headerファイルを追加して、そこに適宜書いていけば良いのだけれど、Swift Embedded Frameworkで使いたい場合にどうすれば良いかの備忘録。
やり方
例としてObc製のGoogleAnalyticsライブラリをPods経由でインストールしてSwift Embedded Frameworkで使う方法を紹介する。
まず、Tracker
というEmbedded Frameworkが切られているとして、Podfileは下記のようにGoogleAnalyticsを使うTrackerターゲットでに記載する。
# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'ObjcLibUseEmbededFramework' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for ObjcLibUseEmbededFramework target 'Tracker' do pod 'GoogleAnalytics' end target 'ObjcLibUseEmbededFrameworkTests' do inherit! :search_paths # Pods for testing end end
まずは、modulemapファイルを定義する。
プロジェクトファイルの同階層に Libraries/GoogleAnalytics/module.modulemap
を作成。
中身は下記のようにする。
module GoogleAnalytics { // Embedded Frameworkで使いたいヘッダーを定義 header "../../Pods/GoogleAnalytics/Sources/GAI.h" header "../../Pods/GoogleAnalytics/Sources/GAIDictionaryBuilder.h" header "../../Pods/GoogleAnalytics/Sources/GAIFields.h" link "GoogleAnalytics" }
まず、module GoogleAnalytics {
のGoogleAnalytics
部分がEmbedded Frameworkでインポートするモジュールになる。
header hogehoge..
の部分は先で定義したGoogleAnalytics
モジュールに含める機能のヘッダーを指定する。
この場合、GoogleAnalytics
モジュールはGoogleAnalytics
のGAI.h
,GAIDictionaryBuilder.h
,GAIFields.h
を含むことになる。
link
はリンカ処理の時に追加されるモジュールを指定する。
ここに書かない場合は手動でGoogleAnalyticsのStaticLibraryを手動でリンクする必要がある。
手動でやる場合は、
[Build Phases]-[Link Binary With Libraries]に{$SRCROOT}/Pods/GoogleAnalytics/Libraries/libGoogleAnalytics.a
を指定する
module.modulemap
を生成したら次に、Embedded FrameworkのTargetの[Build Settings]-[SWIFT_INCLUDE_PATHS]に、module.modulemap
のあるフォルダパス"${$SRCROOT}/Libraries"
を指定する。
これでEmbedded Framework内で先にmodulemapで定義したモジュール名でインポートできるようになる。
import GoogleAnalytics
linkerエラーになった場合は、ターゲットの[Build Phases] - [Link Binary With Libraries]に必要なものを追加していく。 GoogleAnalyticsの場合は、自身のStaticLibraryやPodSpecファイルのframeworksやlibrariesを見て追加していく。