Швидке відкрите посилання в Safari


150

На даний момент я відкриваю посилання в моєму додатку в WebView, але шукаю можливість відкрити посилання замість цього в Safari .

Відповіді:


348

Це не "запекло в Свіфті", але ви можете використовувати стандартні UIKitметоди для цього. Погляньте на (застарілі) та .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)    

Чи є шанс у магазину додатків, якщо ми додамо таку URL-адресу покупки, як ця?
січня

8
Тепер у iOS 10.0 потрібно додати параметри та обробник: UIApplication.shared.open (URL (рядок: " google.com" ) !, параметри: [:], завершенняHandler: nil)
gabicuesta

1
@gabicuesta Ви фактично не повинні надавати варіанти та завершенняHandler, вони за замовчуванням знаходяться відповідно: [:] та nil
Джеремі

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/…
Баран Емре

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
Дозвольте, ні, оскільки це робиться явно, як я пояснив, це гарантія, що requestUrl існує, якщо дозволити requestUrl = ...
CodeOverRide

2
так, є багато способів зробити щось. Дізнайтеся причину, чому ви повинні використовувати певний код у ситуації, а не впертий хлопець, кажучи: "Я правий, отже, ваш неправильний" менталітет. Здається, ви новачок у програмуванні, це моя порада, маля.
CodeOverRide

3
Аміт: Ні, це не працює, ви просто помиляєтесь. У Swift 2 або 1.2. І недарма, requestUrl не є необов’язковим, тому ви не зможете його розгортати!
Гусутафу

2
Мені подобається цей спосіб краще, ніж той, який отримує Майк S, тому що ви робите нульову перевірку перед відправкою запиту.
Микола Нільсен

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

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


2

У Swift 1.2:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().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)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.