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

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

サポーターズCoLabの勉強会で、Xamarin.FormsでFirebase Cloud Firestoreを使うことを発表した

いつの話やねんという感じではあるのですが、自分の活動を振り返る機会があり、そういえば書いてないや…ということに気づいたので、ちゃちゃっと書いておこうと思います。

supporterzcolab.com

今回の勉強会を開こうと思ったきっかけとしては、自分が学生時代に作成した学祭アプリは実はFirebase Cloud Firestoreを使うとだいぶ楽に実装できたんじゃないかな?では今からこういったカタログアプリを作るにはどういうアプローチを取っただろうかみたいなifのルートを参加者の人と見ていきたい、と思ったことと、当時(2018年7月)XamarinでFirebase Cloud Firestoreを動作させているサンプルコードがGitHubを漁ってもiOS向けのプロジェクト しか出てこなくて、そういうとこやぞ…って辛い思いをした2点が動力源でした(他は自分でREST API叩けばいけるよ!みたいなサンプルはあったのですが、いやそうではなくてだなぁ…という思いになったのを記憶しています。)

先に成果物

github.com

勉強会準備期間

準備始めたのがツイートを見ると勉強会の4日前らしいです。

言うてぱぱっと動くやろ、内容としてはバックエンドをFirestoreにするだけでオフラインファーストなモバイルアプリケーションに出来るよって言うだけやしな、みたいな楽観的な考えがあったのは言うまでもありません。 ですが実際にやってみると単純にInitializeするだけでは動かず(そもそもアプリがクラッシュする)なんでだろうな、と頭を悩ましました。 なんとしてでも動かしたかったので、すごい雑な解決策で動かすことに決め、同じことで困ってそうな人がいそうなのでIssueに投下したりもしてました。

Firestore ProjectId is always null · Issue #104 · xamarin/GooglePlayServicesComponents · GitHub

これでAndroid版は動作が確認できたのですが、iOSが結局手元では間に合いませんでした。 この状態で当日を迎えます。

勉強会当日

自分のやってきたことと、過去に戻って再度例のプロジェクトを進めることになったらFirebase Cloud Firestoreを使っていたかもしれないみたいなifのルートを話しました。 実際のコードはこうで、みたいなことはその時は話さず(見せず)、こういうパターンではこういうクラウドサービスを組み合わせると楽が出来る、みたいな内容で進めました。

正直当日はめちゃくちゃテンパっていたので、参加者の方と何話したっけなーっていうのがあまり思い出せないですね。 会話で印象に残ったのが私も大学時代ガリガリ使っていたQtの話が出来てよかった、ってことですかね(完全に趣味の話)。

そして時は過ぎ、結局資料上げるとか言いつつ上げてないことに気づいたのが今日になっての出来事です。 どこに保存したんだろう…

勉強会が終わってから

やはりiOSが出来ていないまま終わらせるのは気分的によくなかったので、こっちも動くようにしてました。 自前でnupkgをビルドすればいいじゃんって思ったときからは一気に進みました。 当時はまだ NuGet Gallery | Xamarin.Firebase.iOS.CloudFirestore 0.9.4 しか公開されていなかったので NuGet Gallery | Xamarin.Firebase.iOS.CloudFirestore 0.12.5 を待つか、自分でビルドするかの二択でした。

今後もこういうことは起こるだろうなとは思っているので、自分でビルドしてなんならデバッグまでやるぜ、みたいなことは続けていきたいです。

最後に

Xamarin(.Forms)でもFirebase Cloud Firestoreは使うことが出来ます。 それに限らず、既存の資産を上手く使い回すことがXamarinでは可能となっています。

ref: .NET Conf 2018 Tokyo で Xamarinのネイティブバインディングのことを発表した - 窓を作っては壊していた人のブログ

クロスプラットフォーム開発したいけど、さて何使おうかな、という時にぜひXamarinも入れてみてくだい。

XamarinでFirebase Cloud Firestore使うぞのリポジトリを再掲して終わり。

github.com

.NET Conf 2018 Tokyo で Xamarinのネイティブバインディングのことを発表した

10月13日に開催された.NET Conf 2018 Tokyo, Japanで、Xamarinで各プラットフォームのライブラリを使うためのバインディングについて登壇してきました。 参加記と共に今回使用した資料の補足(ただのメモ書き)を残していこうかなと思います。

もう2週間も経つからいろいろと記憶が怪しい…

参加記

登壇側として参加したわけですが、最初っからこのイベントを知っていたか、と聞かれるとNoでした。

こんな感じで突如お誘いいただけて、それから色々ありまして参加となりました(省略)。

当日ですが、自分の登壇以外はずっとRoom C+Dで話を聞いていました。 自分が追ってるXamarin関係以外の話題をキャッチアップできたり、全く知らなかったAzure Pipelinesを知ることが出来て非常に学びが多かった。

自分の発表に関しては、緊張した、緊張して早口で混乱した。 それ以外の感想が実際ないです…もうちょっと練習しなきゃ…という懺悔は次の節で。

資料とちょっとした補足

www.slideshare.net

まずはじめに懺悔

iOSの説明がスッカスカになってしまって申し訳ございませんでした。 実はiOSの部分当日の朝からさてどうしようかなぁって始まったんです

また最初に今回の発表の内容をどの層に向けにしようか、どのレベル感にしようかという、対象を定めきれていなくて、中途半端になってしまったなぁという後悔があったりします。 私の所属する会社は発表前にこんな感じでいいかな、伝わるかな、みたいのをすり合わせたりする 素振り というものを行っているのですが、それを十分に活用しておけばなぁと思いました(事前に人に見せることは自分の気持的にも必要なことなので、締切ギリギリまで資料を作り続ける、ということにならないように早め早めに動きましょう)。

弊社の素振りについての参考記事

techlog.voyagegroup.com

次回何らかの発表の機会があったときにはこういう後悔をしないようにしたいですね。

以下補足と自分で思い出す用の参考リンク。

Android

  • jar の Build Action は2つ覚えればいいという理由

remove-node で削除してしまえば結局同じじゃないですか、という割と雑な理由だったりします。 EmbeddedReferenceJarに関しては確かにJarの依存関係をそのまま示せてシングルパッケージに閉じ込められる、ということで使い道はあります。 それぐらいかなぁと言うことしか思いつかないので、であればInputJarとEmbeddedJarで頑張る、でいいよねということで、2つ覚えればいいというような記述にしました。 ですが、

  • 他のライブラリからまず呼ばれることが無いライブラリである(例:自社SDKバインディング対象からしか呼ばれることがない)
  • 作成したライブラリを公開する予定がなくて、作っているアプリケーションぐらいでしか使わない

という条件を満たした場合、EmbeddedReferenceJarの方が楽なのかもしれません。

(前雑にEmbeddedReferenceJarとかを使って複数のバインディングライブラリを使ったらGsonのバージョン云々でハマったことがあり、それからBindingのタイミングで依存解決するのは大変かもしれないと思ってやめた経緯があります。 .NETに乗っかってるし、NuGetで示そうか、みたいな気持ちもあります。)

  • aarは一個

https://bugzilla.xamarin.com/show_bug.cgi?id=44573

こんな仕様があったりします。

https://docs.microsoft.com/ja-jp/xamarin/android/platform/binding-java-library/troubleshooting-bindings

  • スライドにはない補足情報

今回の発表資料にはEnumやAdditions.csに関してのことを載せませんでした。 というのも割とプロジェクト特有のものが多かったりで、実際使わないことが多いんじゃないかなぁと判断したためです(JINSMEMEのSDKラップの時は多用しましたが)。

今回JINSMEMEのSDKのラップでは

JINSMEME.Xamarin/Additoins.cs at master · yamachu/JINSMEME.Xamarin · GitHub

こんな感じで使っています。 本来であればEnumFields.xmlを編集し、Enumマッピングを行うべきなのですが、今回のライブラリではEnumを戻り値とするメソッドのバインディングに失敗していてEnumをそのままバインディングすることが出来ませんでした。 解決手段はだいたい見つけたので今度試してここの説明を書き換えたいです。

ざっくりとした方法としては

  • EnumFields.xmlEnumマッピングを記述
  • EnumMethods.xmlEnumを用いるメソッドを記述 せずに
  • Enumを用いるメソッドをremove-nodeし
  • Additions.csにEnumを用いるメソッドを正しい呼び出し方法で実装

すれば可能でしょう(完全に自分用メモ)。

iOS

  • staticライブラリかdynamicライブラリを知らなければいけない理由

dynamicライブラリなのに、staticライブラリとしてビルドした場合、バインディングライブラリをビルドするタイミングでは気づかずにランタイムで死にします。 厄介なところとしては、起動してそのライブラリを読み込もうとした段階でアプリが落ちるので、非常にログが取りづらく原因が特定しづらいです。 Xcodeとかのデバイスログ眺めるとかで対処気づくことも出来るのかもしれませんが(未確認です)。

staticかdynamicかは file コマンドで簡単にわかるので、まずこのファイルなんだろう、ってなったらfileコマンドを叩きましょう。

  • linkwith.csとか手書きしてるけど、いるの?

あのファイルが正しく書かれていない、または存在しない場合、アプリケーションにリンクさせる段階で死にます。

Undefined symbols for architecture arm64:
      "_OBJC_CLASS_$_MEMERealTimeData", referenced from:
          objc-class-ref in registrar.o
      "_OBJC_CLASS_$_MEMELib", referenced from:
          objc-class-ref in registrar.o
         (maybe you meant: _OBJC_CLASS_$_MEMELibDelegate)
      "_OBJC_CLASS_$_MEMEData", referenced from:
          objc-class-ref in registrar.o
    ld: symbol(s) not found for architecture arm64
    clang : error : linker command failed with exit code 1 (use -v to see invocation)
    
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMERealTimeData. The symbol '_OBJC_CLASS_$_MEMERealTimeData' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMELib. The symbol '_OBJC_CLASS_$_MEMELib' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMEData. The symbol '_OBJC_CLASS_$_MEMEData' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5202: Native linking failed. Please review the build log.

iOSバインディングのエラーログ

わりと大切なことなのに資料に載せていなくて申し訳ございません… 手作業で追加しているけれども、frameworkファイルを追加したら.aの時のようにlinkwith.cs作ってくれないのかしら…

最後に

とりあえず資料のアップともう少しこの辺は補足として…ということは書けた気がするので今回はこのへんで… 発表もそうだけど記事書くのもちゃんと練習しないとと思った。