🤖

特定のリクエストの時に、HTTPヘッダーを付与する

2021/12/29に公開

きっかけ

自分のサイトへのHTTPリクエスト時にHTTPヘッダーに追加情報を載せたかった。

  • アプリのバージョンを付与する
  • 機種名を付与する
  • HTTPS使用時に、認証用トークンを付与して、APIとWebでログインできるようにする

など。

実装したもの

https://github.com/taka0125/CustomHttpHeadersURLProtocol

試行錯誤

HTTPリクエストを投げる時によく使うAlamofireとかAFNetworkingとかは比較的簡単にヘッダを付与できる。

ただ、UIWebViewでWebページを表示しているケースでの付与が大変だった。

  • UIWebViewを継承したクラスのloadRequestでごにょごにょ
  • shouldStartLoadWithRequestでごにょごにょ
  • 隠しdelegate使ってごにょごにょ

とか見つけたんだけど全体的に微妙…。

そんな中で見つけたのが

NSURLProtocolを使う

だった。

今回、自分のサイトに設置してあるAPI/Webへのリクエストの時のみ色々付与したかったのでもの凄くマッチした。

応用も効きそうなのでPod化しておいた。

ざっくりな流れ

  • canInitWithRequestで自分の作ったProtocolを適用するか決める
  • startLoadingでリクエストの開始
  • stopLoadingでリクエストの終了
  • 適当なタイミングで、NSURLProtocolClientのメソッドを呼ぶ

詳しいコードは、

https://github.com/taka0125/CustomHttpHeadersURLProtocol/blob/master/Pod/Classes/CustomHttpHeadersURLProtocol.swift

で。

まとめ

NSURLProtocolで通信をフックしてごにょごにょしよう!

Discussion