Webview 无法通过单击链接打开已安装的应用程序

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

我的项目中有一个简单的

WebView
。用户可以谷歌搜索任何东西。我现在遇到的问题是,通过单击某些链接,我会自动重定向到特定的应用程序(如果我安装了它)。

例子:

我的 iPhone 上有阿迪达斯应用程序,点击“阿迪达斯”链接 -> 我被重定向到阿迪达斯应用程序。那不应该发生。相反,链接应该在我的

WebView
.

中打开

这是我的

webView

  bool _isLoading = true;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Web View Example'),
      ),
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
              child: WebView(
                initialUrl:
                    'https://www.sneakersnstuff.com/de/product/48276/adidas-4d-futurecraft?country_override=DE&utm_content=cpcadssnscf&gclid=CjwKCAjwoduRBhA4EiwACL5RP4YhIZ818uzJTmO8gKLX3Z6Vvff740OjFsxs2nL0yzf-uGyzW9ak6RoCxyEQAvD_BwE',
                javascriptMode: JavascriptMode.unrestricted,
                onWebViewCreated: (WebViewController webViewController) {
                  _controller = webViewController;
                },
                javascriptChannels: <JavascriptChannel>{
                  _extractDataJSChannel(context),
                },
                onPageStarted: (String url) {
                  setState(() {
                    _isLoading = true;
                  });
                },
                onPageFinished: (String url) {
                  setState(() {
                    _imagesWithSize = [];

                    _currentUrl = url;
                    _isLoading = false;
                  });
                },
              ),
            ),
            Row(
              children: [
                IconButton(
                  onPressed: () {
                    _controller.goBack();
                  },
                  icon: Icon(
                    Icons.arrow_back,
                    size: 50,
                  ),
                ),
                IconButton(
                  onPressed: () {
                    _controller.goForward();
                  },
                  icon: Icon(
                    Icons.arrow_forward,
                    size: 50,
                  ),
                ),
              ],
            ),
            SizedBox(
              height: 20,
            ),
            RoundedCornersTextButton(
              title: 'Google',
              isEnabled: !_isLoading,
              onTap: () async {
                await _controller.loadUrl('https://www.google.com');
              },
            ),
          ],
        ),
      ),
    );
  }

有什么办法可以防止其他应用程序打开吗?

flutter dart webview uiwebview
2个回答
0
投票

我不认为这是 webview 的问题。

实际上有一些网站,当您打开它们时,它们会检查您是否正在使用手机,如果是这样,它们还会检查您是否已经在设备上安装了该应用程序。如果也是这样,则默认打开移动应用程序。

你能否使用谷歌搜索(在 webview 内)访问其他网站,看看是否存在相同的行为?


0
投票

我在 Aliexpress 上遇到了同样的问题。当您尝试在浏览器中打开链接时,它会检测到该应用程序并要求您“在其他应用程序中打开”。我注意到初始 URL 已更改并以“aliexpress://product/detail?...”开头。

所以,为了防止这种情况,在“onNavigationRequest”方法中,有一个 URL 的 HTTP 或 HTTPS 验证。如果更改 URL 以打开应用程序,它将被忽略。

 WebViewController controller = WebViewController()
  ..setJavaScriptMode(JavaScriptMode.unrestricted)
  ..setNavigationDelegate(
    NavigationDelegate(
      onWebResourceError: _handleError,  
      onNavigationRequest: (NavigationRequest request) {
        if (!(request.url.startsWith('https://') || request.url.startsWith('http://'))) {
          return NavigationDecision.prevent;
        }
        return NavigationDecision.navigate;
      },
    ),
  )
  ..loadRequest(Uri.parse(_url));
© www.soinside.com 2019 - 2024. All rights reserved.