Swift Open Link в Safari


150

В настоящее время я открываю ссылку в своем приложении в WebView, но я ищу вариант, чтобы открыть ссылку в 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)

Swift 2.2

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

Есть ли шанс из магазина приложений, если мы добавим какой-нибудь URL-адрес для покупки?
января

8
В iOS 10.0 теперь необходимо добавить параметры и обработчик: UIApplication.shared.open (URL (строка: " google.com" ) !, параметры: [:], завершение: ноль)
gabicuesta

1
@gabicuesta На самом деле вам не нужно указывать параметры и завершениеHandler, они по умолчанию
Джереми

79

Новый с iOS 9 и выше, вы можете предоставить пользователю SFSafariViewController(см. Документацию здесь ). По сути, вы получаете все преимущества отправки пользователя в Safari, не заставляя его покидать ваше приложение. Чтобы использовать новый SFSafariViewController просто:

import SafariServices

и где-то в обработчике событий представляет пользователю контроллер представления Safari, например:

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

Представление сафари будет выглядеть примерно так:

введите описание изображения здесь


3
Это круто. Спасибо! Каждый, кто хочет показать браузер Safari в расширении приложения, должен использовать этот код. Доступ к sharedApplicationсвойству в расширении приложения запрещен. Для получения дополнительной информации: developer.apple.com/library/archive/documentation/General/…
Баран Эмре,

1
выдающееся решение
Mutawe

1
Apple иногда отклоняет приложения из магазина за использование старого метода openURL. Теперь это должно быть предпочтительным решением.
отключение

19

ОБНОВЛЕНО для Swift 4: (кредит Марко Веберу)

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, нет, потому что это сделано явно, как я уже объяснил, это гарантия существования
requestUrl,

2
да, есть много способов сделать вещи. Узнайте причину, по которой вы должны использовать определенный код в ситуации, а не быть упрямым парнем, который говорит: «Я прав, поэтому вы ошибаетесь». Похоже, вы новичок в программировании, это мой совет для вас, малыш.
CodeOverRide

3
Амит: Нет, это не работает, ты просто неправ. В Swift 2 или 1.2. И неудивительно, что requestUrl не является обязательным, поэтому вы не можете развернуть его!
Гусутафу

2
Мне нравится этот метод лучше, чем у Mike S, потому что вы делаете нулевую проверку перед отправкой запроса.
Николай Нильсен

1
обновлено для Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Марко Вебер

12

Свифт 3 и IOS 10.2

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

Свифт 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)
}


2

В Swift 1.2:

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

1

В 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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.