
Now in REALITY Tech #7 ある不具合とその再発防止策について
先日リリースしたiOS版REALITY v5.4.0で、iOS 14.3未満のデバイスでアプリが起動できなくなる不具合が発生しました。今週のNow in REALITY Techでは、この不具合の詳細と再発防止策についてお送りします。
何が起こったのか
【不具合】
— REALITY (@REALITY_app) August 11, 2021
アプリバージョン5.4.0において、iOSバージョン14.3未満のお客さまが、起動時に画面が進行せずログインできない不具合が発生しております。
詳細👇https://t.co/yY1178SndR
該当するお客さまはアプリバージョン5.4.0にアップデートせず、復旧のお知らせをお待ちください。#REALITY
ลาก่อนฮะ ผมจะไม่ลืมทุกคนเลย...
— 志乃だよ〜ん (@shinyo_dayo) August 11, 2021
朝起きたらアプリがクラッシュして、全然アクセスできません。端末リスタートしても、アプリ消して再タウロードしても、治りません…どうすればいいですか?@REALITY_app #REALITY クラッシュ pic.twitter.com/yyVRmHsuk5
iOS 14.3未満のデバイスでアプリを起動しようとすると、即座にクラッシュしてしまい起動できない状態になっていました。
この不具合の原因は、アプリバージョン5.4.0で追加したFrameworkのビルド設定にありました。
具体的には、iOS 14.3以降のバージョンでのみ使用可能なFrameworkを追加する際に、Build PhaseのLink Binary With LibrariesセクションでOptionalに設定すべきところをRequiredにしてしまった結果、このFrameworkに対応していないiOSバージョンのデバイスで起動した場合でも、無理矢理読み込もうとして失敗しクラッシュしてしまう、といったものです。
dyld: launch, loading dependent libraries
...
dyld: Library not loaded: /System/Library/Frameworks/AdServices.framework/AdServices
...
Reason: image not found
(lldb)
どうやって修正したのか
こちらの記事にあるように、REALITYのXcode ProjectはXcodeGenで管理しているので、その設定ファイル内のDependencyのweakパラメタの値を設定することで対応します。
dependencies:
...
- sdk: AdServices.framework
weak: true // OptionalにLinkする
結果、生成されるXcode ProjectのBuild PhaseのLink Binary With Librariesセクションの設定もOptionalになりました。
その後、この更新をバージョン5.4.1としてリリースし、不具合の修正はひとまず完了しました。
【不具合修正】
— REALITY (@REALITY_app) August 12, 2021
iOSバージョン14.3未満において、ログインできない不具合が発生しておりました。
こちらは、アプリバージョン5.4.1で修正されております。
このたびはご迷惑をおかけいたしましたことを深くお詫び申し上げます#REALITY
どうやって再発を防ぐのか
ただし、不具合は修正されたものの、再発防止策も早急に必要になります。この不具合の原因は(恥ずかしながら)イージーミスであるものの、新規Framework追加のたびに再発のリスクがあり、そして何より不具合が発生してしまった時にユーザ様に及ぼす影響が大きいためです。
そこで、再発防止策として、「複数のiOSバージョンで定期的にアプリの自動テストを実行し、今回の不具合と同様の起動時のクラッシュを検出する」フローを自動化することにしました。
まず、fastlane scanによる自動テストを複数のシミュレータで実行する設定を追加します。
platform :ios do
lane :multiple_version_test do
run_tests(workspace: "REALITY.xcworkspace",
scheme: "REALITY-Debug",
configuration: "Debug",
devices: ["iPhone 12 (14.5)",
"iPhone 11 (13.7)",
そして、bitrise側でScheduled Buildの設定を行います。
bitrise上の他のワークフローが滞らないように、毎日早朝に実行する設定にしました。
最後に、同様の不具合が検出されることを確認して対応完了です。
Testing failed:
REALITYTests:
REALITY (14773) encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted. (Underlying Error: Crash: REALITY (14773) <external symbol>: Library not loaded: /System/Library/Frameworks/AdServices.framework/AdServices
Referenced from: /Users/USER/Library/Developer/CoreSimulator/Devices/FA3C8013-5F2A-43AA-94EB-0393D16CDAF4/data/Containers/Bundle/Application/F945A2F1-7C58-4E0A-BD6E-DBB0646A77D6/REALITY.app/REALITY
Reason: image not found. dyld: launch, loading dependent libraries
最後に
以上、先日発生した不具合と、それに対するREALITYのiOS開発チームの対応についてお送りしました。
ただし、もっと迅速に対応できたのではないか、そもそも不具合を起こさないようにできなかったのか、というようにまだまだ改善の余地は大きいので、一緒に戦ってくれるエンジニアを募集しています。
カジュアル面談も受け付けているので、お気軽にお申し込みください!