CocoaPods を OS X アプリ開発で使う

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

OS X Advent Calendar を始めてみました。

OS X アプリ開発は、今のところ iOS アプリ開発ほどの人気はないようですが、今後はもう少し広がっていくような雰囲気も感じます。このため、OS X アプリを開発する場合の Tips がもっと集まったらいいな、という想いで始めました。

また、OS X アプリ開発に限らず、開発で OS X を使う場合の Tips がもっと集まったらいいな、という想いもあります。やっぱり Mac が好き。やっぱり OS X が好き。

このため、今回の OS X Advent Calendar は OS X アプリ開発に限定せず、テーマを広くして「OS X に関することなんでも」ということにしました。

まだ OS X Advent Calendar は参加者を募集していますので、ぜひご参加ください。

CocoaPods を OS X アプリ開発で使う

今回は、CocoaPods を OS X アプリ開発で使う話をします。

CocoaPods は現状 Swift 非対応(Bridging Header を使うという手はある)で、アプリ開発が Objective-C から Swift に移行しつつある中、CocoaPods が今後どういう方向に進むかは何とも言えないところではありますが・・・。

CocoaPods は iOS アプリ開発では当然のように使われてきました。しかし、OS X アプリ開発では、昔ながらの外部ライブラリを手動で管理する方法が使われている場合も多いかと思います。

しかし、実のところ OS X アプリ開発でも簡単に使うことができます。Podfile の書き方は iOS の場合と同じで、platform 指定を osx にするだけです。

source 'https://github.com/CocoaPods/Specs.git'

platform :osx
xcodeproj 'Hoge.xcodeproj'

pod 'Hoge'
...

実際に使用している例として、CotEditor の Podfile も参考になるかと思います。

OS X 向けの Pod を作る

通常、iOS 向けの Pod は、静的ライブラリとしてビルドされ、アプリにリンクされます。

OS X 向けもそれでもいいのですが、OS X アプリ開発で外部ライブラリを使う場合は framework の形で扱うのがより自然だと思います。したがって、OS X 向けの Pod は、framework としてビルドし、アプリにリンクする形にしたいです。

しかし実は、CocoaPods は framework の扱いはあまり上手ではありません。Xcode でのビルド時に framework をビルドしてリンクする、という形で workspace を生成してくれないのです。

では CocoaPods で配布されている OS X 向け Pod はどうなっているのか、と見てみると、実は多くは、ビルド済みの framework を単にコピーしてアプリにリンクする形になっています。まあ、リリース版 framework の配布の場合はそれもありかもしれませんが、自分で framework をいじって Pod として管理したいと思うと、少々面倒な感じになってしまいます。

そこで多少なりとも負荷を軽減するため、podspec 内の prepare_command で framework をビルドするという手を使っています(OgreKit の CotEditor modified 版の OgreKit.podspec から抜粋)。

s.prepare_command = <<-CMD
                      xcodebuild -target All
                      mv build/Default/OgreKit.framework .
                      CMD

Pod の更新時には、いったん Pods フォルダを削除して pod install しなおすことで framework がビルドされます。ちょっと面倒ではありますが、別プロジェクトで framework をビルドするよりは pod コマンド1つですむほうが、幾分かは楽であると思います。

まとめ

以上、CocoaPods を OS X アプリ開発で使う場合に iOS と違う点について記述しました。

この投稿は OS X Advent Calendar 20141日目の記事です。