jak otworzyć adres URL w Swift3

149

openURLzostał wycofany w Swift3. Czy ktoś może podać przykłady działania zamiany openURL:options:completionHandler:podczas próby otwarcia adresu URL?

Shane O'Seasnain
źródło

Odpowiedzi:

385

Wszystko czego potrzebujesz to:

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
źródło
co jeśli użyję operatora „+” w moim adresie URL? Na przykład: „ xxxxx.com./… ” w ten sposób. Ten ciąg dał mi błąd „Brak kandydatów„ + ”generuje oczekiwany kontekstowy typ wyniku„ URL ”
Ibrahim BOLAT
musisz Stringzamiast tego użyć operatora + na swoimURL
Devran Cosmo Uenal
Uwaga boczna: nie próbuj tego robić: UIApplication.shared.openURL (URL (string: "tu wstaw adres url")!). Kompilator na XCode 8 będzie zdezorientowany i nie będzie w stanie poprawnie zbudować. Więc po prostu użyj tego rozwiązania tak, jak jest. Działa świetnie! Dzięki.
Joel
Jak otworzyć adres URL bez otwierania przeglądarki Safari? Jak sprawić, aby adres URL „otwierał się” w tle? Proszę odpowiedzieć na moje pytanie pod adresem: stackoverflow.com/questions/43686252/… .
Christian Kreiter
1
Masz na myśli, że Swift nie zmusza cię do wspinania się po ścianach, aby zrobić coś tak złożonego, jak otwarcie adresu URL? [szczęka opadła]
Daniel Springer,
36

Powyższa odpowiedź jest poprawna, ale jeśli chcesz się sprawdzić canOpenUrllub nie, spróbuj w ten sposób.

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

Uwaga: jeśli nie chcesz zajmować się uzupełnianiem, możesz również napisać w ten sposób.

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

Nie musisz pisać, completionHandlerponieważ zawiera wartość domyślną nil, sprawdź dokumentację Apple, aby uzyskać więcej szczegółów.

Nirav D
źródło
28

Jeśli chcesz otworzyć samą aplikację zamiast opuszczać aplikację, możesz zaimportować SafariServices i rozwiązać problem.

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
źródło
1
Ta metoda jest najlepszą praktyką zgodnie z wytycznymi iOS
gtrujillos
8

Wersja 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
źródło
możesz użyć wyrażenia regularnego z replacingOccurrences.
Sulthan
2

Używam macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 i oto, co zadziałało w 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
źródło
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
źródło