はじめに
先日、GitHub Issues のクライアントアプリ『IssueHub』を OSS として公開した。
IssueHub でどんな技術を使ったのか、宣言通り紹介したいと思う。
採用した技術
IssueHub は Xamarin.Forms で開発した。 言語はC#。 Xamarin.Forms を使った理由は、ソースコードをできるだけ共通化して iOS と Android の両方に対応したかったからだ。
今はメインのスマホに iPhone を使っているけど、 最近の iPhone は手が届かない金額になったので、 SE2 が出なかったら Android に移行するかもしれない。 そのときに自分のアプリを Android でも使いたいので、 クロスプラットフォーム開発が可能な Xamarin.Forms を選んだ。
Xamarin.Forms を選んだ理由
クロスプラットフォーム開発が可能なものとして、 Xamarin.Forms の他に ReactNative や Flutter なんかがある。 なんで Xamarin.Forms だったのか。
最大の理由は C# で書けるため。 ネイティブの機能が必要になったときに、 ReactNative や Flutter だとプラグインをネイティブの言語で書かなければいけないが、 Xamarin だとネイティブの API を C# でラップしてあるので、 ネイティブを呼び出す部分も C# で書ける。 この辺りの Xamarin のアプローチは個人的にかなり筋がいいと思っている。 自分が一番慣れている言語で書けるのは大きい。
GitHub の Issues のクライアントアプリというのが、 要件的にちょうど良かったというのもある。
主なアーキテクチャ
Xamarin.Forms なので主なアーキテクチャは MVVM。 大きなライブラリに依存したくなかったので、 Xamarin.Forms を使った開発では定番になっている Prism.Forms を使わず、 ReactiveProperty を使っている。 モデルの部分に関しては、Redux を採用。 そのためのライブラリとして、ReduxSharp という自作のライブラリを使っている。
Redux
最初、DDD ライクなレイヤーアーキテクチャで設計していたけど、 どこに状態を持たせるのかで頭を悩ませた。 できれば1箇所にまとめたい。 Store とか導入する例もネットで見かけた。 でも Store を持つなら、それって Redux と同じなのでは。 ということで Redux にした。
ユースケースにアクションが対応していて、 アクションで Store が持つステートが変わったら変更通知が ViewModel に届き、 ViewModel が保持するデータが変わって画面が変わる。 簡単に説明すると、そんな感じの仕組みになっている。 ReduxSharp については、これまた説明すると長くなるので、別の記事を書きたい。
認証
認証では Xamarin.Auth を使っている。 GitHub の Basic 認証のエンドポイントは廃止されるので、認証はパーソナルアクセストークンか OAuth に対応する必要があった。 パーソナルアクセストークンを発行してアプリに設定してもらうのは、使い始めるまでのハードルが高いので OAuth に対応。 まぁ、結局はユーザー自身がビルドして実機デプロイするという、この上ない高さのハードルになってしまったわけだけど。
OAuth に対応する場合、WebView を使って組み込みブラウザではセキュリティ的に好ましく見られないため、 iOS では SafariViewController、Android では ChromeCustomTab を使ってくれる Xamarin.Auth を使っている。
その他に利用しているライブラリ
Markdown の表示には MarkdownView。
純粋なクライアントアプリなので、使っているライブラリはそれくらい。
あと、GitHub の Client Id と Client Secret をソースコードに埋め込みたくなかったので、 リポジトリ管理外の secrets.json に秘密情報を書き、ビルド時に組み込む手法を導入した。
IssueHub の今後について
自分が使う分には欲しい機能だいたい揃っているので、 バグが見つかったら修正はするものの、 積極的な機能追加は考えてない。 マネタイズできそうにないし。
スマホを Android に乗り換えたら Android 対応に本腰を入れると思う。
他のアプリを公開するために Apple Developer の登録料を支払ったら、 ついでに IssueHub も App Store で公開する、かもしれない。 Android の方は登録料が必要なのは初回だけなので、 スマホを Android にしたら Play Store に公開する可能性は高い。