Запуск телефона / электронной почты / ссылок на карту в WKWebView

KINWebBrowser – это модуль веб-браузера с открытым исходным кодом для приложений iOS. Недавно я обновил KINWebBrowser, чтобы использовать WKWebView для начала поэтапного отказа от UIWebView. Это дает значительные улучшения, но:

Проблема: WKWebView не позволяет пользователям запускать ссылки, содержащие URL-адреса для телефонных номеров, адресов электронной почты, карт и т. Д.

Как настроить WKWebView для запуска стандартного поведения iOS для этих альтернативных URL-адресов при запуске в качестве ссылок с отображаемой страницы?

Весь код доступен здесь.

Дополнительная информация о WKWebKit

См. Вопрос о KINWebBrowser GitHub здесь

Мне удалось заставить его работать на ссылку Google Maps (которая, как представляется, связана с целевым = «_ пустым»), и для схемы tel: добавив эту функцию в ваш KINWebBrowserViewController.m

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { if(webView != self.wkWebView) { decisionHandler(WKNavigationActionPolicyAllow); return; } UIApplication *app = [UIApplication sharedApplication]; NSURL *url = navigationAction.request.URL; if (!navigationAction.targetFrame) { if ([app canOpenURL:url]) { [app openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } if ([url.scheme isEqualToString:@"tel"]) { if ([app canOpenURL:url]) { [app openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow); } 

Вам необходимо выполнить другой обратный вызов, чтобы получить это право (Swift 3.1):

 // Gets called if webView cant handle URL func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { guard let failingUrlStr = (error as NSError).userInfo["NSErrorFailingURLStringKey"] as? String else { return } let failingUrl = URL(string: failingUrlStr)! switch failingUrl { // Needed to open Facebook case _ where failingUrlStr.startsWith("fb:"): if #available(iOS 10.0, *) { UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil) return } // Else: Do nothing, iOS 9 and earlier will handle this // Needed to open Mail-app case _ where failingUrlStr.startsWith("mailto:"): if UIApplication.shared.canOpenURL(failingUrl) { UIApplication.shared.openURL(failingUrl) return } // Needed to open Appstore-App case _ where failingUrlStr.startsWith("itmss://itunes.apple.com/"): if UIApplication.shared.canOpenURL(failingUrl) { UIApplication.shared.openURL(failingUrl) return } default: break } } 

Теперь Facebook, Mail, Appstore, .. получают вызов непосредственно из вашего приложения без необходимости открытия Safari

Это помогает мне для Xcode 8 WKWebview

 func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame == nil { let url = navigationAction.request.url if url?.description.range(of: "http://") != nil || url?.description.range(of: "https://") != nil || url?.description.range(of: "mailto:") != nil || url?.description.range(of: "tel:") != nil { UIApplication.shared.openURL(url!) } } return nil } 

Редакция:

В ссылке должен быть атрибут target="_blank" .

Работает на xcode 8.1, Swift 2.3.

Для цели = "_ пустой", номер телефона (tel 🙂 и адрес электронной почты (mailto :).

 func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { if webView != self.webview { decisionHandler(.Allow) return } let app = UIApplication.sharedApplication() if let url = navigationAction.request.URL { // Handle target="_blank" if navigationAction.targetFrame == nil { if app.canOpenURL(url) { app.openURL(url) decisionHandler(.Cancel) return } } // Handle phone and email links if url.scheme == "tel" || url.scheme == "mailto" { if app.canOpenURL(url) { app.openURL(url) decisionHandler(.Cancel) return } } decisionHandler(.Allow) } } 

Выше ответные работы для меня, но мне нужно было переписать для быстрого 2.3

 if navigationAction.targetFrame == nil { let url = navigationAction.request.mainDocumentURL if url?.description.rangeOfString("mailto:")?.startIndex != nil || url?.description.rangeOfString("tel:")?.startIndex != nil { if #available(iOS 10, *) { UIApplication.sharedApplication().openURL(url!,options: [:], completionHandler: nil) } else { UIApplication.sharedApplication().openURL(url!) // deprecated } } } 
  • Аутентификация с помощью WKWebView в Swift
  • Поддержка Xcode 9 GM - WKWebView NSCoding была нарушена в предыдущих версиях
  • WKWebView Cookies
  • WKWebView не отображает веб-страницу, даже если она заканчивает загрузку
  • Варианты представления веб-сайта, когда веб-сайт / приложение поддерживает универсальные ссылки в iOS 9
  • Swift 3 WKWebView 'URLRequest'; вы хотели использовать «как» для явного преобразования? (BUG)
  • Совместное использование файлов cookie между несколькими WKWebViews
  • даже базовый ионный проект с плагином Cordova WKWebview Engine создает белый экран
  • После деинсталляции webView видео, встроенное в webView, все еще играет - iOS
  • Тактика для ускорения WKWebView рендеринга loadHTMLString-d контента?
  • Получить пользовательский агент по умолчанию для системы iOS для HTTP-запросов
  • Interesting Posts

    iOS swift NumberFormatter десятичная стилизация

    Правильная реализация родительского / дочернего NSManagedObjectContext

    UIRefreshControl, добавленный в UIScrollView, никогда не отображается

    (iOS) Как анимировать закругленный прямоугольник с помощью shapeLayer?

    Сообщение об ошибке «Нет действия» было обнаружено при использовании SOAP webservice

    Использование метода object_invoke Objective-C для вызова метода void в ARC

    iOS 9 «Сохранить PDF в iBooks» с помощью HTML

    Каков наилучший способ интеграции Twitter в приложение iOS?

    Передайте одну переменную из одного диспетчера представлений в другой диспетчер представлений

    Каковы преимущества использования раскадровки вместо xib-файлов в iOS-программировании?

    Кодек G729, скомпилированный для iOS arm64, не работает должным образом

    Как сделать пакет активов iOS?

    Можно ли наследовать от основного класса в Objective-C (Xcode / iOS)?

    Использование Spotify / фоновой музыки с открытой камерой

    Как определить изменение ориентации?

    Давайте будем гением компьютера.