Flutter-Webview組件處理Scheme協(xié)議

項(xiàng)目背景

之前我介紹過(guò)Flutter建立JsBridge用于webview與h5通信,有時(shí)候h5頁(yè)面中需要喚醒其他應(yīng)用的功能,通過(guò)約定的Scheme協(xié)議肖揣,比如weixin://积蔚,這時(shí)候就需要我們的Webview組件處理,否則就會(huì)出現(xiàn)net:ERR_UNKNOWN_URL-SCHEME的頁(yè)面報(bào)錯(cuò)耕漱。

插件變更

上篇介紹Webview使用的文章算色,我用的是官方插件 webview_flutter,實(shí)際應(yīng)用的時(shí)候螟够,出現(xiàn)了個(gè)難以解決的bug灾梦,在華為mate30、android10環(huán)境下妓笙,h5的input元素調(diào)取手機(jī)系統(tǒng)鍵盤(pán)會(huì)失敗若河,據(jù)我們測(cè)試,目前只發(fā)現(xiàn)在該手機(jī)型號(hào)寞宫、安卓系統(tǒng)下出現(xiàn)該問(wèn)題萧福,而華為客戶(hù)占比很重,是必須要解決的辈赋,github上有類(lèi)似的closed issue鲫忍,推薦使用flutter_webview_plugin膏燕,所以就更改了webview插件,這兩個(gè)插件評(píng)分都很高悟民,提供的api類(lèi)似坝辫,使用方法也相似,組件改造工作量很小射亏。

組件改造

1近忙、安裝webview_flutter

 flutter_webview_plugin: ^0.3.10+1

2、 ios中在ios/Runner/Info.plist中添加

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

3智润、改造WebView組件

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import 'package:url_launcher/url_launcher.dart';

import '../configs/config.dart';
import '../utils/adapter.dart';
import '../utils/JsBridgeUtil.dart';
import '../widgets/AppIcon.dart';
import '../widgets/FixedSizeText.dart';

/// 與h5 端的一致 不然收不到消息
const String userAgent = 'FoxApp';

/// WebView頁(yè)面
class Webview extends StatefulWidget {
  final String url;
  final String title;
  final VoidCallback backCallback;

  Webview({
    Key key,
    @required this.url,
    this.title = '',
    this.backCallback,
  }) : super(key: key);

  @override
  WebviewState createState() => WebviewState();
}

class WebviewState extends State<Webview> {
  bool isPhone = Adapter.isPhone();
  final flutterWebViewPlugin = FlutterWebviewPlugin();

  final Set<JavascriptChannel> jsChannels = [
    JavascriptChannel(
        name: userAgent,
        onMessageReceived: (JavascriptMessage msg) {
          String jsonStr = msg.message;
          JsBridgeUtil.executeMethod(JsBridgeUtil.parseJson(jsonStr));
        }),
  ].toSet();

  // On urlChanged stream
  StreamSubscription<String> _onUrlChanged;

  @override
  void initState() {
    super.initState();
    flutterWebViewPlugin.close();

    // Add a listener to on url changed
    _onUrlChanged =
        flutterWebViewPlugin.onUrlChanged.listen((String url) async {
      if (url.contains('weixin:') || url.contains('alipay:')) {
        await flutterWebViewPlugin.stopLoading();
        await flutterWebViewPlugin.goBack();
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    });
  }

  @override
  void dispose() {
    _onUrlChanged.cancel();
    flutterWebViewPlugin.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: isPhone ? Colors.white : Color(Config.foxColors.bg),
      body: WebviewScaffold(
        appBar: AppBar(
          backgroundColor: isPhone ? null : Color(Config.foxColors.bg),
          leading: AppIcon(Config.foxImages.backGreyUrl, callback: () {
            flutterWebViewPlugin.close();
            Navigator.of(context).pop(true);
            widget.backCallback?.call();
          }),
          title: FixedSizeText(widget.title),
          centerTitle: true,
          elevation: 0,
        ),
        url: widget.url,
        userAgent: "Mozilla/5.0 $userAgent",
        // h5 可以通過(guò)navigator.userAgent判斷當(dāng)前環(huán)境
        javascriptChannels: jsChannels,
        mediaPlaybackRequiresUserGesture: false,
        withZoom: true,
        withLocalStorage: true,
        hidden: true,
      ),
    );
  }
}

測(cè)試同學(xué)提出了一個(gè)bug银锻,跳轉(zhuǎn)微信時(shí),會(huì)偶現(xiàn)net:ERR_UNKNOWN_URL-SCHEME頁(yè)面做鹰,這條issue也在討論這個(gè)問(wèn)題击纬,https://github.com/fluttercommunity/flutter_webview_plugin/issues/43,本質(zhì)是插件提供的功能不完善钾麸,沒(méi)有提供攔截頁(yè)面顯示的方法更振,社區(qū)提出了一些解決方式。

/// 兼容android進(jìn)入報(bào)錯(cuò)頁(yè)
    _onStateChanged = flutterWebViewPlugin.onStateChanged
        .listen((WebViewStateChanged state) async {
      if (mounted) {
        if (state.url.startsWith('weixin:') &&
            state.type == WebViewState.abortLoad) {
          if (await canLaunch(state.url)) {
            await launch(state.url);
          } else {
            throw 'Could not launch ${state.url}';
          }
        }
      }
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭尝,一起剝皮案震驚了整個(gè)濱河市肯腕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钥平,老刑警劉巖实撒,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涉瘾,居然都是意外死亡知态,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)立叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)负敏,“玉大人,你說(shuō)我怎么就攤上這事秘蛇∑渥觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赁还,是天一觀的道長(zhǎng)妖泄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)艘策,這世上最難降的妖魔是什么蹈胡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上审残,老公的妹妹穿的比我還像新娘梭域。我一直安慰自己斑举,他們只是感情好搅轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著富玷,像睡著了一般璧坟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赎懦,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天雀鹃,我揣著相機(jī)與錄音,去河邊找鬼励两。 笑死黎茎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的当悔。 我是一名探鬼主播傅瞻,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盲憎!你這毒婦竟也來(lái)了嗅骄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饼疙,失蹤者是張志新(化名)和其女友劉穎溺森,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窑眯,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屏积,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磅甩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肾请。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖更胖,靈堂內(nèi)的尸體忽然破棺而出铛铁,到底是詐尸還是另有隱情,我是刑警寧澤却妨,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布饵逐,位于F島的核電站,受9級(jí)特大地震影響彪标,放射性物質(zhì)發(fā)生泄漏倍权。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薄声。 院中可真熱鬧当船,春花似錦、人聲如沸默辨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缩幸。三九已至壹置,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間表谊,已是汗流浹背钞护。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爆办,地道東北人难咕。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像距辆,于是被迫代替她去往敵國(guó)和親余佃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 鏈接:http://www.reibang.com/p/fd61e8f4049e 一挑格、簡(jiǎn)介 這部分主要介紹下 W...
    柒黍閱讀 1,819評(píng)論 0 4
  • 這兩天看了下flutter咙冗,感覺(jué)這兩年可能會(huì)爆發(fā),所以嘗試在mac和win10上面跑了下hello world.....
    TaoLandd閱讀 765評(píng)論 0 0
  • 標(biāo)簽(空格分隔): 移動(dòng)應(yīng)用 跨平臺(tái) 混和開(kāi)發(fā) Flutter 移動(dòng)應(yīng)用跨平臺(tái)開(kāi)發(fā)框架漂彤,根據(jù)其原理雾消,主要分為三類(lèi):...
    黃昭鴻閱讀 4,667評(píng)論 0 2
  • 早起天氣微涼,行上沉沉街巷挫望,就在誰(shuí)家院口立润,掛下兩綹陽(yáng)光。
    furx閱讀 304評(píng)論 1 4
  • 三亞的沙灘真的把我震驚到了媳板,這么多各色的直播桑腮。 小姐姐路人視角又胖又丑,找出直播視頻一看蛉幸,我的天破讨,尤物! 唱歌的路...
    玘十五閱讀 184評(píng)論 0 1