これは Xamarin Advent Calendar 2019 の20日目の記事です。
ちなみにPart 1はこちら。2017年7月ですね。
ほぼ2年半経って、自分が当該プロジェクトから離れることもあり「どうだったか」「今後も使いたいか」の総まとめをします。
(Part 1で書いたことへの追記部分だけを書きます)
どういうプロジェクトだったか
iOS/Android向けに同じアプリを作ってきました。(受託ものです)
もともとiOS(Objective-C)なアプリとAndroid(Java)なアプリがあって、それらの「同じようなロジック部分」をBinding Library化してPCLで共通ライブラリとし、そこにXamarin.FormsをかぶせてForms製アプリ化した、という感じです。
最初に作ったプロジェクトをベースに似て非なるアプリを数種類作り、同時進行で開発&リリースを行っていました。
中盤以降の自分の役割はプロジェクト管理や顧客窓口をしながら、Jenkinsのお守りと時々iOSやAndroidのネイティブ周りをいじる、という感じでした。今回はそういう目線が強めの記事です。
Xamarinだから良かった点
- iOSとAndroid向けのアプリをほぼ同時にリリースし続けられました。
iOSとAndroidの両方向けのアプリ開発をネイティブ実装で進めるとどうしても担当が分かれがちです。そうなると進み具合にもバラツキが出やすくなります。基本的に画面周りはXamarin.Formsを使っているので、その部分だけでもiOSとAndroidで足並みが揃いやすいことは非常にやりやすかったです。
- ソースコードの共有率がそこそこあった
最終的には全体で5割くらいはXamarin.FormsなどC#によるiOS/Androidのソース共有ができました。元々が別アプリだったのでもっと少ないかと思ったけど案外いけました。画面系だけなら8割くらいはPCL(C#)でした。
おかげで、ある程度慣れた人であれば「誰でも触れる部分が多い」という会社組織的にはありがたい状況もできました。
Xamarinだから良くなかった点
- アプリのファイルサイズが大きい
- 外部ライブラリを組み込みすぎたというところもありますが、実行ファイルのサイズがなかなかヤバいことになりました。
- リンクオプションとかProGuard(R8)とか色々と対策し、それらの効果はありましたがそれでも大きいです。
- 実行時メモリ消費量が大きい
- アプリ内で表示する画像の量が多かったということもありますが、Formsの場合Pageで画面遷移しても結局1個のViewController、1個のActivity内ですべてやることになるので、メモリ消費量が大きいための問題も結構引きずりました。
- 起動や実行速度が遅い
- そういうわけで少し、モッサリです。悲しい。
ある意味で向いていなかったのかもしれない、と最近は思っています。
あるいはもう少しやりようがあったのかもしれません。
Xamarinだからツラかった点
主にネイティブ関連で苦しめられました。
この数年でストア要件の強制が厳しくなりましたよね・・・。
- iPhone Xのセーフエリア。マジでApple嫌いになるところでした。
- AndroidのtargetSdkVersion上げが強制されるのもしんどかったです。
- 連動してSupport Library上げないといけないですし。
- 中国の地図SDKを入れたらPlayストアから怒られたり。
- クラッシュ時のスタックトレースがなぜか見づらいときがあったり
その割に、プロジェクト全体としては安定していくため「できるネイティブも分かるマン」が抜かれて「PCL(C#)書けるマン」だけになっていくのもしんどかったです。
ある意味ネイティブだけだったら起きづらい問題です。
次に同じような開発案件が来たらXamarinを推すか
iOSとAndroid向けにアプリを作りたい。なるほど。
たいして凝ったことしないから簡単に作れるやつで。なるほど。
ストア公開しない業務アプリとかならXamarinもいいかもなぁと思います。
クロスプラットフォームなツールでストア要件に振り回されるのは少しツラいです。
ストア公開しないなら、次は初期費用の話をしましょう。
新しめのお高いMac、そしてMSDN付きVisual Studioが開発者の人数分すでにある、もしくは即座に購入可能でしょうか。
iOS向けにアプリを作るのならどうしたってMacは必要になります。
Visual Studioの費用が問題にならないならXamarinも検討できます。
逆に言うと、社内の別プロジェクトが解散して「C#できるマン」が大量に余っている、といった特殊事情がないかぎり、MSDN付きVisual Studioをわざわざ追加購入するということは滅多にない気がします。
- MSDN付きVisual Studioが用意できない場合
Flutterでいいんじゃないですかね。
それでも開発者の半分くらいにはMacを与えてください。
あとはWindowsでAndroid向けを頑張りましょう。
もしFlutter(Dart)が技術的あるいは要員レベル的に難しいなら、変に欲張るのは諦めて普通にネイティブでいきましょう。
- MSDN付きVisual Studioが用意できる場合(or Communityがいける場合)
まだまだXamarinもいいぞ。
まとめ
何ごとも理想とはほど遠いですね・・・。