使用NSURLSession实现Http/2服务器推送

3
我已经实现了一个程序,使用iOS9的NSURLSession来进行http2通信,并且可以与我的服务器进行http2通信。 然而,我在接收server_push时遇到了问题。 我发现他们的设置中ENABLE_PUSH值为0,在NSURLSession中没有收到服务器推送的委托... ・我认为NSURLSession不支持server_push。这是正确的吗? ・如果它支持server_push,该如何使用?
/**
It WORKS for post data and get response.
I don't know the code should be added here 
in order to get the server_push.
I suspect that NSURLSession itself cannot receive the server_push(;_;)
**/
- (void) postData
{
     NSString *urlstr = self.urlArea.text;
     NSURL * url = [NSURL URLWithString:urlstr];
     NSDictionary *params = @{@"data":@""};
    //json to query
    NSData *query = [self buildQueryWithDictionary: params];

    //make request
    NSMutableURLRequest *request = [NSMutableURLRequest
                                requestWithURL:url
                                cachePolicy: NSURLRequestReloadIgnoringCacheData
                                timeoutInterval: 10.0];
    [request setHTTPMethod: @"POST"];
    [request setHTTPBody: query];

    //prepare session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    //resume
     [[session dataTaskWithRequest: request  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (response && ! error) {
             NSLog(@"Data: %@", [[NSString alloc] initWithData: data  encoding: NSUTF8StringEncoding]);
        }else {
            NSLog(@"ERR: %@", error);
        }
    }] resume];
}

嗨 T_ms,欢迎来到 SO。您应该发布您的代码,并详细说明您遇到了什么接收问题。 - J. Chomel
嗨 J.Chomel,谢谢你的建议:-) 我已经发布了! - t_ms
2个回答

0

我在这里阅读了此处

HTTP2推送机制不像websocket或服务器发送事件那样是通用的服务器推送机制。它是为特定的HTTP会话优化而设计的。具体来说,当客户端请求资源(例如index.html)时,服务器可以猜测它接下来会请求一堆相关资源(例如theme.css、jquery.js、logo.png等)。通常一个网页可以有数十个这样的关联请求。
在HTTP/1.1中,服务器必须等待客户端实际发送对这些相关资源的请求,然后客户端由于连接限制只能同时请求大约6个。因此,在所有网页所需的相关资源实际发送之前,可能需要多次往返。
在HTTP/2中,服务器可以在响应index.html GET的情况下发送推送承诺,告诉客户端它也将发送theme.css、jquery.js、logo.png等,就好像客户端已经请求了它们一样。客户端可以取消这些推送,或者等待它们被发送而不产生额外的多次往返延迟。
这里有一篇关于jetty中HTTP2和SPDY推送API的博客:https://webtide.com/http2-push-with-experimental-servlet-api/

谢谢您提供的信息!请问您知道NSURLSession是否支持此功能吗? - t_ms
是的......HTTP/2支持是iOS 9的一部分,因此不会在早期的操作系统版本上提供。 - Suraj Sukale
嗯...我可以看到只有iOS9(或更高版本)支持Http/2...但我不知道iOS9的cocoa API是否具有SERVER_PUSH函数...>< - t_ms

0

已解决

我收到了来自支持团队的以下回复。

iOS目前不支持此功能。


更新

(@vin25的评论)

ios10支持它。


这个有更新了吗?iOS 10已经支持了吗? - vin25
1
最近发现iOS 10支持它。请参考WWDC 2016关于NSURLSession的视频- https://developer.apple.com/videos/play/wwdc2016/711/。我已经测试过了,效果非常好! - vin25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接