2013年1月11日金曜日

webView:shouldStartLoadWithRequest:navigationType:でloadRequestするとPOSTがGETになる

UIWebViewで全リクエストのリクエストヘッダを追加変更したい場合は以下の方法が利用できる。
Custom HTTP headers for every request made in UIWebViews - Nomad Planet

ヘッダを追加変更して独自にloadRequestをし、NOを返す(呼び出し元のloadRequestキャンセル)ことでヘッダの追加を実現している。

ただし独自loadRequest時も再度webView:shouldStartLoadWithRequest:navigationType:が呼ばれる為、無限ループを避けるような処理が加えられている(ヘッダあるなしでの分岐)

問題は上記方法ではPOSTリクエストにならない


おそらくUIWebView内部の問題だが、webView:shouldStartLoadWithRequest:navigationTypeでリクエストオブジェクトを変更して再度loadRequestすると何故かPOSTがGETになってしまう。(再loadRequest直前はPOSTのままなのに。。)
元のPOSTリクエストオブジェクトを設定してloadRequestを呼び出しても同様だった。


解決策

以下の方法を使う。
UIWebViewでUser-Agentを変更する - 武之新

隠しDelegateであるUIWebViewWebViewDelegateのメソッドuiWebView:resource:willSendRequest:redirectResponse:fromDataSource:を実装することでリクエストヘッダというかリクエストオブジェクト自体の変更が可能。
実装対象のクラスがUIWebViewDelegateプロトコルを継承していればあとは上記uiWebView~メソッドを実装するだけのお手軽さ。


というか、リクエスト前にその内容をいじれないなんてどうなってんの?甚だ疑問
そして上述のブログでも述べられているがこれでappleの審査通るかは不明。ググってみたけどそれらしき記述は発見できず。

追記)審査通った2013前半頃