📑

Objective-C(iOS)でspdy[CocoaSPDY]

2022/04/18に公開

サイトはTwitterでテスト。
NSURLSessionを使用。
NSURLConnectionやSLRequestでもpreparedURLRequest
を使うことで実装可能なようだ。

手順
①ライブラリの準備
https://github.com/twitter/CocoaSPDY からダウンロード。
必要な物は、Products下のSPDY.frameworkだけ。
プロジェクトを開いて、Show in Finderでコピー。
プロジェクトに追加すると、Link Binary With Librariesにも自動で追加される。
さらに、CFNetwork.frameworkとlibz.dylibを追加

Build settingsのOther Linker Flagsに
$(OTHER_LDFLAGS) -ObjCを追加。しておかないと実行時に
unrecognized selector sent to instanceエラーになる。
参考:https://developer.apple.com/library/mac/qa/qa1490/_index.html

②import,Delegate
#import <SPDY/SPDYProtocol.h>

NSURLSessionDelegate,
NSURLSessionDownloadDelegate,
NSURLSessionDataDelegate

  • (void)URLSession:(NSURLSession *)session ***

③実行コードサンプル

-(void) sendHTTPGet
{
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    defaultConfigObject.protocolClasses = @[[SPDYURLSessionProtocol class]];
    NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

    NSURL * url = [NSURL URLWithString:@"https://twitter.com/"];
    NSURLSessionDataTask * dataTask = [delegateFreeSession dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if(error == nil){
            NSLog(@"%@",response);
        }
    }];
    [dataTask resume];
}

defaultConfigObject.protocolClasses = @[[SPDYURLSessionProtocol class]];
をすることで、サイトがspdyに対応していればレスポンスが返ってくる。
Twitterの場合、spdyでの通信時のみHTTPヘッダに
"x-spdy-parallelism" = 1;
"x-spdy-stream-id" = 1;
"x-spdy-version" = "3.1";
といったパラメータが追加されている。

spdyについては、以下サイトなどが分かりやすい。
http://blog.livedoor.jp/kotesaki/
http://qiita.com/kaiinui/items/e37870d96210e9881486

追記
”SPDY”自体のサポートは終了しHTTP/2へと移行されていくようです。
・「Google Chrome」の“SPDY”サポートが終了、“HTTP/2”へ
 http://www.forest.impress.co.jp/docs/news/20150210_687689.html
・Hello HTTP/2, Goodbye SPDY
 http://blog.chromium.org/2015/02/hello-http2-goodbye-spdy-http-is_9.html

Discussion