Cách mở URL trong Swift3


149

openURLđã bị phản đối trong Swift3. Bất cứ ai cũng có thể cung cấp một số ví dụ về cách openURL:options:completionHandler:hoạt động của sự thay thế khi cố gắng mở một url?

Câu trả lời:


385

Tất cả bạn cần là:

guard let url = URL(string: "http://www.google.com") else {
  return //be safe
}

if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}

Nếu tôi sử dụng toán tử '+' trong url thì sao? Ví dụ: " xxxxx.com./ " như thế này. Chuỗi đó đã cho tôi một lỗi "Không '+' ứng viên tạo ra loại kết quả theo ngữ cảnh dự kiến ​​'URL"
Ibrahim BOLAT

thay vào đó, bạn phải sử dụng toán tử + StringtrênURL
Devran Cosmo Uenal

Lưu ý bên lề: đừng cố gắng làm điều này: UIApplication. Shared.openURL (URL (chuỗi: "chèn url ở đây")!). Trình biên dịch trên XCode 8 sẽ bị lẫn lộn và không thể xây dựng đúng. Vì vậy, chỉ cần sử dụng giải pháp này là được. Hoạt động tuyệt vời! Cảm ơn.
Joel

Làm cách nào để mở url mà không thực sự mở Safari? Làm cách nào để có được url để "mở" trong nền? Vui lòng trả lời câu hỏi của tôi tại: stackoverflow.com/questions/43686252/ .
Christian Kreiter

1
Ý bạn là Swift không bắt bạn trèo tường để làm điều gì đó phức tạp như mở URL? [hàm rớt xuống]
Daniel Springer

36

Câu trả lời trên là chính xác nhưng nếu bạn muốn kiểm tra bạn canOpenUrlhay không thử như thế này.

let url = URL(string: "http://www.facebook.com")!
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    //If you want handle the completion block than 
    UIApplication.shared.open(url, options: [:], completionHandler: { (success) in
         print("Open url : \(success)")
    })
}

Lưu ý: Nếu bạn không muốn xử lý hoàn thành, bạn cũng có thể viết như thế này.

UIApplication.shared.open(url, options: [:])

Không cần phải viết completionHandlervì nó chứa giá trị mặc định nil, kiểm tra tài liệu apple để biết thêm chi tiết.


28

Nếu bạn muốn mở bên trong ứng dụng thay vì rời khỏi ứng dụng, bạn có thể nhập SafariService và giải quyết nó.

import UIKit
import SafariServices

let url = URL(string: "https://www.google.com")
let vc = SFSafariViewController(url: url!)
present(vc, animated: true, completion: nil)

1
Phương pháp này là cách thực hành tốt nhất theo hướng dẫn của iOS
gtrujillos

8

Phiên bản Swift 3

import UIKit

protocol PhoneCalling {
    func call(phoneNumber: String)
}

extension PhoneCalling {
    func call(phoneNumber: String) {
        let cleanNumber = phoneNumber.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
        guard let number = URL(string: "telprompt://" + cleanNumber) else { return }

        UIApplication.shared.open(number, options: [:], completionHandler: nil)
    }
}

bạn có thể sử dụng một biểu thức thông thường với replacingOccurrences.
Sulthan

2

Tôi đang sử dụng macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 và đây là những gì đã làm việc với tôi trong ViewContoder.swift:

//
//  ViewController.swift
//  UIWebViewExample
//
//  Created by Scott Maretick on 1/2/17.
//  Copyright © 2017 Scott Maretick. All rights reserved.
//

import UIKit
import WebKit

class ViewController: UIViewController {

    //added this code
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Your webView code goes here
        let url = URL(string: "https://www.google.com")
        if UIApplication.shared.canOpenURL(url!) {
            UIApplication.shared.open(url!, options: [:], completionHandler: nil)
            //If you want handle the completion block than
            UIApplication.shared.open(url!, options: [:], completionHandler: { (success) in
                print("Open url : \(success)")
            })
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


};

2
import UIKit 
import SafariServices 

let url = URL(string: "https://sprotechs.com")
let vc = SFSafariViewController(url: url!) 
present(vc, animated: true, completion: nil)
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.