🧜♂️
Safari機能拡張が停止してしまう
はじめに
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