12
votes

Comment ouvrir le contrôleur de vue Safari d'un webview (Swift)

J'ai une application qui utilise actuellement une View WebView et lorsque certains liens sont cliqués dans la vision WebView, il ouvre ces liens dans Safari. Je souhaite maintenant mettre en œuvre le contrôleur de la vue Safari (SVC) au lieu de le démarrer à l'application Safari. J'ai fait des recherches et j'ai examiné des exemples sur le SVC; Cependant, tout ce que je vois sont ceux qui ouvrent le SVC à partir du clic d'un bouton. Est-ce que quelqu'un a des suggestions pour moi de regarder ou d'essayer?

Voici une partie de mon code: xxx


0 commentaires

7 Réponses :


8
votes

Ce morceau de code vous permettra de le faire.

import SafariServices


3 commentaires

Devrait-il simplement être ajouté à mon code actuel? Ou puis-je le mettre là-bas au lieu d'une partie de mon code? Si je viens de l'ajouter là-bas, rien de différent n'arrive


Vous devrez le mettre dans votre fonction ViewDidLoad ou ViewWillappear. Dans mon application, cela est joint à un bouton de sorte que lorsque vous cliquez dessus, la page apparaît dans Safari.


OK, voyez que je n'ai pas de bouton qu'il est lié. Je veux que cela opeine le SVC lorsque certains liens de l'application sont cliqués. (ex: Contactez-nous, à propos de nous, etc.) Mon webview appelle un site Web avec ces liens, donc je n'ai aucun contrôle du code initial du site Web.



17
votes

Si je comprends correctement, vous chargez une page sur webview qui dispose de certains liens maintenant lorsque l'utilisateur clique sur le lien que vous souhaitez ouvrir ces pages dans SVC. Vous pouvez détecter la liaison Cliquez dans WebView en utilisant la méthode de déléguée suivante, puis ouvrez SVC à partir de là.

Modifier P>

basé sur la question modifiée, je peux voir que vous n'appelez pas showLinksClicked Func, vous pouvez appeler cette fonction comme J'ai mis à jour le code suivant et cela devrait fonctionner. P>

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


5 commentaires

J'utilise le code similaire à cela, et ça marche. Cependant, il ouvre les liens cliqués dans l'application Safari actuelle, où je veux simplement ouvrir un contrôleur de vue Safari à l'intérieur de ma propre application. @Bhumit Mehta


@beginnerCoder Pouvez-vous modifier votre question avec le code que vous utilisez?


@beginnerCoder J'ai mis à jour ma réponse, vous avez créé la fonction mais n'appeliez pas cela.


Cela ouvre toujours le lien cliqué dans la vision WebView, et non le SVC comme je le souhaite. @Bhumit Mehta


@beginnerCoder J'ai supprimé l'état de domaine de la méthode des délégués, je pense que ce n'était pas satisfait, pouvez-vous vérifier maintenant?



2
votes

Suivez les étapes:

sur votre fichier de contrôleur (E.G. ViewController.swift) Import Safarriservices. xxx

alors où vous souhaitez ouvrir la liaison écrire écrire xxx


0 commentaires

13
votes

Pour Swift 3:

Premièrement, importer des safarservices et intégrer le délégué à votre classe: P> xxx pré>

puis, pour ouvrir safari avec l'URL spécifiée: P >

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


0 commentaires

3
votes

Solution pour Swift 4 Strong> P>

Étape 1: strong> p>

Importez le service Safari en votre classe P>

openSafariVC()


2 commentaires

Y a-t-il une manière là où je peux directement ouvrir SFSAFARIVIEWCONTROLLER, donc je n'ai pas à appeler OpenSafarivc ()? Pour l'instant j'utilise faire ceci> coller.ubuntu.com/p/rgmfqr76dv mais je Vous voulez seulement utiliser SFSAFARIVIEWCONTROLLER.


@Shahidghafoor sfsafariviewcontroller est destiné à ouvrir n'importe quel événement de clic, vous pouvez ouvrir une page Web à l'intérieur ViewController avec WKWebView, donc pas besoin de rediriger de VC à SFVC.



0
votes

Swift 4.2 strong>

C'est ainsi que vous pouvez ouvrir un navigateur de safari dans votre application. P>

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


0 commentaires

0
votes
import SafariServices

class ViewController: UIViewController, SFSafariViewControllerDelegate {

 override func viewDidLoad() {
     super.viewDidLoad()
     DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
         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) {
     dismiss(animated: true)
 }
}

0 commentaires