ドイツのCOVID-19のシステムがすごいなって

ドイツのCOVID-19対策アプリのコードを検索したら、ガチだなって思ったので、ポエムを書きます。

ランディングページは https://coronawarn.app です。このアプリを使うことで得られるメリット、陽性判定時の登録や曝露通知の受け取りなどの使用フロー、プライバシーの保護、そしてオープンソースで運営していることが説明されています。20日時点で1000万ダウンロードを超えるようです。

開発の事業者

ホームページ、登録/検証サーバ及びiOSとAndroidのネイティブアプリなど、このシステム一式が https://github.com/corona-warn-app にあります。それぞれのライセンスを見ると、ライセンス形式はどれも Apache License, Version 2.0 です。著作権者は、ベリフィケーション・サーバーが Deutsche Telekom AG.、ウェブサイトが Deutsche Telekom AG and SAP SE or an SAP affiliate company.、サーバー及びモバイルアプリがSAP SE or an SAP affiliate company.となっています。主軸の開発はSAPで、後に出てくる認証サーバーはドイツテレコムが構築するチーム構成のようです。

システム構成

ドキュメントのなかに、全体アーキテクチャが説明されています https://github.com/corona-warn-app/cwa-documentation/blob/master/solution_architecture.md 。図を見ているだけで、ものすごくわかった気持ちになるドキュメントです。図はSAPが内部で使う FMC と UML を融合させたTAM http://www.fmc-modeling.org/fmc-and-tam という形式だそうです。なんとなく眺めてみます。

コンポーネンツ

登場人物は、利用者と、厚生省庁そして検査機関と医師の3つです。サーバーはオープンテレコムクラウドでホストされます。

ベリフィケーションのインタラクションフロー

左上から、利用者のアプリインストールと通知を受け取るためのサインアップ(オプショナル)、感染検査とその結果の受け取り、アプリの感染者のテンポラリキーの回収が書かれています。teleTANは、人が読むことができるトークン文字列です。

ベリフィケーションのデータフロー

ベリフィケーションのデータフローは、数字の順番に見ていくと、処理の流れがわかります。アプリとサーバー間で、GUIDや登録トークンを交換し、それらはハッシュ関数に通して保存されます。テスト結果サーバー/確認サーバー/テンポラリキー保存サーバがそれぞれあり、サーバーの中核になるのが確認サーバーです。

このドキュメントから、それぞれのサーバー及びアプリの開発に、チームごとに開発が下りていくのでしょうが、それぞれの関係が纏まっていて、わかりやすいです。また、Apple/Googleの曝露通知の仕組みを、識別子やBLEの振る舞いまで細かく説明をしていて、プライバシー保護などの根拠として十分な技術情報がまとめられています。よくできてます。

陽性判定者と接触したことを通知するときに、オプションで、その通知者のテンポラリキーも回収する作りになっていたりと、とにかく感染の可能性のある人を見つけようとする仕組みが細かいところに入ってる感じで、よく練られてるんだろうなと感じます。

iOSアプリ

欧米ではAndroidのシェアが大きくiPhoneは少数派ですが、私がiOSしか分からないので、iOSのコードを見てみます。 https://github.com/corona-warn-app/cwa-app-ios

アプリ画面

アプリ画面のデザインは、今時の全画面で有機ELなiPhoneらしい、白を基調として、アイコン的な画像と十分に大きな文字で説明、そして最後に確認ボタンを配置した、現代的なアプリデザインです。みやすいです。

コードを開くと、UIはパーツごとにxibファイルに分割されていて、チーム開発でコンフリクトが生じにくいよう範囲が最小になっています。シンプルなアプリのはずですけど、ものすごいファイル数です。

/post/deutsche-covid19-app/1.jpg

当然と言えば当然なのですが、UIテストなどのターゲットが作られていて、リリースサイクルも管理されていて、いい感じです。