Как открыть Safari View Controller из веб-просмотра (быстро)

У меня есть приложение, которое в настоящее время использует веб-просмотр, и при нажатии определенных ссылок в веб-просмотре оно открывает эти ссылки в 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)
}

person beginnercoder    schedule 05.07.2016    source источник


Ответы (6)


Если я правильно понимаю, вы загружаете страницу в веб-просмотре, которая теперь имеет определенные ссылки, когда пользователь нажимает на ссылку, которую вы хотите открыть в 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: URL(string: "www.google.com")!)
    present(safariVC, animated: true, completion: nil)
    safariVC.delegate = self
}

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
person Bhumit Mehta    schedule 05.07.2016
comment
Я использую код, подобный этому, и он работает. Однако он открывает щелкнутые ссылки в реальном приложении Safari, где я просто хочу открыть Safari View Controller внутри своего собственного приложения. @Бхумит Мехта - person beginnercoder; 05.07.2016
comment
@beginnercoder Можете ли вы отредактировать свой вопрос с помощью кода, который вы используете? - person Bhumit Mehta; 06.07.2016
comment
@beginnercoder Я обновил свой ответ, вы создали функцию, но не вызывали ее. - person Bhumit Mehta; 06.07.2016
comment
Это по-прежнему открывает щелкнутую ссылку в веб-просмотре, а не в SVC, как я этого хочу. @Бхумит Мехта - person beginnercoder; 06.07.2016
comment
@beginnercoder Я удалил условие домена из метода делегата, я думаю, что это не было удовлетворено, вы можете проверить сейчас? - person Bhumit Mehta; 06.07.2016

Для Свифт 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)
}
person vikzilla    schedule 22.12.2016

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

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

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

import SafariServices
person onemillion    schedule 05.07.2016
comment
следует ли это просто добавить в мой текущий код? Или я помещаю его туда вместо части своего кода? Если я просто добавлю его туда, ничего не произойдет - person beginnercoder; 05.07.2016
comment
Вам нужно будет поместить его либо в функцию viewDidLoad, либо в функцию viewWillAppear. В моем приложении это прикреплено к кнопке, поэтому при нажатии на нее страница появляется в сафари. - person onemillion; 05.07.2016
comment
Хорошо, видите, у меня нет кнопки, с которой она связана. Я хочу, чтобы он открывал SVC при нажатии некоторых ссылок в приложении. (например: «Свяжитесь с нами», «О нас» и т. д.) Мой веб-просмотр вызывает веб-сайт с этими ссылками, поэтому я не могу контролировать исходный код веб-сайта. - person beginnercoder; 05.07.2016

Решение для 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.

person Anup Gupta    schedule 02.07.2018
comment
есть ли способ напрямую открыть SFSafariViewController, чтобы мне не приходилось вызывать openSafariVC()? сейчас я использую это › paste.ubuntu.com/p/RGmFqR76Dv, но я хотите использовать только SFSafariViewController. - person Shahid Ghafoor; 24.09.2020
comment
@ShahidGhafoor SFSafariViewController предназначен для открытия при любом событии щелчка, иначе вы можете открыть веб-страницу внутри ViewController с помощью WKWebView, поэтому нет необходимости перенаправлять из VC в SFVC. - person Anup Gupta; 24.09.2020

Следуйте шагам :

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

Свифт 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)
    }
}

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

person Azharhussain Shaikh    schedule 22.10.2019