Как открыть контроллер Safari View из Webview (swift)

У меня есть приложение, которое в настоящее время использует webview, и когда в webview нажимаются определенные ссылки, он открывает эти ссылки в Safari. Теперь я хочу реализовать контроллер Safari View Controller (SVC) вместо загрузки его в приложение Safari. Я провел исследование и посмотрел примеры на 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)
}

5 ответов


Если я правильно понимаю, вы загружаете страницу в webview, которая теперь имеет определенные ссылки, когда пользователь нажимает на ссылку, которую вы хотите открыть в SVC. Вы можете обнаружить щелчок ссылки в 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)
}

Для Swift 3:

сначала импортируйте SafariServices и интегрируйте делегат в свой класс:

import SafariServices

class YourViewController: SFSafariViewControllerDelegate {

затем, чтобы открыть Safari с указанным url:

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

и теперь вы можете реализовать обратный вызов делегата, чтобы уволить safari, когда пользователь закончит:

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

этот кусок кода позволит вам сделать это.

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

возможно, Вам также потребуется добавить это в начало класса:

import SafariServices

выполните действия :

в файле контроллера(например, 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

Решение Для Swift 4

Шаг 1:

импорт службы Safari в вашем классе

import SafariServices

Шаг 2:

импорт SFSafariViewControllerDelegate в с контроллером вида

class ViewController: UIViewController,SFSafariViewControllerDelegate {...}

Шаг 3:

создайте функцию для открытия контроллера вида Safari.

 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()

Примечание: Не забудьте добавить навигационный контроллер с вашим видом Контроллер.

теперь ваш SafariVC готов открыть ссылку в приложении без использования UIWebView Oe WKWebView