Как открыть 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)
}
}
Удачного кодирования Спасибо :)