FacebookSDKによるiOSアプリの起動時クラッシュ騒動
2020年7月10日に、いくつかのiOSアプリケーションで起動時にクラッシュする不具合が発生して、話題になりまた騒動になっていました。
Facebook SDKとは?
Facebookが提供する、アプリケーションに組み込んで利用するライブラリです。いくつかのライブラリがありますが、Facebook SDKは、 https://developers.facebook.com/docs/app-events/overview
アプリ広告の成果を追跡したり、効果的なシェア機能を実装したり、Facebookを使ってアプリへのログインを促す、最も簡単な方法です。
というものです。
アプリのイベントを記録して、Facebookが提供する環境でログ収集と分析ができるようです。使ったことないので、よく知らないのですが。 ユーザの行動や購買記録の収集のみならず、カスタムなイベントを設定して収集できるようで、汎用のログ収集手段としても使われるのでしょう、たぶん。
イッシューはお祭り騒ぎ
Facebook開発者サイト https://developers.facebook.com/support/bugs/329763701368293/ の不具合の報告では、クラッシュしたアプリのスタックが報告されてファイリングされる一方で、囃立てるコメントが大量について、お祭り騒ぎになっていたようです。
Facebook SDKのソースコード はGithubに公開されています。Githubでもイッシューの登録に続いて、お祭り騒ぎのコメントがたくさんついていました。 https://github.com/facebook/facebook-ios-sdk/issues/1431
原因とその修正
原因は、SDKの実装がサーバーからのレスポンスを暗黙的に扱っていたこと、そしてサーバレスポンスの変化による例外発生です。
その騒動の原因は、Facebook SDKにある、制限されるデータのフィルタリング機能が、アプリ起動時にFacebookのサーバーからセンシティブとして検出されたイベントとパラメータを読み込みます。ここが、サーバ側からのレスポンスをチェックしていなかったために、サーバ側の変更でデータ構造が変化すると、例外を発生してしまうというものです。Objective-Cで、よくやっちゃうやつですね。
修正差分は、https://github.com/facebook/facebook-ios-sdk/commit/b1ec939cb994dbcf85b495ec747753289271f105 にあります。サーバから受け取ったレスポンスは辞書データとして渡されます。その辞書で特定のキーで値があるか、なければnil扱いとする、そのような変更が入っています。
この修正部分に対するテストコード https://github.com/facebook/facebook-ios-sdk/commit/64cc769c8bad9ffa25c60085367ff08c3492a3e2 。
イッシューにあったスタックにある、例外の発生箇所は、FBSDKEventDeactivationManager.m 65行目 あたりです。コード自体は、サーバからデータを取得して処理するだけのコードです。
Blameで見ると11日前、6月末に変更が入っていますが、その変更自体は、サーバからのデータ取得をアプリ起動中1回に制限するだけのものなので、このサーバーからデータを取得する処理自体は、(めんどいから調べていませんけど)ずっと以前からあったのでしょう。
https://github.com/facebook/facebook-ios-sdk/commit/a6fd9f03f042a9f999b81a824c0b09917beeb927
影響
このSDKを組み込んでいれば、アプリが起動時にクラッシュするという不具合ですらから、このSDKを使っていれば影響します。ソーシャルメディアやソーシャルゲーム、スマートキー、ドローンの操縦アプリなど、いくつものアプリケーションが影響を受けたようです。
スマートキーのアプリが起動しなければ、自宅に入れなくなりそうです。ドローンでは、操縦中にアプリがクラッシュして起動しないためドローンを喪失する方もいたようです
対策?
アプリの利用者が取れる対策は、ありません。Facebookのサーバレスポンスの変更が原因でしょうから、機内モードで使えばアプリが動く可能性はあります。ですが、アプリの起動後にネットワークをオンにすれば、いつかはこの部分がサーバにアクセスしてクラッシュするでしょう。ネットワークへの接続がなくても問題がないアプリは、とても少ないでしょうから、避けようがないとしか言いようがありません。
アプリ開発者が行うべきことは、更新されたSDKでビルドして、アプリケーションを更新することです。今はおそらくFacebookのサーバーが、クラッシュを起こさないレスポンスを返しているのでしょう。急ぐことはないかもしれませんが、アプリケーションの適切な更新時に、この不具合への修正が盛り込まれたSDKに更新すべきでしょう。
このようなことが今後起きないように、アプリケーション開発者が取れる根本的な対策は、ありません。SDKの内容を個別にレビューするのは、Facebookに雇用された開発者の仕事です。そんな仕事ができるなら、Facebookに雇用されるだけでしょう。ただ、サーバレスポンスの変更で容易にクラッシュするという部分が他にないのかなど、徹底的なレビュー祭りが社内の開発者で行われるのか、また不具合がレポートされたら動けばいいやとするのかは、今後の信頼感に繋がるのかなという気がします。
この世の中の色々なものがネットワークで繋がった時代は、地球のどこかにあるサーバの振る舞いがちょっと変わると、自宅にすら入れなくなる、よくある体験がよくある出来事として体験されたと思います。自分が所有しているはずの何かは、その制御権をネットワークを通じて他に渡している状態なので、そんなことも起きるのでしょう。