Как открыть Safari View Controller из 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)
}

Ответ 1

Если я правильно понимаю, вы загружаете страницу в webview, которая имеет определенные ссылки, когда пользователь нажимает ссылку, которую вы хотите открыть в SVC. Вы можете обнаружить ссылку в веб-браузере, используя следующий метод делегирования, а затем откройте SVC.

ИЗМЕНИТЬ

На основании отредактированного вопроса я вижу, что вы не вызываете функцию showLinksClicked, вы можете вызвать эту функцию, поскольку я обновил следующий код, и он должен работать.

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

Ответ 2

Для 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

И теперь вы можете реализовать обратный вызов делегата, чтобы отключить сафари, когда пользователь закончил:

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

Ответ 3

Этот фрагмент кода позволит вам сделать это.

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

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

import SafariServices

Ответ 4

Выполните следующие действия:

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

Ответ 5

Solution For Swift 4

Шаг 1:

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

import SafariServices

Шаг 2:

Импортировать SFSafariViewControllerDelegate с помощью своего View Controller

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

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

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

Ответ 6

Swift 4.2

Вот как вы можете открыть браузер Safari в своем приложении.

import SafariServices

всякий раз, когда вы хотите открыть, как мудрый на

@IBAction func btnOpenWebTapped(_ sender: UIButton) {
    self.openWeb(contentLink: "https://www.google.com")
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.openWeb(contentLink: "https://www.google.com")
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     self.openWeb(contentLink: "https://www.google.com")
}

написать пользовательскую функцию, как вы, и вы можете настроить свойства SFSafariViewController, preferredBarTintColor, preferredControlTintColor, dismissButtonStyle, barCollapsingEnabled

func openWeb(contentLink : String){
     let url = URL(string: contentLink)!
     let controller = SFSafariViewController(url: url)
     controller.preferredBarTintColor = UIColor.darkGray
     controller.preferredControlTintColor = UIColor.groupTableViewBackground
     controller.dismissButtonStyle = .close
     controller.configuration.barCollapsingEnabled = true
     self.present(controller, animated: true, completion: nil)
     controller.delegate = self
}

Последнее и самое важное: не забудьте связать делегата SFSafariViewController с вашим контроллером вида. Вы можете сделать это с помощью приведенного ниже кода extension.

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

Удачного кодирования Спасибо :)