Liên kết mở Swift trong Safari


150

Tôi hiện đang mở liên kết trong ứng dụng của mình WebView, nhưng tôi đang tìm một tùy chọn để mở liên kết trong Safari thay thế.

Câu trả lời:


348

Nó không phải là "nướng vào Swift", nhưng bạn có thể sử dụng các UIKitphương pháp tiêu chuẩn để làm điều đó. Hãy xem UIApplication's (không dùng nữa) và .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 trở lên)

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

Swift 3 (iOS 9 trở xuống)

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)    

Có bất kỳ cơ hội nào từ cửa hàng ứng dụng nếu chúng tôi thêm một số URL mua hàng như thế này không?
1,

8
Trong iOS 10.0, bây giờ bạn phải thêm tùy chọn và trình xử lý: UIApplication. Shared.open (URL (chuỗi: " google.com" )!, Tùy chọn: [:],
xongHandler

1
@gabicuesta Bạn thực sự không phải cung cấp tùy chọn và hoàn thành Trình quản lý, họ mặc định là [:] và nil, tương ứng
Jeremy

79

Mới với iOS 9 trở lên, bạn có thể trình bày cho người dùng SFSafariViewController(xem tài liệu tại đây ). Về cơ bản, bạn nhận được tất cả các lợi ích của việc gửi người dùng đến Safari mà không khiến họ rời khỏi ứng dụng của bạn. Để sử dụng SFSafariViewControll mới, chỉ cần:

import SafariServices

và một nơi nào đó trong trình xử lý sự kiện trình bày cho người dùng trình điều khiển khung nhìn safari như thế này:

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

Khung nhìn safari sẽ trông giống như thế này:

nhập mô tả hình ảnh ở đây


3
Điều này thật tuyệt. Cảm ơn! Mọi người muốn hiển thị trình duyệt Safari trong tiện ích mở rộng ứng dụng nên sử dụng mã này. Truy cập sharedApplicationtài sản trong phần mở rộng ứng dụng bị cấm. Để biết thêm: developer.apple.com/l
Baran Emre

1
giải pháp nổi bật
Mutawe

1
Apple đôi khi từ chối các ứng dụng từ cửa hàng để sử dụng phương thức openURL cũ. Điều này bây giờ nên là giải pháp ưa thích.
ngắt kết nối

19

CẬP NHẬT cho Swift 4: (ghi có vào Marco Weber)

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

HOẶC đi với nhiều phong cách nhanh hơn bằng cách sử dụng guard :

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

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Bạn có thể kiểm tra NSURL dưới dạng tùy chọn ngầm định bằng cách:

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

4
Amit, Không, bởi vì nó được thực hiện rõ ràng như tôi đã giải thích, đảm bảo rằng requestUrl tồn tại nếu let requestUrl = ...
CodeOverRide

2
vâng, có nhiều cách để làm việc Tìm hiểu lý do tại sao bạn nên sử dụng một số mã nhất định trong một tình huống thay vì là một đứa trẻ bướng bỉnh nói rằng "Tôi đúng, do đó bạn sai". Có vẻ như bạn là người mới lập trình, đây là lời khuyên của tôi cho bạn nhóc.
CodeOverRide

3
Amit: Không, nó không hoạt động, bạn đơn giản là sai. Trong Swift 2 hoặc 1.2. Và không có gì lạ, requestUrl không phải là một tùy chọn để bạn không thể mở khóa với!
Gusutafu

2
Tôi thích phương pháp này tốt hơn phương pháp từ Mike S, vì bạn thực hiện kiểm tra trước khi gửi yêu cầu.
Nikolaj Nielsen

1
được cập nhật cho 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


Nhưng lưu ý rằng việc sử dụng phiên bản này sẽ khiến ứng dụng của bạn chạy trên iOS 9 và trước đó trừ khi bạn kiểm tra phiên bản đó
CupawnTae

11

kể từ iOS 10, bạn nên sử dụng:

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

Trong Swift 1.2:

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

1

Trong 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)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.