developer's diary

最近はc#のエントリが多いです

xamarin.iOSでHTTP Clientする場合はNSURLConnectionを利用するべき。

今日もプログラムは書いてません。

昨日のエントリのmonotouch-samplesのHttpClientを見てみる。にあるサンプルで分かったことがある。

xamarin.iOSでHTTP Clientする場合はNSURLConnectionを使いましょう。

理由:WebRequestだとプロキシ経由のアクセスができない。

public partial class AppDelegate : UIApplicationDelegate{
    //~~省略~~
    void Button1TouchDown (object sender, EventArgs e){
        //~~省略~~
        new Cocoa (this).HttpSample ();
        //~~省略~~
    }
    //~~省略~~
}
public class Cocoa : NSUrlConnectionDelegate{
    AppDelegate ad;
    byte [] result;

    public Cocoa (AppDelegate ad){
        this.ad = ad;
        result = new byte [0];
    }
    public void HttpSample (){
        //NSUrlRequestの第2引数にキャッシュの設定してる。
        var req = new NSUrlRequest (new NSUrl (Application.WisdomUrl), NSUrlRequestCachePolicy.ReloadIgnoringCacheData, 10);

        //HTTPを叩く処理第2引数のデリゲートに自分自身を渡す(Cocoa : NSUrlConnectionDelegate)
        NSUrlConnection.FromRequest (req, this);
    }
    // HTTPを叩いた時のデータを受け取る関数(Objective-CのdidReceiveDataラップで複数回呼ばれるそう。)
    public override void ReceivedData (NSUrlConnection connection, NSData data){
        byte [] nb = new byte [result.Length + data.Length];
        result.CopyTo (nb, 0);
        Marshal.Copy (data.Bytes, nb, result.Length, (int) data.Length);
        result = nb;
    }
}

ReceivedDataはどうも、適当な頻度で必要な回数呼ばれるみたい。 最初にReceivedResponseが呼ばれて、ReceivedDataが何度か呼ばれるみたいです。 近いうちにConsole Output(NSLog)して確認しなくっちゃweb利用したアプリ作れないですね。

WebRequestでプロキシ経由のアクセスできれば超簡単なはずなんだけどもね。

参考: * http://stackoverflow.com/questions/11860218/monotouch-objective-c-iphone-5-x-how-to-cache-web-pages-using-nsurlcache * http://d.hatena.ne.jp/Kmusiclife/20110717/1310908394 * http://docs.go-mono.com/?link=T%3aMonoMac.Foundation.NSUrlConnectionDelegate%2fM * http://d.hatena.ne.jp/It_lives_vainly/20090312/1236855251