Tautan Buka Swift di Safari


150

Saat ini saya membuka tautan di aplikasi saya di WebView, tetapi saya mencari opsi untuk membuka tautan di Safari .

Jawaban:


348

Ini bukan "dipanggang untuk Swift", tetapi Anda dapat menggunakan UIKitmetode standar untuk melakukannya. Lihatlah aplikasi UIA (usang) dan .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 dan lebih tinggi)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

Swift 3 (iOS 9 dan di bawah)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

Cepat 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    

Apakah ada peluang dari app store jika kami menambahkan beberapa URL pembelian seperti ini?
Jan

8
Di iOS 10.0 Anda sekarang harus menambahkan opsi dan penangan: UIApplication.shared.open (URL (string: " google.com" ) !, opsi: [:], completionHandler: nil)
gabicuesta

1
@ gabicuesta Anda sebenarnya tidak harus memberikan opsi dan penyelesaianHandler, mereka default ke [:] dan nihil, masing
Jeremy

79

Baru dengan iOS 9 dan lebih tinggi, Anda dapat menyajikannya kepada pengguna SFSafariViewController(lihat dokumentasi di sini ). Pada dasarnya Anda mendapatkan semua manfaat mengirim pengguna ke Safari tanpa membuat mereka meninggalkan aplikasi Anda. Untuk menggunakan SFSafariViewController baru, cukup:

import SafariServices

dan di suatu tempat di pengendali acara menyajikan pengguna dengan pengendali tampilan safari seperti ini:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

Tampilan safari akan terlihat seperti ini:

masukkan deskripsi gambar di sini


3
Ini luar biasa. Terima kasih! Setiap orang yang ingin menampilkan browser Safari dalam ekstensi aplikasi harus menggunakan kode ini. Mengakses sharedApplicationproperti dalam ekstensi aplikasi dilarang. Untuk lebih lanjut: developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
solusi luar biasa
Mutawe

1
Apple terkadang menolak aplikasi dari toko karena menggunakan metode openURL lama. Ini sekarang harus menjadi solusi yang lebih disukai.
disconnectionist

19

DIPERBARUI untuk Swift 4: (kredit ke Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

ATAU gunakan gaya swift lainnya menggunakan guard:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Anda dapat memeriksa NSURL sebagai opsional secara implisit dengan:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}

4
Amit, Tidak, karena ini dilakukan secara eksplisit seperti yang saya jelaskan, ini adalah jaminan bahwa requestUrl ada jika biarkan requestUrl = ...
CodeOverRide

2
ya, ada banyak cara untuk melakukan sesuatu. Pelajari alasan mengapa Anda harus menggunakan kode tertentu dalam situasi alih-alih menjadi anak nakal yang keras kepala yang mengatakan, "Saya benar, karena itu Anda salah" mentalitas. Sepertinya Anda baru mengenal pemrograman ini, saran saya kepada Anda, nak.
CodeOverRide

3
Amit: Tidak, itu tidak berhasil, Anda salah besar. Dalam Swift 2 atau 1.2. Dan tidak heran, requestUrl bukan merupakan pilihan sehingga Anda tidak dapat membukanya dengan!
Gusutafu

2
Saya suka metode ini lebih baik daripada yang dari Mike S, karena Anda melakukan nihil cek sebelum mengirim permintaan.
Nikolaj Nielsen

1
diperbarui untuk Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

Swift 3 & iOS 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

Swift 3 & iOS 10.2


Tetapi perhatikan bahwa menggunakan versi ini akan menghentikan aplikasi Anda berjalan di iOS 9 dan sebelumnya kecuali versi Anda memeriksanya
CupawnTae

11

sejak iOS 10 Anda harus menggunakan:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}


2

Dalam Swift 1.2:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}

1

Dalam Swift 2.0:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)

-1

IOS 11.2 Swift 3.1- 4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.