CocoapodsをtvOSで使う

このエントリはiOS Advent Calendar 2015の8日目のエントリです。
「iOS」のAdvent Calendarですが、ちょっと拡大解釈して今日は tvOS のお話です。

はじめに

Apple TVは2015年10月に発売されたもので第4世代になります。

  • Apple_TV

    第1世代
  • Apple_TV_2nd_Generation

    第2 & 3世代

第3世代までのApple TVはプリインストールのアプリや、ネットワーク経由で追加される公式アプリしか動作させられませんでした。

第4世代ではOSとしてtvOSを搭載し、AppStoreからアプリをインストールできる様になりました。そして、アプリの開発が一般のデベロッパにも解放されました。

tvOSはiOSをベースに開発されており、アプリの開発環境にはXcodeを使用します。
MacにApple TVをUSBケーブル(Type-C)で接続すればiPhoneと同じ様に実機デバッグできるし、シミュレータも用意されています。

iOSと似ているのは開発環境だけではありません。
iOSエンジニアであれば見覚えがあるであろう、Storyboard、UIKit、各種Frameworkを使用して、Objective-CやSwiftで開発することができます。

CocoaPodsのライブラリを使う

と言う訳で、iOSの知見を活かしてtvOSの開発をする訳ですが、iOS開発に欠かせない周辺ツールの筆頭と言えば何と言ってもCocoaPodsですよね。

もちろんtvOS開発でも使えます。
Podfileをこんな風に書きましょう。

platform :tvos, '9.0'
use_frameworks!

pod 'Alamofire'

ポイントとしては、platformにtvosを指定することぐらい、ですね。
Podfileを書いたらpod installすると.xcworkspaceができるところも同じです。

…ということで喜び勇んで開発を始めると悲しいメッセージを見ることがあります。

does-not-support-tvos

これは「このライブラリはtvOSに対応していないよ」のメッセージです。
10月のApple TV発売直後はほとんどのライブラリがこの状態でした。

12月現在ではかなりのライブラリがtvOSに対応しているのですが、それでもまだ一部のライブラリは対応していません。

こんな時はライブラリがtvOSに対応するまで待っても良いのですが、少しの作業でtvOS非対応のライブラリをtvOSでも使うことができます。

ライブラリをtvOS対応させる

と言ってもたいそうなことではありません。

CocoaPodsのライブラリは、.podspec という名前のファイルが含まれ、そこにサポートするOSのタイプやバージョンが書かれています。

tvOSに対応していないCocoaPodsライブラリの多くは、そのままtvOSで動くのに .podspec でtvOSのサポートが指定されていないために、上記の様なエラーになっています。

例えば、SocketRocketの0.4.1は以下の様になっています。

Pod::Spec.new do |s|
  s.name               = "SocketRocket"
  s.version            = '0.4.1'
  s.summary            = 'A conforming WebSocket (RFC 6455) client library.'
  s.homepage           = 'https://github.com/square/SocketRocket'
  s.authors            = 'Square'
  s.license            = 'Apache License, Version 2.0'
  s.source             = { :git => 'https://github.com/square/SocketRocket.git', :tag => s.version.to_s }
  s.source_files       = 'SocketRocket/*.{h,m}'
  s.requires_arc       = true

  s.ios.deployment_target = '6.0'
  s.osx.deployment_target = '10.8'

  s.ios.frameworks     = 'CFNetwork', 'Security'
  s.osx.frameworks     = 'CoreServices', 'Security'

  s.libraries          = "icucore"
end

ここでは、12~13行目でiOSの6.0以上、OS Xの10.8以上が指定されています。

…ということは、と思ったあなた、正解です。

ここに

s.tvos.deployment_target = "9.0"

を追加すれば、このライブラリはtvOSでも使うことができる様になります。

ライブラリへのパッチ

CocoaPodsを使ってライブラリをインストールする時には上記の様にPodfileにライブラリ名を書きます。

ここで、ライブラリ名だけ、または、ライブラリ名とバージョン名だけを書くとそのライブラリはcocoapods.orgから検索されてインストールされます。

実はPodfileにはGitのリポジトリURLを書くことも可能です。ということは、自分でGitリポジトリにソースを置いて、そのソースをPodfileから参照することも可能なのです。

CocoaPodsのライブラリの多くはGitHubにホストされていますので以下のステップでtvOS非対応のライブラリもtvOSで使うことができる様になります。

1. 対象のライブラリのGitHubリポジトリをフォークする

fork

2. GitHub上でpodspecファイルを開いてEditボタンを押す

edit

3. ターゲット設定をしている場所を探して「s.tvos.deployment_target = “9.0”」を追記、[Commit changes]ボタンを押す

commit-changes

4. PodfileにGitリポジトリのパスを書く

platform :tvos, '9.0'
use_frameworks!

pod 'Alamofire'
pod "SocketRocket", :git => 'https://github.com/hasegawa-tomoki/SocketRocket.git'

5. pod update !

これでtvOS非対応のライブラリをtvOSで使うことができます!
豊富なiOS資産を活かしてtvOSアプリを楽しく開発しましょう!!

写真のクレジット:
“Apple TV” by Max Lewis – Flickr. Licensed under CC 表示 2.0 via ウィキメディア・コモンズ – https://commons.wikimedia.org/wiki/File:Apple_TV.jpg#/media/File:Apple_TV.jpg