У меня есть универсальная ссылка iOS, ориентированная на myApp
. Когда я нажимаю эту ссылку в другом приложении, myApp
открывается и отлично отображает правильный выигрыш, он работает.
Но myApp
включает встроенный браузер с использованием WKWebView
. Когда я нажимаю одну и ту же универсальную ссылку из встроенного браузера, iOS не отправляет ссылку на myApp
, она отправляет и выбирает веб-страницу.
Apple docs говорят
Если вы создаете экземпляр объекта SFSafariViewController, WKWebView или UIWebView для обработки универсальной ссылки, iOS открывает ваш сайт в Safari вместо открытия вашего приложения. Однако, если пользователь удаляет универсальную ссылку внутри встроенного объекта SFSafariViewController, WKWebView или UIWebView, iOS открывает ваше приложение.
Я отмечаю этот аналогичный вопрос, где было предложено определить делегата WKWebView
. У меня есть оба делегата WKWebView
, определенные и используемые в myApp
, и это не помогает. Этот другой вопрос имеет много вариантов, но ответов нет.
My WKWebView
может фактически открыть универсальные ссылки для других приложений. Если я нажму ссылку https://open.spotify.com/artist/3hv9jJF3adDNsBSIQDqcjp в пределах myApp
WKWebView
, тогда он откроет приложение для замещения без открытия какой-либо промежуточной веб-страницы (даже хотя меню с длинным нажатием в myApp
не предлагает "открыть в spotify" ). Но iOS не будет предоставлять универсальную ссылку на myApp
, когда я нажму на нее из myApp
.
После долгих испытаний я обнаружил, что я могу предотвратить отображение веб-страницы, связанной с универсальной ссылкой, путем поиска конкретного URL-адреса и отмены отображения:
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let urlString = navigationResponse.response.URL?.absoluteString {
if urlString.hasPrefix(myULPrefix) { // it a universal link targetted at myApp
decisionHandler(.Cancel)
return
}
}
decisionHandler(.Allow)
}
Я должен сделать это в обработчике решения для ответа, а не в действии. Когда я это сделаю, универсальная ссылка поставлена в очередь для доставки до myApp
. НО это фактически не доставляется iOS, пока я не покину свое приложение (например, нажав кнопку "домой" ) и перезапустив его. Функция appDelegate
, указанная в качестве доставки этого сообщения в документах Apple, упомянутых выше
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {}
не вызывается. Он вызывается, когда я делаю более обычный deeplink - щелкнув универсальную ссылку в Safari, чтобы открыть myApp
.
Это ошибка? Или особенность? Или я, как обычно, просто лаем неправильное дерево?
Спасибо!