Cómo abrir una URL en Swift3


149

openURLha quedado en desuso en Swift3. ¿Alguien puede proporcionar algunos ejemplos de cómo funciona el reemplazo openURL:options:completionHandler:al intentar abrir una url?

Respuestas:


385

Todo lo que necesitas es:

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

¿Qué pasa si uso el operador '+' en mi URL? Por ejemplo: " xxxxx.com./… " como este. Esa cadena me dio un error "No hay candidatos '+' que producen el tipo de resultado contextual esperado 'URL"
Ibrahim BOLAT

usted tiene que utilizar el operador + en su Stringlugar en elURL
Devran Cosmo Uenal

Nota al margen: no intente hacer esto: UIApplication.shared.openURL (URL (string: "insert url here")!). El compilador en XCode 8 se confundirá y no podrá compilarse correctamente. Así que solo usa esta solución como está. ¡Funciona genial! Gracias.
Joel

¿Cómo abriría la url sin abrir Safari? ¿Cómo consigo que la URL se "abra" en segundo plano? Responda mi pregunta en: stackoverflow.com/questions/43686252/… .
Christian Kreiter

1
¿Quieres decir que Swift no te hace escalar paredes para hacer algo tan complejo como abrir una URL? [mandíbula caída]
Daniel Springer

36

La respuesta anterior es correcta, pero si desea comprobarlo canOpenUrlo no, intente así.

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: Si no desea manejar la finalización, también puede escribir así.

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

No es necesario escribir, completionHandlerya que contiene el valor predeterminado nil, consulte la documentación de Apple para obtener más detalles.


28

Si desea abrir dentro de la aplicación en lugar de salir de la aplicación, puede importar SafariServices y resolverlo.

import UIKit
import SafariServices

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

1
Este método es la mejor práctica según las pautas de iOS
gtrujillos 05 de

8

Versión 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)
    }
}

puedes usar una expresión regular con replacingOccurrences.
Sulthan

2

Estoy usando macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 y esto es lo que funcionó para mí en 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.