【问题标题】:Open certain links in external browser using Nativescript使用 Nativescript 在外部浏览器中打开某些链接
【发布时间】:2019-03-06 21:11:21
【问题描述】:

我正在开发一个用 Nativescript 编写的简单应用程序。

该应用有一个登录表单,该表单通过 API 进行身份验证,并在成功时加载一个 web 视图。所以没那么复杂。

但我希望能够在手机的默认浏览器中打开某些链接,而不是在 web 视图中打开,例如指向外部网站的链接。

是否可以“捕获”所有链接点击,如果链接的目标属性设置为空白,我们让链接在外部浏览器中打开?

我需要一个适用于 iOS 和 Android 的解决方案。

这可以在 Nativescript 中实现吗?

【问题讨论】:

    标签: nativescript


    【解决方案1】:

    是的,可以在 NativeScript 中执行此操作,但不能使用默认的 WebView 组件。我正是在这种情况下,我所做的是编写一个插件,在 NativeScript 中自定义默认 WebView 以覆盖 iOS webview 中的默认 WKUIDelegate 和 Android 的同上。 对于 iOS,WKUIDelegate 允许检测是否有任何尝试使用方法 webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures 打开与目标 _blank 的链接,因此,当使用此委托实现自定义 web 视图时,允许根据需要在外部浏览器/应用程序中打开链接。

    看看这个插件:https://github.com/Notalib/nativescript-webview-ext 了解如何自定义默认 webview。

    【讨论】:

    • 感谢您提供的信息。经过一些阅读和测试(我刚刚开始使用 Nativescript 和 Typescript,之前只使用过 PHP 和 Javascript),我运行了 webview。您能否详细说明我如何检测链接的目标属性?另外:在我的第一个测试应用程序中,我使用 nativescript-webview-utils 为 webview 设置标题,因此我可以发送从 API 接收的令牌。是否可以使用 ext 设置标题 / 设置 cookie / 将 utils 与 ext 一起使用?
    • 基本上,我所做的是创建自己的插件来替换实现 2 委托 WKNavigationDelegate 和 WKUIDelegate 的 NativeScript 的默认 WebView 组件。使用 WKNavigationDelegate,您可以在 WebView 中捕获任何请求并使用方法webViewDecidePolicyForNavigationActionDecisionHandler 附加额外的标头/cookie。检查这个插件:github.com/EddyVerbruggen/nativescript-webview-utils。所以我创建了我自己的插件 WebView,它是 nativescript-webview-utils && nativescript-webview-ext 的组合
    • 检测链接的target属性,如果覆盖iOS WKWebview的WKUIDelegate,可以实现webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures(webView: WKWebView, configuration: WKWebViewConfiguration, navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures)方法。如果尝试在 WebView 中打开目标为_blank 的链接,则会调用此方法,然后您可以使用包含请求 URL 的navigationAction 提取链接属性,例如navigationAction.request.URL.absoluteString
    • 我不确定我是否理解这一点,所以请多多包涵:) 1) 我只需要 webview-utils 插件来实现这一点吗? 2) 我是否使用 webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures 方法而不是 webview-ext 中的 shouldOverrideUrlLoading 方法? 3) 此方法仅适用于 iOS,是否有适用于 Android 的等效方法?这个项目可能超出了我的能力水平,但如果我能做到这一点,它将为我解决一个大问题!
    • 3) 我还没有在android上测试过,但是在android中,你可以使用shouldOverrideUrlLoading来捕获你的webview发出的任何请求。
    【解决方案2】:

    您可以使用nativescript-webview-ext插件并使用shouldOverrideUrlLoading事件检查URL并根据需要取消该过程,然后使用open url method in utility module在默认浏览器中打开给定的URL。

    【讨论】:

    • 这可以通过默认的 webview 来完成:github.com/NativeScript/NativeScript/issues/… 不过,不知道如何在 target=_blank 上做到这一点
    • 我会考虑使用stopLoading() 作为解决方法,它并不能完全阻止加载请求,而是在开始加载后停止它。 nativescript-webview-ext 实现了正确的原生 api 来处理这种情况,这就是为什么我推荐这个插件而不是默认的 web 视图。
    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2018-02-11
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多