Swift Open Link ใน Safari


คำตอบ:


348

ไม่ใช่ "อบใน Swift" แต่คุณสามารถใช้UIKitวิธีมาตรฐานเพื่อทำ ลองดูที่ UIApplication ของ(เลิกใช้)และopenUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 ขึ้นไป)

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

Swift 3 (iOS 9 และต่ำกว่า)

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

สวิฟท์ 2.2

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

มีโอกาสจาก app store ไหมถ้าเราเพิ่ม URL การซื้อแบบนี้?
ม.ค.

8
ใน iOS 10.0 ตอนนี้คุณต้องเพิ่มตัวเลือกและตัวจัดการ: UIApplication.shared.open (URL (สตริง: " google.com" ) !, ตัวเลือก: [:], ความสมบูรณ์
แฮนด์เลอร์

1
@gabicuesta คุณจริงจะได้ไม่ต้องให้ตัวเลือกและ completionHandler พวกเขาเริ่มต้นกับ [:] และศูนย์ตามลำดับ
เจเรมี

79

ใหม่กับ iOS 9 และสูงกว่าคุณสามารถนำเสนอผู้ใช้ด้วยSFSafariViewController(ดูเอกสารที่นี่ ) โดยทั่วไปคุณจะได้รับประโยชน์ทั้งหมดจากการส่งผู้ใช้ไปที่ Safari โดยไม่ทำให้พวกเขาออกจากแอปของคุณ ในการใช้ SFSafariViewController ใหม่เพียง:

import SafariServices

และบางแห่งในตัวจัดการเหตุการณ์นำเสนอผู้ใช้ด้วยตัวควบคุมมุมมองซาฟารีดังนี้:

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

มุมมองซาฟารีจะมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


3
นี่มันเจ๋งมาก. ขอบคุณ! ทุกคนที่ต้องการแสดงเบราว์เซอร์ Safari ในส่วนขยายของแอปควรใช้รหัสนี้ sharedApplicationห้ามเข้าถึงคุณสมบัติในส่วนขยายของแอป สำหรับข้อมูลเพิ่มเติม: developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
ทางออกที่โดดเด่น
Mutawe

1
บางครั้ง Apple ปฏิเสธแอปจากร้านค้าโดยใช้วิธี openURL แบบเก่า ตอนนี้ควรเป็นโซลูชันที่ต้องการ
disconnectionist

19

อัปเดตสำหรับ Swift 4: (เครดิตสำหรับ Marco Weber)

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

หรือไปกับสไตล์ที่รวดเร็วยิ่งขึ้นโดยใช้guard:

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

UIApplication.shared.openURL(requestUrl as URL) 

สวิฟท์ 3:

คุณสามารถตรวจสอบ NSURL ว่าเป็นตัวเลือกโดยปริยายโดย:

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

4
Amit, No, เพราะมันทำอย่างชัดเจนตามที่ฉันได้อธิบายไว้รับประกันว่ามี requestUrl อยู่ถ้าให้ requestUrl = ...
CodeOverRide

2
ใช่มีหลายวิธีในการทำสิ่งต่าง ๆ เรียนรู้เหตุผลว่าทำไมคุณควรใช้รหัสบางอย่างในสถานการณ์แทนที่จะเป็นคนพูดจาดื้อรั้นว่า "ฉันพูดถูก ดูเหมือนว่าคุณยังใหม่กับการเขียนโปรแกรมนี่คือคำแนะนำของฉันกับคุณเด็ก
CodeOverRide

3
Amit: ไม่ไม่ได้ผลคุณผิดปกติ ใน Swift 2 หรือ 1.2 และไม่น่าแปลกใจที่ requestUrl ไม่ใช่ทางเลือกดังนั้นคุณจึงไม่สามารถแกะด้วย!
Gusutafu

2
ฉันชอบวิธีนี้ดีกว่าของ Mike S เพราะคุณทำเช็คศูนย์ก่อนส่งคำขอ
Nikolaj Nielsen

1
อัปเดตสำหรับ 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


แต่โปรดทราบว่าการใช้เวอร์ชันนี้จะหยุดแอปของคุณที่ทำงานบน iOS 9 และรุ่นก่อนหน้าเว้นแต่ว่าคุณจะตรวจสอบเวอร์ชั่น
CupawnTae

11

ตั้งแต่ iOS 10 คุณควรใช้:

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




-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)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.