我有一个指向myApp
的iOS通用链接。当我在另一个应用程序中点击该链接时,myApp
会打开并完美地显示正确的回报,一切都正常。
但是myApp
包括一个使用WKWebView
的内置浏览器。当我从自己的内置浏览器中点击相同的通用链接时,iOS不会将链接发送到myApp
,而是会获取一个网页。
Apple文档说:
如果您实例化了SFSafariViewController、WKWebView或UIWebView对象来处理通用链接,则 iOS 会在 Safari 中打开您的网站,而不是打开您的应用。然而,如果用户在嵌入的SFSafariViewController、WKWebView或UIWebView对象中点击了通用链接,则 iOS 会打开您的应用。
我注意到这个类似的问题,其中建议定义一个WKWebView
委托。我在myApp
中已经定义并使用了两个WKWebView
委托,但没有帮助。这个其他问题有很多赞,但没有答案。
我的WKWebView
实际上可以打开指向其他应用的通用链接。如果我在myApp
WKWebView
中点击链接https://open.spotify.com/artist/3hv9jJF3adDNsBSIQDqcjp,那么它会打开Spotify应用程序,而不打开任何中间的网页(即使在myApp
中的长按菜单中没有提供“在Spotify中打开”选项)。但是当我从myApp
中点击它时,iOS不会将通用链接传递给myApp
。
经过大量测试,我发现可以通过查找特定的URL并取消显示来防止与通用链接相关联的网页的显示:
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let urlString = navigationResponse.response.URL?.absoluteString {
if urlString.hasPrefix(myULPrefix) { // it's a universal link targetted at myApp
decisionHandler(.Cancel)
return
}
}
decisionHandler(.Allow)
}
我需要在响应的决策处理程序中执行此操作,而不是在动作的处理程序中执行。当我这样做时,通用链接将被排队等待发送至myApp
。 但是,只有当我退出我的应用程序(例如,按下主页按钮)并重新启动时,iOS才会实际传递该消息。Apple文档中提到的appDelegate
函数指定了传递此消息的内容。
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {}
当我不使用更常规的深度链接(在Safari中点击通用链接以打开myApp
)时,它没有被调用。这个函数是否有漏洞?还是一个特性?或者像往常一样,我只是在胡言乱语?
谢谢!