como abrir um URL no Swift3

149

openURLfoi descontinuado no Swift3. Alguém pode fornecer alguns exemplos de como a substituição openURL:options:completionHandler:funciona ao tentar abrir um URL?

Shane O'Seasnain
fonte

Respostas:

385

Tudo o que você precisa é:

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
fonte
e se eu usar o operador '+' no meu URL? Por exemplo: " xxxxx.com./… " assim. Essa string me deu um erro "Nenhum candidato '+' produz o tipo de resultado contextual esperado 'URL"
Ibrahim BOLAT 5/17/17
você tem que usar o operador + em seu Stringlugar naURL
Devran Cosmo Uenal
Nota: não tente fazer isso: UIApplication.shared.openURL (URL (string: "insira aqui a URL")!). O compilador no XCode 8 ficará confuso e não poderá compilar corretamente. Então, basta usar esta solução como está. Funciona bem! Obrigado.
Joel
Como abrir o URL sem realmente abrir o Safari? Como faço para que o URL seja "aberto" em segundo plano? Responda à minha pergunta em: stackoverflow.com/questions/43686252/… .
Christian Kreiter
1
Você quer dizer que o Swift não faz você escalar paredes para fazer algo tão complexo quanto abrir um URL? [queixo caído]
Daniel Springer
36

A resposta acima está correta, mas se você deseja verificar canOpenUrlou não tentar assim.

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 você não deseja lidar com a conclusão, também pode escrever assim.

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

Não há necessidade de escrever completionHandler, pois contém o valor padrão nil; consulte a documentação da apple para obter mais detalhes.

Nirav D
fonte
28

Se você deseja abrir dentro do próprio aplicativo, em vez de sair do aplicativo, pode importar o SafariServices e resolvê -lo.

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
fonte
1
Este método é a melhor prática de acordo com as diretrizes do iOS
gtrujillos
8

Versão 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)
    }
}
Demóstese
fonte
você pode usar uma expressão regular com replacingOccurrences.
Sulthan
2

Estou usando o Xcode v8.1 Swift 3.0.1 do macOS Sierra (v10.12.1) e aqui está o que funcionou para mim no 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
fonte
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
fonte