flutter Webview禁止通过点击链接打开已安装的应用程序

z8dt9xmd  于 2023-04-07  发布在  Flutter
关注(0)|答案(2)|浏览(167)

我在我的项目中有一个简单的WebView。用户可以谷歌和搜索任何东西。我现在的问题是,通过点击某些链接,我会自动重定向到特定的应用程序(如果我安装了它)。
示例:
我在iPhone上安装了Adidas应用程序,然后点击“Adidas”-链接-〉我会被重定向到Adidas应用程序。这不应该发生。相反,链接应该在我的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');
              },
            ),
          ],
        ),
      ),
    );
  }

有什么方法可以阻止其他应用程序打开?

x4shl7ld

x4shl7ld1#

我不认为这是网络视图的问题。
实际上,有一些网站,当你打开它们时,他们会检查你是否使用移动的,如果是这样,他们还会检查你是否已经在设备上安装了应用程序。如果是这样,默认情况下会打开移动应用程序。
你能用谷歌搜索到其他网站(在webview里面),看看是否存在同样的行为吗?

xxb16uws

xxb16uws2#

我也遇到了同样的问题。当你试图在浏览器中打开一个链接时,它会检测到该应用程序并要求你“在另一个应用程序中打开”。我注意到初始URL被更改,并以“全球速卖通://产品/详细信息?...”开头。
因此,为了防止这种情况,在'onNavigationRequest'方法中,在HTTP或HTTPS上对URL进行了验证。如果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));

相关问题