我的项目中有一个简单的
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');
},
),
],
),
),
);
}
有什么办法可以防止其他应用程序打开吗?
我不认为这是 webview 的问题。
实际上有一些网站,当您打开它们时,它们会检查您是否正在使用手机,如果是这样,它们还会检查您是否已经在设备上安装了该应用程序。如果也是这样,则默认打开移动应用程序。
你能否使用谷歌搜索(在 webview 内)访问其他网站,看看是否存在相同的行为?
我在 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));