web-dev-qa-db-ja.com

WebViewからSafari View Controllerを開く方法(Swift)

現在ウェブビューを使用しているアプリがあり、ウェブビューで特定のリンクをクリックすると、Safariでそれらのリンクが開きます。 Safariアプリで起動する代わりに、Safari View Controller(SVC)を実装したいと思います。私は調査を行い、SVCの例を調べました。ただし、表示されるのは、ボタンをクリックするだけでSVCを開くものです。誰かが私を見たり試してみたりするための提案がありますか?

これが私のコードの一部です:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        let Host = request.URL!.Host!;
        if (Host != "www.example.com"){
            return true
        } else {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
    return true

}

func showLinksClicked() {

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
    self.presentViewController(safariVC, animated: true, completion: nil)
    safariVC.delegate = self    }

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
11
beginnercoder

私が正しく理解している場合、ユーザーがSVCでそれらのページを開きたいリンクをクリックすると、特定のリンクを持つWebViewにページが読み込まれます。次のデリゲートメソッドを使用してWebViewのリンククリックを検出し、そこからSVCを開くことができます。

編集

編集した質問に基づいて、showLinksClicked funcを呼び出していないことがわかります。次のコードで更新しているので、この関数を呼び出すことができます。

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
       self.showLinksClicked()
       return false

    }
    return true;
}


func showLinksClicked() {

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
    self.presentViewController(safariVC, animated: true, completion: nil)
    safariVC.delegate = self
}

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
16
Bhumit Mehta

Swift= 3:

まず、SafariServicesをインポートし、デリゲートをクラスに統合します。

import SafariServices

class YourViewController: SFSafariViewControllerDelegate {

次に、指定したURLでSafariを開きます。

let url = URL(string: "http://www,google.com")!
let controller = SFSafariViewController(url: url)
self.present(controller, animated: true, completion: nil)
controller.delegate = self

そして今、ユーザーが終了したときにサファリを却下するデリゲートコールバックを実装できます。

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}
13
vikzilla

このコードにより、これを行うことができます。

let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self

これをクラスの最上部にも追加する必要がある場合があります。

import SafariServices
8
onemillion

手順に従ってください :

コントローラーファイル(ViewController.Swiftなど)でSafarriServicesをインポートします。

import SafariServices

次に、リンク書き込みを開きたい場所

let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(controller, animated: true, completion: nil)
controller = self
2
Dipen Patel

Solution For Swift 4

ステップ1:

クラス内のSafariサービスをインポート

import SafariServices

ステップ2:

View Controllerを使用してSFSafariViewControllerDelegateをインポートする

class ViewController: UIViewController,SFSafariViewControllerDelegate {...}

ステップ3:

Safari View Controllerを開く関数を作成します。

 func openSafariVC() {

            let safariVC = SFSafariViewController(url: NSURL(string: "https://www.google.com")! as URL)
            self.present(safariVC, animated: true, completion: nil)
            safariVC.delegate = self
        }

        func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
            controller.dismiss(animated: true, completion: nil)
        }

ステップ4:

関数openSafariVCを呼び出す

openSafariVC()

注: View ControllerにNavigation Controllerを追加することを忘れないでください。

これで、SafariVCはIWebView Oe WKWebViewを使用せずにアプリ内でリンクを開く準備ができました

2
Anup Gupta