Xcode
iOS

App ExtensionでCocoaPods管理しているライブラリを使用する2つの方法

More than 3 years have passed since last update.

修正

potatotips (iOS/Android開発Tips共有会) 第9回での発表資料が新しい情報になります。

App ExtensionでCocoaPods管理しているライブラリを使用する方
https://speakerdeck.com/tmnb/app-extensiondecocoapodsguan-li-siteiruraiburariwoshi-yong-surufang

--

iOS8の新機能App Extensionを開発する中で、CocoaPodsで管理しているライブラリを使用したくなるケースが必ずでてくると思います。そこで2つの方法を紹介したいと思います。

https://www.facebook.com/groups/ios.dev.jp/permalink/768435093177874/ で質問してフィードバック頂いた内容の詳しいやり方です

方法1 : PodsのtargetにExtensionを指定する

おそらく1番お手軽な方法です。
例えばExtentionの名前がWeatherExtentionだった場合、Podfileに

target :WeatherExtention, :exclusive => true do
    pod 'AFNetworking'
end

として、pod installします。これだけで使用できるようになります。

※本体側で同じライブラリを使用している場合は、重複して導入されるのでアプリの容量が増える?

方法2 : Cocoa Touch Frameworkを作成する

XCode6からCocoa Touch Frameworkを作成できるようになりました。Cocoa Touch Frameworkを作成すると、本体側、Extension側で共通のコードをFramework化する事ができます。このFrameworkにPodsのライブラリを含める方法です。Podsライブラリは作成したFrameworkを通して使用するようになります。

1. CoCoa Touch Frameworkを作成する

File > New > Target > Framework & Library > Cocoa Touch FrameworkからFramework targetを作成します。

2. Podfileの設定

例えばの1で作成したFramework名がWeatherKitだった場合、Podfileに

link_with 'WeatherKit'
pod 'AFNetworking'

として、pod installします。

3. FrameworkのヘッダーファイルにPodファイルのヘッダーをimportする

WeatherKit.h
#import <AFNetworking/AFNetworking.h>

4. Build Settingsの変更

このままコンパイルすると、エラーになるので本体側、Extention側のBuild Settings > Allow Non-Modular Includes In Framework Modulesの設定をYESにします。

本体側
a.png

Extention側
b.png

5. 本体側、Extension側でFrameworkを使用する

あとは、使用したいファイルで

@import WeatherKit;

とすることで、Podsのライブラリが使用できるようになります。

方法2で動くプロジェクトのサンプルを作ったので、https://github.com/tmnb/WeatherForecast から試せます。