Enlace abierto rápido en Safari

150

Actualmente estoy abriendo el enlace en mi aplicación en un WebView, pero estoy buscando una opción para abrir el enlace en Safari .

Fabian Boulegue
fuente

Respuestas:

348

No está "horneado en Swift", pero puede utilizar UIKitmétodos estándar para hacerlo. Eche un vistazo a UIApplication's (en desuso) y .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 y superior)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

Swift 3 (iOS 9 y versiones inferiores)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

Swift 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    
Mike S
fuente
¿Hay alguna posibilidad de la tienda de aplicaciones si agregamos alguna URL de compra como esta?
Jan
8
En iOS 10.0 ahora debe agregar opciones y controlador: UIApplication.shared.open (URL (cadena: " google.com" ) !, opciones: [:], completeHandler: nil)
gabicuesta
1
@gabicuesta En realidad no tiene que proporcionar opciones y finalización Handler, por defecto son [:] y nil, respectivamente
Jeremy
79

Nuevo con iOS 9 y superior, puede presentarle al usuario un SFSafariViewController(consulte la documentación aquí ). Básicamente obtienes todos los beneficios de enviar al usuario a Safari sin hacer que abandone tu aplicación. Para usar el nuevo SFSafariViewController solo:

import SafariServices

y en algún lugar de un controlador de eventos, presente al usuario el controlador de vista de safari de esta manera:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

La vista de safari se verá así:

ingrese la descripción de la imagen aquí

manncito
fuente
3
Esto es asombroso ¡Gracias! Todos los que quieran mostrar el navegador Safari en una extensión de aplicación deben usar este código. El acceso a la sharedApplicationpropiedad en la extensión de la aplicación está prohibido. Para más información: developer.apple.com/library/archive/documentation/General/…
Baran Emre
1
solución excepcional
Mutawe
1
Apple a veces rechaza las aplicaciones de la tienda por usar el antiguo método openURL. Esta debería ser ahora la solución preferida.
disconnectionist
19

ACTUALIZADO para Swift 4: (crédito a Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

O vaya con más estilo rápido usando guard:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Puede marcar NSURL como opcional implícitamente:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}
CodeOverRide
fuente
44
Amit, no, porque se hace explícitamente, como he explicado, es garantía de que requestUrl exista si let requestUrl = ...
CodeOverRide
2
Sí, hay muchas maneras de hacer las cosas. Conozca la razón por la que debe usar cierto código en una situación en lugar de ser un mocoso terco que dice: "Estoy en lo cierto, por lo tanto, está equivocado". Parece que eres nuevo en la programación, este es mi consejo para ti, chico.
CodeOverRide
3
Amit: No, no funciona, simplemente estás equivocado. En Swift 2 o 1.2. Y no es de extrañar, requestUrl no es opcional, por lo que no puede desenvolverlo.
Gusutafu
2
Me gusta más este método que el de Mike S, porque haces la comprobación nula antes de enviar la solicitud.
Nikolaj Nielsen
1
actualizado para Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber
12

Swift 3 y IOS 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

Swift 3 y IOS 10.2

ramchandra n
fuente
Pero tenga en cuenta que el uso de esta versión se detendrá la aplicación que se ejecuta en iOS 9 y anterior a menos que la versión comprobarlo
CupawnTae
11

desde iOS 10 deberías usar:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}
Samira Ekrami
fuente
2

En Swift 1.2:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}
Amit Kalra
fuente
1

En Swift 2.0:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)
Kaptain
fuente
-1

IOS 11.2 Swift 3.1-4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}
guevara lopez
fuente