システム内容(ざっくり)
とあるiOSアプリを作っているのだが、新たに実装の必要のある機能で必須として使う必要のあるライブラリがHTML・JavaScriptが前提なものになっていて、しかしiOSアプリなのでWKWebViewを用いて裏側でHTML・JavaScriptを実行するような処理を作った。
そのライブラリのメソッドを呼ぶことでAPIを呼ぶような処理になっているが、エラーとなった。それは、リファラーが空であることが原因だった。
原因
iosアプリとしてではなくブラウザ向けのシステムとしてchromeなどの通常のブラウザで実行したら、当然デフォルトでリファラーは入っているが、iOSアプリの内部ブラウザからアクセスした場合はリファラーが入っていないようだった。
WKWebViewを使っている場合、HTMLがローカルにあるとリファラーが空になる。これは、リファラーは通常リクエスト元のURLを示すため、ローカルファイルの場合はリファラーが設定されない
解決策
baseURLを指定するだけでよかった。
anime-suko.swift
var webView: WKWebView!
self.webView.loadHTMLString(htmlString, baseURL: URL(string: Configuration.shared.apiUrl))
baseURLを指定すると、WKWebViewはそのURLを基準としてHTMLコンテンツを読み込みます。Refererヘッダーは、リクエストがどのページから来たのかを示すもので、サーバー側でリクエストの出所を確認するために使われます。これを指定したらなんとかサーバー側でリファラーが入るようにできた。