收藏
回答

web-view JSSDK 无反应(多 tab 含 web-view 等情况)

问题模块 API/组件名称 终端类型 微信版本 基础库版本
API和组件 web-view 组件内 JSSDK 客户端 6.6.1 1.7.1

以下反馈的问题,都已经保证 JSSDK 签名正常,wx.ready 返回成功,wx.error 无任何错误,而且同样的网页在微信内置浏览器中完全正常符合预期。仅小程序 web-view 中则某些 API 不符合预期,小程序的正式线上版、体验版、开发版均存在这些问题。基础库 1.7.1 ~ 1.7.4 真机均出现这些问题,但是开发者工具的模拟器中均不会出现这些问题。


1、iOS 微信版本 6.5.23

首次扫码(或搜索、点击卡片)进入小程序,JSSDK 调用 wx.openLocation 等需要签名的 API 不正常,无需签名的 wx.miniProgram.navigateTo 等 API 均可正常调用,表现是:


调用 wx.openLocation 返回成功,没有任何错误,但是不显示地图;wx.miniProgram.navigateTo 则可以正常跳转。

点击左上方 X 按钮关闭小程序(或者去别的微信页面,等待超时后自动退出),再次进入同样的小程序,则 JSSDK 全部 API 正常,即调用 wx.openLocation 返回成功,且可以跳转到地图,wx.miniProgram.navigateTo 也正常跳转。


这个问题仅在首次进入小程序时出现。


2、iOS 微信版本 6.6.1

  • 无论小程序是首次进入,还是隐藏后进入,或隐藏自动退出后进入(新版已经没有 X 按钮了,只能隐藏),JSSDK 调用 wx.openLocation 等需要签名的 API 不正常,无需签名的 wx.miniProgram.navigateTo 等 API 均可正常调用,但有一个例外,JSSDK 的 wx.getLocation 可正常调用,可弹出是否允许使用位置的提示。


  • 使用 tabBar 多个 web-view 时(如 tabBar 内含三个 Page,每个 Page 内各有一个 web-view,共 3 个 web-view),那么在第一个 tab 的 web-view 网页加载完成后,底部 tabBar 不会覆盖 web-view 内容,第二个、第三个 tab 中 web-view 网页加载完成后,底部 tabBar 会覆盖一部分在 web-view 内容上,给人的感觉是页面拉不到底。这个问题在 iOS 微信版本 6.5.23 中是没有的,新版是否改了导致不正常?


3、Android 微信版本 6.5.23(Android 系统 4.4)/ 微信版本 6.6.1(Android 系统 6.0)

使用 tabBar 多个 web-view 时(如 tabBar 内含三个 Page,每个 Page 内各有一个 web-view,共 3 个 web-view),那么在第一个 tab 的 web-view 网页加载完成后,不点击其它 tab(即其它 web-view 未加载,仅加载了一个 web-view 网页) ,web-view 中调用 JSSDK,完全正常(需签名和无需签名的 API 均正常,如 wx.miniProgram.navigateTo 和 wx.openLocation 均能符合预期


当点击第二个、第三个 tab,其中 web-view 加载后,再切换到第一个 tab 时,该页面调用 JSSDK 均不正常(需签名和无需签名的 API 均不正常,如 wx.miniProgram.navigateTo 和 wx.openLocation 均不符合预期,没有任何跳转行为)


1、2、3 出现这些问题时,web-view 内 window.__wxjs_environment === 'miniprogram' 为 true,没有 js 错误。

请官方看看是否是 web-view 组件的 Bug,导致了上述这些问题。这些问题影响了 web-view 在小程序中的使用。

最后一次编辑于  2017-12-29  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

4 个回答

  • Crazy罗小杰
    Crazy罗小杰
    2018-02-04

    @周筱北 嗯,这个问题解决了吗,我也遇到了相同的问题。我用JSSDK1.3.2在webview调起scanQRCode时提示config:fail,签名是正常的。

    wx.config({
        debug: true,                             
        appId: "'" + data.appId + "'",             // data.appId 从接口获取
        timestamp: data.timestamp,                 // data.timestamp 从接口获取
        nonceStr: "'" + data.nonceStr + "'",       // data.nonceStr 从接口获取
        signature: "'" + data.signature + "'",     // data.signature 从接口获取
        jsApiList: [                               // 必填,需要使用的JS接口列表
            'checkJSApi',
            'scanQRCode'
        ]
    });
    wx.ready(function() {
        wx.checkJsApi({
            jsApiList: [
                'scanQRCode'
            ],
            success: function (res) {
                alert(JSON.stringify(res));
            }
        });
        wx.scanQRCode({
            needResult: 1, // 0扫描结果由微信处理,1则直接返回扫描结果,默认为0
            desc: '微信扫码',
            success: function (res) {
                layer.close(i);
                alert(JSON.stringify(res));
            }
        });
    });
    wx.error(function (res) {
        alert(JSON.stringify(res));
    });


    2018-02-04
    赞同
    回复
  • 周筱北
    周筱北
    2018-01-16

    不只是说某段代码引起的,还需要满足上面说的条件才会重现,代码就是先引入 jweixin 1.3.0 的 js 文件,然后在 onclick 中调用 wx.miniProgram.navigateTo 和 wx.openLocation 等方法。


    Android 中的 JSSDK (小程序 web-view 中)比较难以捉摸,特别是使用 tabBar 多个 web-view 时,一些时候可以调用 JSSDK 中的方法,一些时候则提示没有权限,同样的页面直接放到微信浏览器中就是完全正常的。

    2018-01-16
    赞同
    回复
  • Crazy罗小杰
    Crazy罗小杰
    2018-01-15

    贴代码

    2018-01-15
    赞同
    回复