見出し画像

Now in REALITY Tech #7 ある不具合とその再発防止策について

先日リリースしたiOS版REALITY v5.4.0で、iOS 14.3未満のデバイスでアプリが起動できなくなる不具合が発生しました。今週のNow in REALITY Techでは、この不具合の詳細と再発防止策についてお送りします。

何が起こったのか

iOS 14.3未満のデバイスでアプリを起動しようとすると、即座にクラッシュしてしまい起動できない状態になっていました。
この不具合の原因は、アプリバージョン5.4.0で追加したFrameworkのビルド設定にありました。

具体的には、iOS 14.3以降のバージョンでのみ使用可能なFrameworkを追加する際に、Build PhaseのLink Binary With LibrariesセクションでOptionalに設定すべきところをRequiredにしてしまった結果、このFrameworkに対応していないiOSバージョンのデバイスで起動した場合でも、無理矢理読み込もうとして失敗しクラッシュしてしまう、といったものです。

スクリーンショット 2021-08-19 15.08.35

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になりました。 

スクリーンショット 2021-08-19 15.33.25

その後、この更新をバージョン5.4.1としてリリースし、不具合の修正はひとまず完了しました。

どうやって再発を防ぐのか

ただし、不具合は修正されたものの、再発防止策も早急に必要になります。この不具合の原因は(恥ずかしながら)イージーミスであるものの、新規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の設定を行います。

スクリーンショット 2021-08-19 16.35.04

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開発チームの対応についてお送りしました。

ただし、もっと迅速に対応できたのではないか、そもそも不具合を起こさないようにできなかったのか、というようにまだまだ改善の余地は大きいので、一緒に戦ってくれるエンジニアを募集しています。

カジュアル面談も受け付けているので、お気軽にお申し込みください!