带有 NSURLSession 的 Http/2 server_push

Posted

技术标签:

【中文标题】带有 NSURLSession 的 Http/2 server_push【英文标题】:Http/2 server_push with NSURLSession 【发布时间】:2016-09-19 23:39:47 【问题描述】:

我已经实现了一个使用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,感谢您的建议:-) 我发布了! 【参考方案1】:

我读到了这个here:

HTTP2 推送机制不是一个通用的服务器推送机制,例如 websocket 或服务器发送的事件。

它专为 HTTP 会话的特定优化而设计。 特别是当客户端请求资源(例如 index.html)时 服务器可以猜测它接下来会要求一堆 相关资源(例如 theme.css、jquery.js、logo.png 等) 通常一个网页可以有 10 个这样的关联请求。

使用 HTTP/1.1,服务器必须等到客户端真正发送 请求这些关联资源,然后客户端受限 通过连接一次只要求大约 6 个。因此可以采取 在所需的所有相关资源之前进行多次往返 由网页实际发送。

使用 HTTP/2,服务器可以在响应中发送 index.html GET push 承诺告诉客户它也将发送 theme.css、jquery.js、logo.png 等,好像是客户端请求的 他们。然后客户端可以取消这些推送或只是等待它们 发送时不会产生多次往返的额外延迟。

这是一篇关于 jetty 中 HTTP2 和 SPDY 的推送 API 的博客: https://webtide.com/http2-push-with-experimental-servlet-api/

【讨论】:

感谢您的信息!你能告诉我你是否知道 NSURLSession 支持这个吗? 是的.....并且 HTTP/2 支持是 iOS 9 的一部分,因此在早期的操作系统版本中不可用。 嗯...我可以看到只有iOS9(或更高版本)支持Http/2...但不知道iOS9的cocoa API是否有SURVER_PUSH的功能...> 【参考方案2】:

解决了

我收到了支持人员的以下回复。

iOS 目前不支持此功能。


更新

(@vin25 评论)

ios10 支持。

【讨论】:

这有什么更新吗? iOS 10 是否添加了对此的支持? 最近发现 iOS 10 确实支持它。请参阅 NSURLSession-developer.apple.com/videos/play/wwdc2016/711 上的 WWDC 2016 视频。我已经对其进行了测试,并且效果很好!

以上是关于带有 NSURLSession 的 Http/2 server_push的主要内容,如果未能解决你的问题,请参考以下文章

带有令牌认证的 NSURLSession

iOS10 NSURLSession HTTP/2 无效

带有 NSURLSession 的 Swift 中的 HTTP 请求

使用带有参数的 NSURLSession (HTTP POST) 下载 PDF

带有 URL 的 NSURLSession downloadTask 返回 nil

管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零