iOS 13.3 (Xcode 11.3) から .devと.appがHSTS preload listに追加された件

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
.devand.appare now in the FoundationURLSessionandNSURLConnectionHTTP Strict Transport Security (HSTS) preload list. An app which usesURLSessionto 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側のネットワーク周りの実装に詳しくなれたよ。
以上。
