Safari'de Hızlı Açık Bağlantı


156

Şu anda uygulamamdaki bağlantıyı bir uygulamasında açıyorum WebView, ancak bunun yerine bağlantıyı Safari'de açma seçeneği arıyorum .

Yanıtlar:


362

"Swift'e dahil edildi" değil, ancak bunu UIKityapmak için standart yöntemleri kullanabilirsiniz . UIApplication (kullanımdan kaldırıldı) ve .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 ve üzeri)

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

Swift 3 (iOS 9 ve altı)

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

Swift 2.2

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

Bunun gibi bazı satın alma URL'leri eklersek, uygulama mağazasından herhangi bir şans var mı?
Jan

9
İOS 10.0'da şimdi seçenekler ve işleyici eklemelisiniz: UIApplication.shared.open (URL (string: " google.com" ) !, options: [:],
completeHandler

1
@gabicuesta Aslında seçenekler ve tamamlama sağlamak zorunda değilsinizHandler, varsayılan olarak sırasıyla [:] ve nil'dir
Jeremy

81

İOS 9 ve sonraki sürümlerde yeni olarak kullanıcıya sunabilirsiniz SFSafariViewController( buradaki belgelere bakın ). Temel olarak, kullanıcıyı uygulamanızdan ayrılmadan Safari'ye göndermenin tüm avantajlarından yararlanabilirsiniz. Yeni SFSafariViewController'ı kullanmak için sadece:

import SafariServices

ve bir olay işleyicisinin herhangi bir yerinde, kullanıcıya aşağıdaki gibi safari görüntüleme denetleyicisi sunun:

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

Safari manzarası şöyle görünecek:

görüntü açıklamasını buraya girin


3
Bu harika. Teşekkürler! Safari tarayıcısını bir uygulama uzantısında göstermek isteyen herkes bu kodu kullanmalıdır. sharedApplicationUygulama uzantısında mülke erişim yasaktır. Daha fazlası için: developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
olağanüstü çözüm
Mutawe

2
Apple bazen eski openURL yöntemini kullandığı için mağazadaki uygulamaları reddediyor. Bu şimdi tercih edilen çözüm olmalıdır.
disconnectionist

20

Swift 4 için GÜNCELLENDİ: (Marco Weber'e kredi)

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

VEYA guardşunları kullanarak daha hızlı stille gidin :

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

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

NSURL'yi isteğe bağlı olarak dolaylı olarak şu şekilde kontrol edebilirsiniz:

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

4
Amit, Hayır, açık bir şekilde yapıldığından, açıkladığım gibi, let requestUrl = ...
CodeOverRide

2
evet, bir şeyler yapmanın birçok yolu var. İnatçı bir velet olmak yerine, bir durumda neden belirli bir kodu kullanmanız gerektiğini öğrenin, "Haklıyım, öyleyse yanlışsınız" zihniyet. Görünüşe göre programlama konusunda yenisin, bu benim sana tavsiyem evlat.
CodeOverRide

3
Amit: Hayır, işe yaramıyor, sadece yanılıyorsun. Swift 2 veya 1.2'de. Ve şaşılacak bir şey yok, requestUrl isteğe bağlı değildir, bu yüzden!.
Gusutafu

2
Bu yöntemi Mike S'den daha çok seviyorum çünkü isteği göndermeden önce sıfır kontrolü yapıyorsunuz.
Nikolaj Nielsen

1
Swift4 için güncellendi:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

Swift 3 ve IOS 10.2

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

Swift 3 ve IOS 10.2


Ancak, sürümünü kontrol etmediğiniz sürece bu sürümü kullanmanın uygulamanızın iOS 9 ve önceki sürümlerde çalışmasını durduracağını unutmayın
CupawnTae

11

iOS 10'dan beri kullanmalısınız:

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

Swift 1.2'de:

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

1

Swift 2.0'da:

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

0

Swift 5

if let url = URL(string: "https://www.google.com") {
    UIApplication.shared.open(url)
}

-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)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.