come aprire un URL in Swift3


149

openURLè stato deprecato in Swift3. Qualcuno può fornire alcuni esempi di come funziona la sostituzione openURL:options:completionHandler:quando si tenta di aprire un URL?

Risposte:


385

Tutto ciò che serve è:

guard let url = URL(string: "http://www.google.com") else {
  return //be safe
}

if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}

cosa succede se utilizzo l'operatore '+' nel mio URL? Ad esempio: " xxxxx.com./… " come questo. Quella stringa mi ha dato un errore "Nessun candidato '+' produce il tipo di risultato contestuale previsto 'URL"
Ibrahim BOLAT

è necessario utilizzare l'operatore + sul Stringinvece sullaURL
Devran Cosmo Uenal

Nota a margine: non provare a fare questo: UIApplication.shared.openURL (URL (stringa: "inserisci l'URL qui")!). Il compilatore su XCode 8 verrà confuso e non sarà in grado di compilare correttamente. Quindi usa questa soluzione così com'è. Funziona alla grande! Grazie.
Gioele

Come aprirei l'URL senza aprire Safari? Come faccio a far aprire l'URL in background? Rispondi alla mia domanda all'indirizzo: stackoverflow.com/questions/43686252/… .
Christian Kreiter,

1
Vuoi dire che Swift non ti fa arrampicare sui muri per fare qualcosa di così complesso come aprire un URL? [mascella lasciata cadere]
Daniel Springer il

36

La risposta sopra è corretta ma se vuoi controllarti canOpenUrlo non provare in questo modo.

let url = URL(string: "http://www.facebook.com")!
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    //If you want handle the completion block than 
    UIApplication.shared.open(url, options: [:], completionHandler: { (success) in
         print("Open url : \(success)")
    })
}

Nota: se non si desidera gestire il completamento, è anche possibile scrivere in questo modo.

UIApplication.shared.open(url, options: [:])

Non c'è bisogno di scrivere completionHandlerperché contiene un valore predefinito nil, controlla la documentazione di Apple per maggiori dettagli.


28

Se si desidera aprire l'app stessa anziché uscire dall'app, è possibile importare SafariServices e risolverlo.

import UIKit
import SafariServices

let url = URL(string: "https://www.google.com")
let vc = SFSafariViewController(url: url!)
present(vc, animated: true, completion: nil)

1
Questo metodo è la migliore pratica secondo le linee guida iOS
gtrujillos

8

Versione Swift 3

import UIKit

protocol PhoneCalling {
    func call(phoneNumber: String)
}

extension PhoneCalling {
    func call(phoneNumber: String) {
        let cleanNumber = phoneNumber.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
        guard let number = URL(string: "telprompt://" + cleanNumber) else { return }

        UIApplication.shared.open(number, options: [:], completionHandler: nil)
    }
}

puoi usare un'espressione regolare con replacingOccurrences.
Sulthan,

2

Sto usando macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 ed ecco cosa ha funzionato per me in ViewController.swift:

//
//  ViewController.swift
//  UIWebViewExample
//
//  Created by Scott Maretick on 1/2/17.
//  Copyright © 2017 Scott Maretick. All rights reserved.
//

import UIKit
import WebKit

class ViewController: UIViewController {

    //added this code
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Your webView code goes here
        let url = URL(string: "https://www.google.com")
        if UIApplication.shared.canOpenURL(url!) {
            UIApplication.shared.open(url!, options: [:], completionHandler: nil)
            //If you want handle the completion block than
            UIApplication.shared.open(url!, options: [:], completionHandler: { (success) in
                print("Open url : \(success)")
            })
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


};

2
import UIKit 
import SafariServices 

let url = URL(string: "https://sprotechs.com")
let vc = SFSafariViewController(url: url!) 
present(vc, animated: true, completion: nil)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.