hachinoBlog

hachinobuのエンジニアライフ

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 を作成。

f:id:hachinobu:20190104165737p:plain

中身は下記のようにする。

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モジュールはGoogleAnalyticsGAI.h,GAIDictionaryBuilder.h,GAIFields.hを含むことになる。

linkはリンカ処理の時に追加されるモジュールを指定する。

ここに書かない場合は手動でGoogleAnalyticsのStaticLibraryを手動でリンクする必要がある。

手動でやる場合は、

[Build Phases]-[Link Binary With Libraries]に{$SRCROOT}/Pods/GoogleAnalytics/Libraries/libGoogleAnalytics.aを指定する

f:id:hachinobu:20190104170050p:plain

module.modulemapを生成したら次に、Embedded FrameworkのTargetの[Build Settings]-[SWIFT_INCLUDE_PATHS]に、module.modulemapのあるフォルダパス"${$SRCROOT}/Libraries"を指定する。

f:id:hachinobu:20190104170355p:plain

これでEmbedded Framework内で先にmodulemapで定義したモジュール名でインポートできるようになる。

import GoogleAnalytics

f:id:hachinobu:20190104170543p:plain

f:id:hachinobu:20190104170609p:plain

linkerエラーになった場合は、ターゲットの[Build Phases] - [Link Binary With Libraries]に必要なものを追加していく。 GoogleAnalyticsの場合は、自身のStaticLibraryやPodSpecファイルのframeworksやlibrariesを見て追加していく。

https://github.com/CocoaPods/Specs/blob/master/Specs/4/9/c/GoogleAnalytics/3.17.0/GoogleAnalytics.podspec.json#L33