🧜‍♂️

Safari機能拡張が停止してしまう

2024/05/04に公開

はじめに

Safari extensionsを利用した、アプリ開発の機会があり、App <-> Safari(Javascript)間で躓きがあったので書き残しておきます。
実装に関しての記述は、ほぼ無いです。

躓いたこと

Safariを利用し続けると突如、Safari機能拡張が停止してしまう事象が発生した。

発生当初、チーム内で下記のように色々な仮説が出ました。

  • memory leakが発生している?
  • AppとSafari(Javascript)間のデータ授受が多いせい?
  • 例外処理が適切に行われていないことにより、意図せず停止している?
  • iOSのエラーが出力されていない?
  • iOS versionの問題?

やったこと

  • App / Safari(Javascript)のリソース可視化を行った ← 当然って言われれば、その通りですが、できていなかった...
  • エラーハンドリングを実装する ← こちらも当然って言われれば、その通り
    • iOSエラーの確認をする
  • Safari(Javascript)とbackend(サーバーサイド)の処理を無効化して動作検証
  • AppとSafari(Javascript)間のデータを無効化して動作検証

Safari(Javascript)からAppの呼出しの実装

Apple公式のドキュメントはこちらを参照して下さい。

Safari(Javascript)からAppを呼出す実装は下記のような実装になります。
App(Swift)は割愛します。

const responseData = await browser.runtime.sendNativeMessage("application.id", {
  action: "getUserInfo" // ネイティブアプリ側へ渡すパラメータ
});
return responseData.response.userId;

原因について

やったことに対して、結果を書いていきます。

App / Safari(Javascript)のリソース可視化を行った

✖:resourceに関する問題は発見されなかった。

エラーハンドリングを実装する

✖:例外が発生して処理が停止していることもなかった。

Safari(Javascript)とbackend(サーバーサイド)の処理を無効化して動作検証

✖:改善することなくSafari機能拡張が停止する事象が継続した。

AppとSafari(Javascript)間のデータを無効化して動作検証

〇:問題が解決した。Safari機能拡張が停止することなく、利用できるようになった。
  AppとSafari(Javascript)間のデータ授受が高頻度だとSafari機能拡張が停止することが分かった。

iOSにエラーメッセージの出力があったが原因まで言及されておらず、原因特定に予想以上に時間を費やした。

解決策

Safari(Javascript)でcacheすることにより、AppとSafari(Javascript)間のデータ授受の回数を減らして解決するアプローチを採用した。

感想

システム開発していると、原因特定に時間を有することが多々ありますが、
今回はローンチ前の発覚だったので、時間的なプレッシャーが無い状態で調査・対応を行えたのが
救いでした。

Discussion