読者です 読者をやめる 読者になる 読者になる

窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

Xamarin.iOSでFCM(Firebase Cloud Messaging)を使う

経緯

GCMのAPIキー取りに行こうと思ったらFCMの方が新しいよ!こっちとったほうがいいよ(強制)という感じでFirebaseを使うかーと思い立ったため.

実際に検索してみると動作してるライブラリがあまり見つからず困っていたところ

Google Firebase Support · Issue #29 · xamarin/XamarinComponents · GitHub

を発見.ビルドして動かしてみることを決意.

追記: 2016/10/01 nugetパッケージがもうビルドされてリポジトリの中にあったので,それ使えばいいと思います.自分でビルド試してみたい方は以下の記事をお読みください.

おことわり

完全に備忘録に近いのでだいぶ不親切な感じですが,自分も完全に理解できたわけではないので...もうちょっと理解が深まったらQiitaとかにまとめます.

動作環境は * Mac OSX El Capitan 10.11.6 * Xamarin Studio Community 6.0.2

Macでしか確認してませんが,多分Windowsでもコマンドに違いはあれど問題なくトレースできると思います(まともなWindows環境持ってないのどうなんだという)

リポジトリのクローン

公式リポジトリにもfirebaseのブランチは存在するが,実際にはFirebase関連のファイルが存在していない. そのためforkリポジトリをベースに作業を行う.

git clone git@github.com:SotoiGhost/GoogleApisForiOSComponents.git
cd GoogleApisForiOSComponents
git checkout firebase

READMEに沿ってBuildを進めていく.CocoaPodsはbrewなどで入れるのが良いだろう.

cd Google.Core
sh ../build.sh --target libs

環境によってはここでエラーが出るかと思う.エラー文としては

The UTC time represented when the offset is applied must be between year 0 and 10,000.
Parameter name: offset

といったものである.これはnugetのバグだそうなので,公式リポジトリIssueにあるように

cd Google.Core
rm ../tools/nuget.exe
curl -Lsfo ../tools/nuget.exe "https://dist.nuget.org/win-x86-commandline/v2.8.6/nuget.exe"
sh ../build.sh --target externals

とすればnugetに関するエラーが取れるはずである.

Firebaseのnupkg化

今回の目的はFCM(Firebase Cloud Messaging)を使うことなので,FCMを使えるようにビルドを行う.Firebase.ClouldMessagingは * Firebase.InstanceID * Firebase.Analytics

に依存している.そのためまず初めにFirebase.InstanceIDからビルドを行う.

他のプロジェクトで使い回しがしやすいようにそれぞれのプロジェクトをnupkg化する.

cd Firebase.InstanceID
sh ../build.sh --target nuget

この二行で Firebase.InstanceID/output 下に${パッケージ名}.nupkgが生成される.あとはこのnupkgをローカルのリポジトリに格納し, nugetリポジトリの参照先をローカルに向けるだけで使用することができる.

同様にFirebase.Analytics, Firebase.ClouldMessagingのnupkg化を行い,ローカルのnugetリポジトリに格納する.

これで大まかな準備は完了である.

localのnugetパッケージを設定する - Qiita

Xamarinのプロジェクトで使ってみる

実際にXamarin.iOSのプロジェクトにnugetで追加を行う. GoogleService-Info.plist はビルドアクションをBundleResourceに設定すること. これで完了ではなく,最後にビルドオプションを加える必要がある.

iOSのプロジェクトのプロジェクトオプション->iOS BuildのAdditional mtouch argumentsに -gcc_flags "-ObjC" を記入する.これがないとこんなエラー で頭を悩ませることになる.

アプリの実装だったり証明書など

公式のドキュメントを追えばどうにかなるが,

FirebaseのPush通知をiOSで使ってみる - Qiita

SwiftでFirebaseを使ってNotificationを送ってみた(が、色々詰まった話) - Qiita

が非常に分かりやすくまとまっているので参考にするといいかもしれない.

実装はFirebaseのquick-startをほぼ丸写しで動いた(丸写しで動きそうなライブラリを探してたらここに行き着いた

その他

実際ビルドも面倒だったが,動かしてみるとトークンが取れないなどの別の障害が出てきて苦労したこと,またその解決法を書こうにもどれが効いてきたのかが実際のところ見当がついていない.

実際のプロダクトに導入する際に確かめてみようと思う.

f:id:yamachu_co:20160909225432j:plain:w200

これを出すために何時間かけてしまったんだ...