13

我有一个针对myApp. 当我在另一个应用程序中单击该链接,myApp打开并完美显示正确的回报时,它正在工作。

myApp包括使用WKWebView. 当我从我的内置浏览器中单击相同的通用链接时,iOS 不会将链接发送到myApp,它会去获取一个网页。

苹果文档

如果您实例化 SFSafariViewController、WKWebView 或 UIWebView 对象来处理通用链接,iOS 会在 Safari 中打开您的网站,而不是打开您的应用程序。但是,如果用户点击嵌入式 SFSafariViewController、WKWebView 或 UIWebView 对象中的通用链接,iOS 会打开您的应用程序。

我注意到这个类似的问题,其中建议定义一个WKWebView代表。我在WKWebView中定义并使用了两个代表myApp,但这没有帮助。这个另一个问题有很多赞成票,但没有答案。

WKWebView实际上可以打开指向其他应用程序的通用链接。如果我从其中单击链接https://open.spotify.com/artist/3hv9jJF3adDNsBSIQDqcjpmyApp WKWebView则它会在不打开任何中间网页的情况下打开 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 交付。appDelegate在上面引用的 Apple 文档中指定为传递此消息的函数

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {}

不叫。当我做一个更传统的深度链接时调用它——单击 Safari 中的通用链接打开myApp

这是一个错误吗?还是一个特点?还是像往常一样,我只是在叫错树?

谢谢!

4

3 回答 3

1

如果您的 wkwebview wep 页面域名与您的通用链接域名相同,这将是行为。在镜头中,如果在 Safari、SFSafariVC、WKWebView 或 UIWebView 中打开的网页与您的应用程序的应用程序链接(通用链接)域具有相同的域,它将不会触发通用链接,

于 2017-07-20T06:05:20.570 回答
0

我认为 Apple 采用这种方式是因为您可以在应用程序运行时对其进行更可定制的处理。

你找到了放置你自己的处理程序调用的地方:

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)
            // put here the call to handle the link, for example:
            MyLinkHandler.handle(urlString)
            return
        }
    }
    decisionHandler(.Allow)
}

您可以在后台进行任何操作,并且用户停留在打开的页面上,或者您可以隐藏 Web 视图并打开应用程序的另一部分以显示适当的内容。

于 2021-01-18T12:25:26.603 回答
-1

我用下面的 Swift 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)
        }
    }
}
于 2018-10-12T08:22:18.230 回答