iOSのWKWebViewでは以下のようにURLRequestでPOSTリクエストを送った場合にBodyが無くなるという問題(仕様?)がありました。
Appleのフォーラムなどでも指摘されています。
実装例
func roguinjikkou() {
var request = URLRequest(url: kWebStoreLoginUrl)
request.httpMethod = "POST"
let postString = "userId=kintaro%40example.co.jp&password=momotaro"
request.httpBody = postString.data(using: .utf8)
self.webView.load(request)
}
今回、いろいろ必要にかられて検証しているなかで、iOS11ではボディが無くならずに正常にPOSTリクエストが送れることを発見しました。
以下、OS毎のリクエストの通信ログの例です。(iOSシミュレータでの実行結果です。)
iOS 11
POST /Login HTTP/1.1
Host: test.example.co.jp
Origin: null
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_1 like Mac OS X) AppleWebKit/604.2.10 (KHTML, like Gecko) Mobile/15A8401
Content-Length: 160
Accept-Language: en-us
Accept-Encoding: br, gzip, deflate
userId=kintaro%40example.co.jp&password=momotaro
iOS 10
POST /Login HTTP/1.1
Host: test.example.co.jp
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: null
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Length: 0
iOS 9
POST /Login HTTP/1.1
Host: test.example.co.jp
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: null
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Length: 0
iOS10, iOS9はPOSTのボディがなくなっているのがわかります。
ちなみに、UIWebViewではどのバージョンのOSでもボディは無くなりませんでした。
簡単にまとめると以下のようになります。
WKWebView | UIWebView | |
---|---|---|
iOS9系 | 消える | 消えない |
iOS10系 | 消える | 消えない |
iOS11系 | 消えない | 消えない |
iOS11ではCookieまわりのクラスも充実してきているため、iOS11以降の端末のみをサポートできるようになれば、WebViewまわりの制御は実装しやすくなりそうです。