wkwebview仍然不处理通用链接

问题描述 投票:11回答:2

我有针对myApp的IOS通用链接。当我点击另一个应用程序,链接,myApp打开并完全显示正确的回报,它的工作。

myApp包括一个内置的浏览器采用WKWebView。当我点击从我的内置浏览器中相同的通用连接,iOS不将链接发送给myApp,它会并获取一个网页。

Apple docs

如果你实例化一个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

这是一个错误?或功能?或者,我像往常一样,只是找错了树?

谢谢!

ios wkwebview ios-universal-links
2个回答
1
投票

这将是行为,如果你wkwebview WEP网页域名与您的通用连接域的名称。在拍摄,如果网页在Safari中,SFSafariVC,WKWebView或UIWebView中开启了域与您的应用程序的应用程序链接也不会tirgger通用链接(通用链接)域,


0
投票

我决定用我下面的雨燕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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.