ios - 带有 NSURLSession 的 Http/2 server_push

标签 ios objective-c nsurlsession http2

我用iOS9的NSURLSession实现了一个http2通信的程序,它可以在http2中与我的服务器通信。 但是,我在接收 server_push 时遇到问题. 我在他们的设置中发现 ENABLE_PUSH 值为 0,并且在 NSURLSession 中接收服务器推送中没有委托(delegate)......

・我认为 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];
}

最佳答案

我读了这个here :

The HTTP2 push mechanism is not a generic server push mechanism like websocket or server sent events.

It is designed for a specific optimisation of HTTP conversations. Specifically when a client asks for a resource (eg index.html) the server can guess that it is going to next ask for a bunch of associated resources (eg theme.css, jquery.js, logo.png, etc. etc.) Typically a webpage can have 10s of such associated requests.

With HTTP/1.1, the server had to wait until the client actually sends request for these associated resources, and then the client is limited by connections to only ask for approx 6 at a time. Thus it can take many round trips before all the associated resources that are needed by a webpage are actually sent.

With HTTP/2, the server can send in the response to the index.html GET push promises to tell the client that it is going to also send theme.css, jquery.js, logo.png, etc. as if the client had requested them. The client can then cancel those pushes or just wait for them to be sent without incurring the extra latency of multiple round trips.

ere is a blog about the push API for HTTP2 and SPDY in jetty: https://webtide.com/http2-push-with-experimental-servlet-api/

关于ios - 带有 NSURLSession 的 Http/2 server_push,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385094/

相关文章:

iOS map View - 缩放以固定然后激活标注

ios - Swift 函数在完成处理之前返回值

ios - 收到内存警告的未知原因

ios - 是否可以在离线模式下使用 NMANavigationManager?

ios - Twilio 客户端语音通话扬声器开/关问题

ios - 解释iOS中Energy Usage Instrument的统计

ios - 向应用程序发送静默推送通知,更新位置并在后台发送到服务器

ios - CNContact 标识符中的 ":ABPerson"字符串是什么?

ios - 使用 NSURLSessionDownloadTask 逐一下载文件

ios - 从 IOS 上传图像文件到 Web 服务器