2015-01-13 106 views
4

我使用下面的代码来设置自UIWebView发送的请求上的自定义HTTP标头。问题是我看到页面加载一秒钟,然后它变成白色/黑屏。我测试过不同的网址,但行为是一样的。有任何想法吗?在所有UIWebView请求中添加自定义http标头字段

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     var headerIsPresent = false 
     let headerFields = request.allHTTPHeaderFields 
     for headerField in headerFields?.keys.array as [String] { 
      if headerField == "X-Test-App" { 
       headerIsPresent = true 
      } 
     } 

     if headerIsPresent { 
      return true 
     } else { 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
       dispatch_async(dispatch_get_main_queue(), { 
       let url = request.URL 
       var newRequest: NSMutableURLRequest = request as NSMutableURLRequest 

       // set new header 
       newRequest.addValue("MyValue", forHTTPHeaderField: "X-Test-App") 

       // reload the request 
       self.webView.loadRequest(newRequest) 
       }) 
      }) 
      return false 
     } 
    } 
+0

嗯,我没有做太多与快捷,但是这看起来递归......也许把调试中断在那里? –

+1

它是递归的,但不应该是一个问题,因为他们在添加头之前检查头的存在(并递归) –

+0

我相信'shouldStartLoadWithRequest'只会在页加载时调用,而不是在资源加载时调用,您可能会验证这不是问题。 –

回答

6

基于大卫的意见,我用以下解决方案:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     let headerFields = request.allHTTPHeaderFields 
     var headerIsPresent = contains(request.allHTTPHeaderFields?.keys.array as [String], "X-Test-App") 

     if headerIsPresent || navigationType == UIWebViewNavigationType.Other { 
      return true 
     } else { 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
       dispatch_async(dispatch_get_main_queue(), { 
        let url = request.URL 
        var newRequest: NSMutableURLRequest = request as NSMutableURLRequest 
        // set new header 
        newRequest.addValue("MyValue", forHTTPHeaderField: "X-Test-App") 

        // reload the request 
        self.webView.loadRequest(newRequest) 
       }) 
      }) 
      return false 
     } 
    } 
+0

只是好奇,因为我处于相同的位置,并希望将自定义标头添加到多个网页浏览(但不必在每个视图控制器中放置相同的代码),您在哪里添加了此功能?在特定的视图控制器中,或者您是否以某种方式覆盖较低级别的webView? – kevindeleon

+1

我把它放在一个叫做WebViewController的单一视图控制器中,我在应用程序中重新使用了几个不同的屏幕。 – codeman

+0

Ah..gotcha,谢谢! – kevindeleon

1

我认为这是一个错误的语法与线var headerIsPresent...可能是由于更新的字符串中的字符API斯威夫特?

我用map代替array,然后在结果上调用。

let headerIsPresent = request.allHTTPHeaderFields?.keys.map({$0}).contains("YOUR_HEADER_NAME")    
1

如果您在迅速寻找代码:

_ = request.allHTTPHeaderFields 
    let headerIsPresent = request.allHTTPHeaderFields?.keys.contains("doerlist") 

    if headerIsPresent! || navigationType == UIWebViewNavigationType.other { 
     return true 
    } else { 

     DispatchQueue.global(qos: .background).async { 
      DispatchQueue.main.async { 
       let newRequest: NSMutableURLRequest = request as! NSMutableURLRequest 
       newRequest.addValue("doerlist-a61444ea-6fef-4366-a39e-e029e6d521ef", forHTTPHeaderField: "doerlist") 
       self.webView.loadRequest(newRequest as URLRequest) 
      } 
     } 

     return false 
    } 
相关问题