为了账号安全,请及时绑定邮箱和手机立即绑定

“net::ERR_UNKNOWN_URL_SCHEME”错误,当 url 是

“net::ERR_UNKNOWN_URL_SCHEME”错误,当 url 是

子衿沉夜 2023-05-10 13:15:00
我已经使用 flutter web_view_plugin(webview) 构建了一个混合应用程序。我们的一种支付方式需要打开第三方应用程序(在本例中为 kakaotalk)。但是flutter webview插件没有提供这个功能,返回了net::ERR_UNKNOWN_URL_SCHEME。我做了一些研究,我明白问题出在url. 如果url不以http或开头https,则会导致此错误。所以,为了解决这个问题,我不得不更改本机 java 代码。java现在我对和没有任何经验android,因此修复本机代码非常困难。我知道我必须修改shouldOverrideUrlLoading部分,以允许url以开头的intent://部分,而且我必须进行一些验证以检查该应用程序是否已安装。(如果未安装,则应将用户重定向到 playstore)我添加的代码在shouldOverrideUrlLoading. 我也做了三个进口。剩下的就是代码,flutter生成package com.flutter_webview_plugin;import android.annotation.TargetApi;import android.graphics.Bitmap;import android.os.Build;import android.webkit.WebResourceRequest;import android.webkit.WebResourceResponse;import android.webkit.WebView;import android.webkit.WebViewClient;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.content.Intent; //added importimport android.net.Uri; //added importimport android.content.ActivityNotFoundException; //added import/** * Created by lejard_h on 20/12/2017. */public class BrowserClient extends WebViewClient {    private Pattern invalidUrlPattern = null;    public BrowserClient() {        this(null);    }    public BrowserClient(String invalidUrlRegex) {        super();        if (invalidUrlRegex != null) {            invalidUrlPattern = Pattern.compile(invalidUrlRegex);        }    }    public void updateInvalidUrlRegex(String invalidUrlRegex) {        if (invalidUrlRegex != null) {            invalidUrlPattern = Pattern.compile(invalidUrlRegex);        } else {            invalidUrlPattern = null;        }    }    @Override    public void onPageStarted(WebView view, String url, Bitmap favicon) {        super.onPageStarted(view, url, favicon);        Map<String, Object> data = new HashMap<>();        data.put("url", url);        data.put("type", "startLoad");        FlutterWebviewPlugin.channel.invokeMethod("onState", data);    }代码编译,但当net::ERR_UNKNOWN_URL_SCHEME我尝试使用“第 3 方应用程序(kakaotalk)”付款时,它仍然返回相同的错误
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

之前,当 Firebase 动态链接被强制加载到 WebView 中时,我在 Android 上遇到了类似的错误。就我而言,FDL 预计将由 Android 中的 Google Play 服务处理。但是由于 WebView 不知道如何处理它被迫显示的链接,WebView 返回“net::ERR_UNKNOWN_URL_SCHEME”错误。我不确定这是否与您的情况相同,因为我无法验证您尝试从“intent://kakaopay...”加载的链接

您可以尝试使用外部打开链接url_launcher。使用 RegEx 过滤意图 URL 并检查 URL 是否可以在外部(应用程序外部)启动和处理。

var yourURL = "URL goes here";

// Check if URL contains "intent"

yourURL.contains(RegExp('^intent://.*\$')){

  // Check if the URL can be launched

  if (await canLaunch(yourURL)) {

    await launch(yourURL);

  } else {

    print('Could not launch $yourURL');

  }

}

此外,您使用的插件 ( web_view_plugin) 似乎已过时,我无法在此处找到它https://pub.dev/packages?q=web_view_plugin。Flutter 有它的官方 WebView 插件 ( webview_flutter) 已经发布,我建议检查它是否适合你的用例。



查看完整回答
反对 回复 2023-05-10
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

这样做了:


_launchURL(url) async {

  var link = "https://hiddenwords.page.link/deposit";


  if (await canLaunch(link)) {

      await launch(link,

      forceWebView: false, enableJavaScript: true, forceSafariVC: 

    false);

  } else {

    throw 'Could not launch $link';

  }

}

我手动将我希望它在 _launch 函数中打开的 url/链接放在 _launch 函数中...不要介意 _launch 括号中的 url。


我还将此添加到 Webview 小部件:


navigationDelegate: (NavigationRequest request) {

   if (request.url.contains(RegExp('^intent://.*\$')))  {

        _launchURL(request.url);

        return NavigationDecision.prevent;

   }

     return NavigationDecision.navigate;

},

希望这对你有用。这个对我有用...


查看完整回答
反对 回复 2023-05-10
?
慕村225694

TA贡献1880条经验 获得超4个赞

1.使用你的APP在flutter中使用参数打开其他应用程序(在你的动态链接中);2.使用:url_launcher:^6.1.6;


首先,他们的应用程序必须支持动态链接;其次,他们为您提供交易的动态链接;这样我们就可以点击你APP中的动态链接,跳转到他们APP的指定页面了。


代码:


 final Uri toLaunch = Uri(scheme: 'https', host: 'link.fitstop.com', path: 'link/qbvQ/');

  //https://link.fitstop.com/link/qbvQ   is dynamic link


  Future<void>? _launched;


    ElevatedButton(

              onPressed: () => setState(() {

                _launched = _launchInBrowser(toLaunch);

              }),

              child: Text(

                'url_launcher',

              ),

            )


  Future<void> _launchInBrowser(Uri url) async {

    if (!await launchUrl(

      url,

      mode: LaunchMode.externalApplication,

    )) {

      throw 'Could not launch $url';

    }

  }


查看完整回答
反对 回复 2023-05-10
  • 3 回答
  • 0 关注
  • 1244 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信