InkdropというMarkdownアプリのモバイル版をReact Nativeアプリで開発している。 今日Xcodeを11.3にアップデートした。それに伴い、シミュレータのiOSのバージョンが13.3になった。 するとアプリから開発用サーバにHTTPリクエストを飛ばせなくなり、代わりにSSLのハンドシェイクエラーが起こるようになった。
React Nativeのソースコードを追うも、リクエストは正しく http で飛ばしている。
しかし、NSURLSession
周りの処理で件のエラーとなり、エラーメッセージに示されたリクエストURLはなぜかhttpsに書き換えられているのだ。
はいはいApp Transport Security(ATS)ねと思いきや、設定は間違っていない様子。
調べてみるとどうやらHTTP Strict Transport Security (HSTS)臭い。
Xcodeのアップデート起因なので、そこが悪いと睨んでリリースノートを読んだらまさに合致する項目があった。以下引用:
Certain top-level domains (TLDs) such as
.dev
and.app
are now in the FoundationURLSession
andNSURLConnection
HTTP Strict Transport Security (HSTS) preload list. An app which usesURLSession
to visit a matching URL will always navigate to the URL ashttps://
, and never as cleartexthttp://
. See theHTTP Strict Transport Security (HSTS) Specificationfor more information about HSTS. (56247242)-- iOS & iPadOS 13.3 Release Notes | Apple Developer Documentation
つまり、TLDの .dev
と .app
が今回のリリースでHSTSのプリロードリストに追加されたというのだ。
.app
は既にGoogle ChromeからもHTTPSしかリクエストを受け付けなくなっている。
それと同じ規約がiOS上でも適用される事になったのだ。
自分のサービスのドメイン名は inkdrop.app
だったので、影響を受けたという訳だ。
どうしてもHTTPリクエストを飛ばしたい場合は localhost
か、.test
TLDを使うのが確実だろう。
/etc/hosts
を編集して、例えば hoge.test
を自分の開発用サーバに向ければOK。
お陰様でReact NativeのiOS側のネットワーク周りの実装に詳しくなれたよ。
以上。