2017-03-08 42 views
1

我需要將各種各樣的網站URL(來自web服務)加載到WKWebview中。WKWebview將不會正確加載某些網站

一些網站,表現相當不錯,只是通過在URL中替換 「HTTP」 爲 「https」 正常加載:

http://www.yahoo.com/news -> loads blank 
**https://www.yahoo.com/news -> loads OK!!** 

URLs without the https:// prefix will NOT load at all. 

http://www.google.com -> blank 
**https://www.google.com -> Loads OK!!!** 
http://www.bbc.co.uk/news (no .plist Exception) -> blank 
https://www.bbc.co.uk/news (no .plist Exception) -> blank 
http://www.bbc.co.uk/news (WITH .plist Exception) -> blank 
https://www.bbc.co.uk/news (WITH .plist Exception) -> blank 

(我在Mac OS瀏覽器粘貼https://www.bbc.co.uk/news,並得到重定向到https://www.bbc.co.uk/news,所以我想他們也:)

https://www.bbc.com/news (WITH .plist Exception) -> Images and text are loaded in a messy, unformatted, basic way. 
http://www.bbc.com/news (WITH .plist Exception) -> Images and text are loaded in a messy, unformatted, basic way. 
https://www.bbc.com/news (WITHOUT .plist Exception) -> blank 
http://www.bbc.com/news (WITHOUT .plist Exception) -> blank 

其他網址的行爲就像BBC,或者,雅虎以上的例子。

這是我在.plist文件上使用的那種異常。

這是我的代碼:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    CGRect wkFrame = _wios10container.frame; 
    NSLog(@"WPVC - viewDidLoad, wkFrame: %@",NSStringFromCGRect(wkFrame)); 
    WKWebViewConfiguration *wkConfiguration = [[WKWebViewConfiguration alloc] init]; 
    _webviewIOS10 = [[WKWebView alloc] initWithFrame:_wios10container.frame configuration:wkConfiguration]; 
    _webviewIOS10.navigationDelegate = self; 
    [_wios10container addSubview:_webviewIOS10]; 
} 

我的問題是:

  1. 我怎樣才能正確地加載網站,如英國廣播公司?
  2. 我該如何準備我的應用程序加載任何網址,而無需使用例外情況下的龐大列表 ?
  3. 如果我將NSAppTransportSecurity.NSAllowsArbitraryLoads設置爲YES,該應用可以正常工作,但我根本不喜歡這樣。 爲了安全和App Store審批,我還有什麼替代方案?

回答

0

更健壯的方式來做到這一點將使用WKNavigationDelegate,並在你的情況下評估的URL。爲了處理一個巨大的列表(沒有關於該列表的更多知識),我會根據它執行正則表達式評估。你也可以根據你的需要創建一個重定向策略。

例如:

class WebNavigationHandler: NSObject, WKNavigationDelegate { 

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) { 

     //Based on the navigation action decide what to do. 
     if canINavigate { 
      decisionHandler(.allow) 
     } else { 
      decisionHandler(.cancel) 
     } 
    } 

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Swift.Void) { 

     // Base on the navigationResponse 

     if canINavigate { 
      decisionHandler(.allow) 
     } else { 
      decisionHandler(.cancel) 
     } 
    } 

} 

let webview = WKWebView() 
webview.navigationDelegate = WebNavigationHandler() 

希望這回答你的問題。

+0

我會盡力,謝謝。通過一個大列表,我的意思是:我無法預測在運行時可以通過在.plist文件中單獨設置所有可能的URL。當我嘗試你的方法時,我會回來的。 – Josh

0

大量的試驗和錯誤後,這是對我工作的公式:

  1. 不更換的http:https爲:在URL字符串
  2. 添加單個域例外對於你想要的每個域名支持 。我的應用程序需要顯示只有8個網站,所以這 組合工作得很好!:
<key>bbc.co.uk</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSExceptionRequiresForwardSecrecy</key> 
       <true/> 
       <key>NSExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
       <false/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <true/> 
       <key>NSThirdPartyExceptionMinimumTLSVersion</key> 
       <string>TLSv1.2</string> 
       <key>NSRequiresCertificateTransparency</key> 
       <false/> 
      </dict> 

可選,前者也適用於這個另一種方法,裝上一個SFSafariViewController的URL。我會解決這種方法,這是相當可靠的,甚至有回來,接下來,刷新,並在內置的導航分享按鈕。酒吧。這裏是代碼:

NSURL *wkURL = [NSURL URLWithString:wkURLstring]; 
    SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:wkURL]; 
    [self.view.window.rootViewController presentViewController:safariVC animated:YES completion:^{ 
     NSLog(@"Full Safari Webview Launched"); 
    }];