So öffnen Sie eine URL in Swift3

149

openURLwurde in Swift3 veraltet. Kann jemand einige Beispiele dafür geben, wie der Ersatz openURL:options:completionHandler:funktioniert, wenn versucht wird, eine URL zu öffnen?

Shane O'Seasnain
quelle

Antworten:

385

Alles was Sie brauchen ist:

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
quelle
Was ist, wenn ich den Operator '+' in meiner URL verwende? Zum Beispiel: " xxxxx.com./… " wie folgt . Diese Zeichenfolge gab mir einen Fehler "Keine '+' Kandidaten produzieren den erwarteten kontextuellen Ergebnistyp 'URL"
Ibrahim BOLAT
Sie müssen den Operator + auf Ihrem Stringstattdessen auf demURL
Devran Cosmo Uenal
Randnotiz: Versuchen Sie nicht, dies zu tun: UIApplication.shared.openURL (URL (Zeichenfolge: "URL hier einfügen")!). Der Compiler unter XCode 8 wird verwirrt und kann nicht richtig erstellen. Verwenden Sie diese Lösung also so wie sie ist. Funktioniert super! Vielen Dank.
Joel
Wie würde ich die URL öffnen, ohne Safari tatsächlich zu öffnen? Wie kann ich die URL im Hintergrund "öffnen"? Bitte beantworten Sie meine Frage unter: stackoverflow.com/questions/43686252/… .
Christian Kreiter
1
Du meinst, Swift bringt dich nicht dazu, Wände zu besteigen, um etwas so Komplexes wie das Öffnen einer URL zu tun? [Kiefer fallen gelassen]
Daniel Springer
36

Die obige Antwort ist richtig, aber wenn Sie Sie überprüfen möchten canOpenUrloder nicht, versuchen Sie es so.

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

Hinweis: Wenn Sie die Fertigstellung nicht bearbeiten möchten, können Sie auch so schreiben.

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

Sie müssen nicht schreiben, completionHandlerda es den Standardwert enthält. Weitere nilInformationen finden Sie in der Apple-Dokumentation .

Nirav D.
quelle
28

Wenn Sie in der App selbst öffnen möchten, anstatt die App zu verlassen, können Sie SafariServices importieren und ausarbeiten.

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
quelle
1
Diese Methode ist die beste Vorgehensweise gemäß den iOS-Richtlinien
gtrujillos
8

Swift 3 Version

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
quelle
Sie können einen regulären Ausdruck mit verwenden replacingOccurrences.
Sulthan
2

Ich verwende macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 und in ViewController.swift hat Folgendes für mich funktioniert:

//
//  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
quelle
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
quelle