伊卡28
伊卡28
  • 发布:2021-04-04 13:56
  • 更新:2021-04-06 18:30
  • 阅读:1288

【报Bug】IOS的webview内嵌页面uni.postMessage,无法在app端接收到消息

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: macOS Big Sur 11.2.3

HBuilderX类型: 正式

HBuilderX版本号: 3.1.7

手机系统: iOS

手机系统版本号: IOS 14

手机厂商: 模拟器

手机机型: iPad Pro 14.4模拟

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:
  • 使用create方式创建webview,plus.globalEvent.addEventListener('plusMessage', function() {...})监听webview内部的消息
  • 内嵌页面中通过uni.postMessage()回传消息
  • 运行时会抛出错误,且app端没有收到回传消息
    [ERROR] : TypeError: undefined is not an object (evaluating 'window.plus._plusready_dispatch')
  • 使用VM黑苹果镜像,操作系统如反馈信息,用safari-开发-模拟-内嵌网页检查器跟踪抛出错误部分的代码,发现在dispatchPlusReadyEvent方法中,window.plus被window.backupplus__赋值为undefined
  • 页面本身对非5+ plus的调用(plus.load(1))也出问题了

预期结果:

内嵌页面的postMessage应该被app的事件监听到,并继续程序的流程处理

实际结果:

内嵌页面postMessage无反应,app端可以向内嵌页面发出信息,但内嵌页面无法回传信息

bug描述:

iOS端 webview内嵌页面postMessage消息无法在app端接收到,app端可以通过evalJs调用内嵌页面的方法。安卓端不存在该问题。
初步推测是因为H5页面本身存在一个layer的plus全局对象,app内嵌网页初始化5+plus时出现冲突。
因为业务关系,需要H5页面回传消息给app端,所以不能设置plusrequire为none。

2021-04-04 13:56 负责人:无 分享
已邀请:
伊卡28

伊卡28 (作者)

大家有什么思路吗?有什么想法都可以交流一下,谢谢!!!!

伊卡28

伊卡28 (作者)

像5+html 和原生H5页面中的弹窗plus冲突了的话,大家一般是怎么处理的呢?

伊卡28

伊卡28 (作者)

可以自己顶顶吗。。。唉。。。调试了好久了还是没找到绕过方案

伊卡28

伊卡28 (作者)

TypeError: undefined is not an object (evaluating 'window.plus._plusready_dispatch')

DCloud_UNI_GSQ

DCloud_UNI_GSQ

可以使用其他通信方式,比如 overrideUrlLoading 相关参考:https://github.com/zhetengbiji/plus-websocket/blob/master/src/SocketTask.ts

  • 伊卡28 (作者)

    我试了这个方法,拦截超链接跳转的时候,get的传参长度是有限制的,而业务需求的传参即使压缩之后也远远超过了最大长度限制。请问还有什么绕过方案吗?

    2021-04-08 18:52

  • DCloud_UNI_GSQ

    回复 伊卡28: 分段

    2021-04-12 11:41

该问题目前已经被锁定, 无法添加新回复