PairsをインストールすることでiOSの設定アプリが強制終了してしまう問題について

Muukii (Hiroshi Kimura)
Nov 26 · 7 min read

Pairs事業部のiOSエンジニアの木村です。

この度、Pairs の iOSアプリ Version 81.0.0にて発生した問題である、

「Pairs(v81.0.0)をインストールすることでiOSの設定アプリが強制終了してしまう問題」

この事象についての技術的な解説を行います。

また、今回発生した問題についてはこちらの記事にて解消方法が記載されておりますが、

現在公開されている最新のバージョン(v82.0.0)ではこの問題は解消しておりますので、現在も問題でお困りの方がいらっしゃいましたらAppStoreにてPairsのバージョンアップをお試しください。

こちらにつきまして、ご迷惑をおかけしたことをお詫び申し上げます。

発生した問題について

問題の事象についての詳細は次のとおりです。

  • Pairs(v81.0.0)をインストールすることでiOSの設定アプリが強制終了する問題が発生する
  • Pairs(v81.0.0)をiOSからアンインストールすることでこの問題は解消する。

なにが原因だったか

結論としては、Settings.bundle内に配置するplistに無効な値が入っていたことが原因でした。

こちらを詳しく解説します。

インストールされるすべてのiOSアプリは、iOSの設定アプリにアプリごとの設定画面を持つことができ、その項目として一覧に表示されます。

この設定画面には任意の項目を追加することが可能で、そのためにはSettings.bundleを作成しアプリに同梱します。

Pairs iOSアプリでは、この設定画面にてOSSのライセンス表示を行うために利用しています。

OSSごとにライセンス表示を行うため、OSSをタップすると、ライセンス表示の画面に遷移する、 List - Detail 型のUIになるように設定をしていました。

実際には次のようなスキーマです。

今回、このarrayの中に無効な値が入ってしまいました。

これが原因で、設定アプリが強制終了したと考えています。

Settings.bundleで使用するplistのスキーマに関しては次のリンクから確認可能です。

なお、plistファイルが無効な形状だった場合のOSごとの挙動は次のようになりました。

iOS13

設定画面のPairsを選択 -> ライセンス画面で強制終了

これを行うとPairsをアンインストールするまで設定画面が開けなくなる

iOS10〜iOS12

設定画面のPairsを選択 -> ライセンス画面で強制終了

もう一度開くと一度強制終了はするものの、その後は問題なく操作できるようになる

なぜ発生したか

Pull-RequestにおけるレビューからSettings.bundle内の変更が通ってしまったことが原因となります。

どのように再発防止ができるか

これらを踏まえて、既にいくつかの再発防止策を実施または検討しています。

Pull RequestにSettings.bundle内の変更が含まれる場合に警告を表示する

Pairsの開発ではPull Requestの内容の一部をDangerというコードレビュー自動化ツールを使って機械的にチェックしています。

Settings.bundleのような普段あまり変更が入らなかったりコンパイルされないファイルは今回のように抜け漏れが発生しやすいため、変更があればPull Request上に警告を出してコードレビュー時に気付きやすくしました。

後述するようにオペミス自体を起こさないようにする方法もありますが、まずはミニマムですぐ出来るものとして既にDangerの設定を変更済みです。

Settings.bundle更新作業の完全自動化

Settings.bundle配下のファイルを更新する際はローカルでコマンドを実行してplistを生成し、それを手動でgitにコミットしています。

これをローカルではなくBitriseなどのCIサービス上で実行しコミットまで自動化してしまえば不用意にファイルを触るなどのオペミスが発生することはなくなるはずです。

Dangerは変更内容以外にも様々な項目をチェック可能なので、Settings.bundleが特定のAuthor(この場合はCIサービスからの変更に用いてるアプリケーションアカウント)やコミットメッセージ以外で変更されていたらマージを禁止してしまってもいいかもしれません。

リリースをチェックする仕組みの強化

OS標準アプリとはいえ期待する振る舞いがある以上動作の確認をするのが理想ですが、毎回手動で行うことは現実的ではありません。

Xcode9からXCUIApplicationが強化され、UIテスト上でSafariや設定アプリなど標準アプリの操作が可能になりました。これらを使って設定アプリが問題なく起動するか、正しい表示がされているかを確認するテストを書くこともできそうです。そうすれば万が一コードレビューのときに見落としてしまってもリリース前に気付くことができます。

ただUIテストを保守するコストは決して低いものではありませんし、標準アプリは自分たちのアプリに比べてアンコトローラブルな部分が多く、安定的に稼働するのは難しい可能性があります。Settings.bundle内の更新頻度などを考慮して、本当にUIテストが必要かどうかはよく検討する必要がありそうです。

おわりに

改めて、今回このような問題を発生させてしまったことを深くお詫び申し上げます。今後もソフトウェアの品質向上に努めて参ります。

Eureka Engineering

Learn about Eureka’s engineering efforts, product developments and more.

Muukii (Hiroshi Kimura)

Written by

iOS Engineer & Head of Development, Pairs Global at Eureka, Inc. https://twitter.com/muukii_app

Eureka Engineering

Learn about Eureka’s engineering efforts, product developments and more.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade