Cordova iOS axios で Network Error となる場合の回避策
はじめに
Cordova iOS アプリで axios を使っての API Request が Network Error となる場合の回避策。
TL;DR
- 間隔を空けて最大n回までリトライ、で回避可能
- Ionic でも似たような Issue あり(2019/07 と少し古い)
- 本対応は silkimen/cordova-plugin-advanced-http を使う(のはず。未検証)
目次
環境・条件
1 | $ sw_vers |
iPhone 11 Pro (iOS 13.6)
詳細
発生事象
Cordova iOS アプリで axios を使っての API Request が Network Error となる。
挙動としてモヤモヤするが具体的には以下で、エラーになったり成功したりする、という感じ
- Network Error になった場合、そもそもサーバに Request が届いてない
- Preflight Request でエラー、とかそういうことでもない
- Network Error 発生直後に、間髪入れずに同じ API Request を送信すると成功したりする
Android アプリ、PC 上のブラウザ(Chrome) から同じ API Request を送った場合は問題は起きず、iOS でのみ Network Error になる。
回避策
正直あまりよろしくない対応だと思うが、「Network Error になったら、間隔を空けて最大 n回までリトライ」で回避できた。
※以下のサンプルコードは必要最小限なので、例外処理や間隔、リトライ回数などは各自で要調整。
1 | import axios from 'axios' |
本対応(と思われるもの)
少し古いが Ionic でも似たような Issue が上がっており、Issue comment によると silkimen/cordova-plugin-advanced-http を使うと解決するっぽい。
ただし、自分は試してないので本当に解決するのか不明。
まとめ
- 間隔を空けて最大n回までリトライ、で回避可能
- Ionic でも似たような Issue あり(2019/07 と少し古い)
- 本対応は silkimen/cordova-plugin-advanced-http を使う(のはず。未検証)
その他・メモ
vue.js - Axios GET not working in Safari browser - Stack Overflow
「iOS Safari だとキャッシュの影響で失敗するので、タイムスタンプ的なクエリパラメータを追加すると良いよ」みたいな内容。試してみたけど効果なし。
参考文献
- ES2017 async/await で sleep 処理を書く - Qiita
- silkimen/cordova-plugin-advanced-http: Cordova / Phonegap plugin for communicating with HTTP servers. Allows for SSL pinning!
- bug: IOS Network Error axios request · Issue #18738 · ionic-team/ionic-framework
関連記事
- Cordova でアプリ名やアプリのバージョン情報などを取得
- Cordova iOS アプリで長押し(ロングタップ, ロングプレス)によるコンテキストメニューを無効化
- Cordova で端末やエミュレータを指定してデプロイする
- Cordova で Repro とカスタム URL スキームを使ってディープリンクを扱う
- Cordova で Splash Screen を設定する cordova-plugin-splashscreen
- Cordova iOS アプリで UIWebView から WKWebView への移行方法
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア