

現在UIWebviewからWKWebviewへの移行作業を行なっております。  
しかし、UIWebviewで動作していた、『PDFをアプリ内ではなく、Safariで確認する』という動作が動かなくなりました。

以下が問題のソースになります。  
使用言語はSwiftです。

[code]

    func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
    
        if navigationAction.navigationType == WKNavigationType.FormSubmitted{
                let pattern = "PDFのURL"
                let flag = Regexp(pattern).isMatch(String(navigationAction.request.URL!))
                print(flag)
                print(navigationAction.request.URL!)
                if flag {
                    UIApplication.sharedApplication().openURL(navigationAction.request.URL!);
                }
            }
    
            if navigationAction.navigationType == WKNavigationType.LinkActivated{
                let pattern = "PDFのURL"
                let flag = Regexp(pattern).isMatch(String(navigationAction.request.URL!))
                print(flag)
                print(navigationAction.request.URL!)
                if flag {
                    UIApplication.sharedApplication().openURL(navigationAction.request.URL!);
                }
            }
    
            return nil
        }
    
    import Foundation
    
    class Regexp {
        let internalRegexp: NSRegularExpression
        let pattern: String
    
        init(_ pattern: String) {
            self.pattern = pattern
            self.internalRegexp = try! NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
        }
    
        func isMatch(input: String) -> Bool {
            let matches = self.internalRegexp.matchesInString( input, options: [], range:NSMakeRange(0, input.characters.count) )
            return matches.count > 0
        }
    
        func matches(input: String) -> [String]? {
            if self.isMatch(input) {
                let matches = self.internalRegexp.matchesInString( input, options: [], range:NSMakeRange(0, input.characters.count) )
                var results: [String] = []
                for i in 0 ..< matches.count {
                    results.append( (input as NSString).substringWithRange(matches[i].range) )
                }
                return results
            }
            return nil
        }
    
[/code]

移行前のソースはこちらになります。

[code]

     func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
    
            if navigationType == UIWebViewNavigationType.FormSubmitted{
                let pattern = "PDFのURL"
                let flag = Regexp(pattern).isMatch(String(request.URL!))
                print(flag)
                print(request.URL)
                if flag {
                    UIApplication.sharedApplication().openURL(request.URL!);
                    return false;
                }
            }
    
            if navigationType == UIWebViewNavigationType.LinkClicked{
                let pattern = "PDFのURL"
                let flag = Regexp(pattern).isMatch(String(request.URL!))
                print(flag)
                print(request.URL)
                if flag {
                    UIApplication.sharedApplication().openURL(request.URL!);
                    return false;
                }
            }
    
            return true
        }
    
[/code]

現在は、PDFがSafariではなく、Sebview内で表示してしまうといった状況です。  
どこか記述が誤っている箇所があるのでしょうか？

申し訳ありませんが、ご存知でしたら回答お願い致します。


CC BY-SA 3.0
2017-02-23T01:14:13.653
32882
2023-11-19T11:05:50.657
2017-10-05T13:33:17.623
5519
20784
question
swift ios
WKWebViewからSafariを起動したい


Swiftのバージョンの記載をお願いします（おそらく2系かと思います）

さて回答ですが、uiDelegateの

[code]

    func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
    
    }
    
[/code]

ではなく、

navigationDelegateの

[code]

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    
    }
    
[/code]

で処理してみてはいかがでしょうか。

以下、実験したソースです。  
条件は異なりますが、PDFファイルだったらsafariで開くようになっています。

[code]

    import UIKit
    import WebKit
    
    class ViewController: UIViewController, WKNavigationDelegate {
    
        var webView: WKWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            webView = WKWebView(frame: UIScreen.mainScreen().bounds)
            webView.navigationDelegate = self
            view.addSubview(webView)
    
            if let url = NSURL(string: "https://google.co.jp") {
                webView.loadRequest(NSURLRequest(URL: url))
            }
        }
    
        func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    
            if let url = navigationAction.request.URL where url.pathExtension?.lowercaseString == "pdf" {
                decisionHandler(.Cancel)
                UIApplication.sharedApplication().openURL(url)
            } else {
                decisionHandler(.Allow)
            }
        }
    }
    
[/code]

お試しください。


CC BY-SA 3.0
2017-02-24T08:53:18.683
32922
2017-02-24T08:53:18.683
5605
32882
answer