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?

Shane O'Seasnain
fuente

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)
}
Devran Cosmo Uenal
fuente
¿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.

Nirav D
fuente
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)
Chetan Rajagiri
fuente
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)
    }
}
Demosthese
fuente
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.
    }


};
Scott Maretick
fuente
2
import UIKit 
import SafariServices 

let url = URL(string: "https://sprotechs.com")
let vc = SFSafariViewController(url: url!) 
present(vc, animated: true, completion: nil)
Salman Khan
fuente