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 .

Fabian Boulegue
sumber

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)    
Mike S
sumber
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

manncito
sumber
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)
}
CodeOverRide
sumber
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

ramchandra n
sumber
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)
}
Samira Ekrami
sumber
10

Cepat 5

Swift 5: Periksa canOpneURLapakah valid maka terbuka.

guard let url = URL(string: "https://iosdevcenters.blogspot.com/") else {
     return
}

if UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Kirit Modi
sumber
2

Dalam Swift 1.2:

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

Dalam Swift 2.0:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)
Kaptain
sumber
-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)
    }
}
guevara lopez
sumber