2017-03-08 16 views
1

Webサービスから来た幅広い種類のウェブサイトURLをWKWebviewに読み込む必要があります。WKWebviewは特定のウェブサイトを適切にロードしません

一部のWebサイト、非常によく振る舞い、そしてちょうどURLに "https" のために "HTTP" を交換することにより、正しくロード:

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にリダイレクトましただから私もそれらを試してみました:)

他のURLは、上記のBBCやYahooの例と同様に動作します。

これは、私が.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. どのように私は適切なBBCなどのウェブサイトを読み込むことができますか?
  2. 例外の巨大なリスト を必要とせずにURLをロードするようにアプリを準備するにはどうすればよいですか?
  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

、これは私のために働いた式である:このAppleのドキュメントを参照してください

  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"); 
    }]; 
関連する問題