web-view JSSDK 无反应(多 tab 含 web-view 等情况)
发布于 5 年前 作者 weiwu 7344 次浏览 来自 问答

以下反馈的问题,都已经保证 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 在小程序中的使用。

4 回复

系统记录

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

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

@周筱北 嗯,这个问题解决了吗,我也遇到了相同的问题。我用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));
});
回到顶部