yashiganiの英傑になるまで死ねない日記

週末はマスターバイクでハイラルを走り回ります

CFNetworkのラッパーを書いた

シンプルなCFNetworkラッパーを公開します

色々事情があって,CFNetworkのラッパーを書いて棄てたので公開します.

CFNetworkとは

Cocoa/Cocoa touchではNSURLConnectionっていうクラスがあって,基本的にはそれを使ってHTTPなどの通信をします. Foundationクラスはより低レイヤのCore Foundationのラッパーなので,NSURLConnectionも実体はCFNetworkになってます.つまり,CFNetworkを使えばオリジナルなNSURLConnectionを作れるということです.


当初はいい感じにまとめて,ARC対応のポストASIHTTPRequestのポジションを狙おうと思ってたんだけど,ちょっとヘビーすぎて諦めました.ASIHTTPRequestはマジでお化けプロダクトです.すごすぎる.

どういうときに使うべきかって言っておくと,CFNetworkを使えばNSURLCacheとかNSURLProtocolの動作を回避できます.その辺でゴニョゴニョやってるけどそれを回避したいなんてときに使えます.まあそっち側の仕組みでも回避できるんですが... ちなみに,NSURLCacheとかNSURLProtocolNSURLConnectionを使った通信全てに適用されます.WebKitなどの通信もNSURLConnectionを使いますので,UIWebViewAFNetworkingを使った通信もフックすることができます.

途中で力つきたのもあって,わりと適当です.そんなにしっかり動作検証してません(リダイレクトとか).CFNetworkを使ったプログラミングのサンプル程度にどうぞ.ビーコンくらいには使えると思いますが,できることとできないことを書いておきます.できないことにはこうすればいいよ的なヒントも書いておくので,ヒマな人はアップデートしてください.

できること

  • 簡単なHTTP通信
    • Response Headerの取得
    • HTTP status codeの取得
    • Response Bodyの取得
    • User Agentの設定
  • Objective-Cから簡単に使える
    • NSURLRequestを使って初期化(リクエストのヘッダになんか入れれば引き継がれます)
    • Blocksで終了/失敗時の動作を指定
  • 同期/非同期通信

できないこと

  • Basic等の認証の突破
    • 401/407の段階でCFAuthenticationRef作ってゴニョゴニョしたあとリクエストを作り直せばいけると思います
  • POST等GET以外のリクエスト
    • これはわりと簡単に対応できると思う

関連