我有针对myApp
的IOS通用链接。当我点击另一个应用程序,链接,myApp
打开并完全显示正确的回报,它的工作。
但myApp
包括一个内置的浏览器采用WKWebView
。当我点击从我的内置浏览器中相同的通用连接,iOS不将链接发送给myApp
,它会并获取一个网页。
如果你实例化一个SFSafariViewController,WKWebView,或UIWebView的对象来处理通用的链接,打开的iOS Safari浏览器中的网站,而不是使用您的应用。但是,如果用户点击一个嵌入式SFSafariViewController,WKWebView,或UIWebView的对象内的通用连接,iOS版开启应用程式。
我注意到这个similar question其中的建议是定义WKWebView
委托。我有两个WKWebView
代表定义,并在myApp
使用,并且它没有帮助。这other question有许多upvotes,但没有答案。
我WKWebView
其实可以打开通用链接到其他应用程序。如果我从https://open.spotify.com/artist/3hv9jJF3adDNsBSIQDqcjp myApp
内点击链接WKWebView
然后打开Spotify应用,而无需打开任何网页的中间(即使在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's a universal link targetted at myApp
decisionHandler(.Cancel)
return
}
}
decisionHandler(.Allow)
}
我不得不这样做在了回应,而不是一个行动的决定处理。当我做到这一点,通用链路排队等待传递到myApp
。但它不是实际的iOS,直到我离开我的应用程序(例如,通过点击home键),并重新启动它交付。指定为上面提到的苹果文档的这一信息的appDelegate
功能
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {}
不叫。当我做了更传统的深层链接时,称为 - 点击Safari浏览器中的一个普遍的链接打开myApp
。
这是一个错误?或功能?或者,我像往常一样,只是找错了树?
谢谢!
这将是行为,如果你wkwebview WEP网页域名与您的通用连接域的名称。在拍摄,如果网页在Safari中,SFSafariVC,WKWebView或UIWebView中开启了域与您的应用程序的应用程序链接也不会tirgger通用链接(通用链接)域,
我决定用我下面的雨燕4类这个问题。如果可能的话它还采用嵌入式Safari浏览器。你可以按照你的情况类似的方法了。
import UIKit
import SafariServices
class OpenLink {
static func inAnyNativeWay(url: URL, dontPreferEmbeddedBrowser: Bool = false) { // OPEN AS UNIVERSAL LINK IF EXISTS else : EMBEDDED or EXTERNAL
if #available(iOS 10.0, *) {
// Try to open with owner universal link app
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : true]) { (success) in
if !success {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
} else {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
private static func isItOkayToOpenUrlInSafariController(url: URL) -> Bool {
return url.host != nil && (url.scheme == "http" || url.scheme == "https") //url.host!.contains("twitter.com") == false
}
static func inAnyNativeBrowser(url: URL) { // EMBEDDED or EXTERNAL BROWSER
if isItOkayToOpenUrlInSafariController(url: url) {
inEmbeddedSafariController(url: url)
} else {
withRegularWay(url: url)
}
}
static func inEmbeddedSafariController(url: URL) { // EMBEDDED BROWSER ONLY
let vc = SFSafariViewController(url: url, entersReaderIfAvailable: false)
if #available(iOS 11.0, *) {
vc.dismissButtonStyle = SFSafariViewController.DismissButtonStyle.close
}
mainViewControllerReference.present(vc, animated: true)
}
static func withRegularWay(url: URL) { // EXTERNAL BROWSER ONLY
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey(rawValue: "no"):"options"]) { (good) in
if !good {
Logger.log(text: "There is no application on your device to open this link.")
}
}
} else {
UIApplication.shared.openURL(url)
}
}
}