как открыть URL в Swift3

149

openURLустарела в Swift3. Кто-нибудь может привести несколько примеров того, как замена openURL:options:completionHandler:работает при попытке открыть URL-адрес?

Шейн О'Сиснайн
источник

Ответы:

385

Все, что тебе нужно:

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)
}
Девран Космо Уенал
источник
Что делать, если я использую оператор «+» в моем URL? Например: « xxxxx.com./… » вот так. Эта строка выдала мне ошибку «Нет», кандидаты создают ожидаемый контекстный тип результата «URL»
Ибрагим БОЛАТ,
Вы должны использовать оператор + Stringвместо своегоURL
Devran Cosmo Uenal
Примечание: не пытайтесь сделать это: UIApplication.shared.openURL (URL (строка: «вставить URL здесь»)!). Компилятор в XCode 8 запутается и не сможет правильно собрать. Так что просто используйте это решение как есть. Прекрасно работает! Спасибо.
Джоэл
Как мне открыть URL, не открывая Safari? Как мне получить URL, чтобы «открыть» в фоновом режиме? Пожалуйста, ответьте на мой вопрос по адресу: stackoverflow.com/questions/43686252/… .
Кристиан Крейтер
1
Вы имеете в виду, что Swift не заставляет вас лазить по стенам, чтобы делать что-то настолько сложное, как открытие URL? [Челюсть отвисла]
Даниэль Спрингер
36

Выше ответ правильный, но если вы хотите проверить вас canOpenUrlили нет, попробуйте так.

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

Примечание: если вы не хотите обрабатывать завершение, вы также можете написать так.

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

Не нужно писать, так completionHandlerкак он содержит значение по умолчанию nil, проверьте документацию Apple для более подробной информации.

Нирав Д
источник
28

Если вы хотите открыть внутри самого приложения, а не выходить из приложения, вы можете импортировать SafariServices и решить его.

import UIKit
import SafariServices

let url = URL(string: "https://www.google.com")
let vc = SFSafariViewController(url: url!)
present(vc, animated: true, completion: nil)
Четан Раджагири
источник
1
Этот метод является лучшей практикой в ​​соответствии с руководящими принципами iOS
gtrujillos
8

Версия 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)
    }
}
Demosthese
источник
Вы можете использовать регулярное выражение с replacingOccurrences.
Sulthan
2

Я использую macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1, и вот что мне помогло в ViewController.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)
Салман Хан
источник