当前位置: 首页 > news >正文

cocos webview与通信

当前需求是在原有的cocos手机游戏里嵌入另一个cocos的web-mobile项目
所以需要使用webview
记录一下

首先就是要有一个webview组件
在这里插入图片描述
接下来是脚本
(外部项目)

export class GameWebview extends Component {
    @property(WebView)
    webview: WebView = null!;

    onAdded(params: any) {
    	// webview跳转 并向内部发送token
        let token = params.access_token;
        this.webview.url = `${params.host}?token=${token}`;
        // webview加载完成监听
        this.webview.node.on(WebView.EventType.LOADED, ()=> {
        	// 约定的关键字
        	let scheme = "closepage";
        	// 设置关键字
            this.webview.setJavascriptInterfaceScheme(scheme);
            // 识别到URL前缀为关键字的回调
            this.webview.setOnJSCallback(()=>{
                this.close();
            })
            // 关闭背景音乐
            oops.audio.stopMusic();
            // 原本是想用这种方式发送token的,但是没有获取的时机
            // this.scheduleOnce(()=> {
            //     this.webview.evaluateJS(`setToken(${JSON.stringify(token)})`);
            // }, 8)
        })
    }

    close() {
        // 打开背景音乐
        let bgm = oops.storage.get("game_audio");
        oops.audio.playMusicLoop(bgm);
        
        oops.gui.remove(UIID.HitMoleGameWebview);
    }
}

(内部项目)
在Main.ts即项目开始时获取token

const token = urlParams.get("token");
oops.storage.set("token", token);

返回到外部游戏

close() {
    SocketManager.getInstance().close();
    // 跳转以关键字为前缀的URL,让外部webview识别
    document.location = 'closepage://a=1';
    oops.gui.remove(UIID.Home);
}

一些遇到的问题及解决

传递token

一开始我是想通过👇这种方式转递token
记得要stringify一下

this.webview.evaluateJS(`setToken(${JSON.stringify(token)})`);

获取的话就要通过声明全局方法setToken来接收
但找不到合适的时机
我已经在首场景下挂载的脚本(Main.ts)里声明了,但是还是接收不到,会报错找不到该方法(难道要改构建后的文件?)
然后我又尝试了在加载完成监听里发送token,还是同样不行

this.webview.node.on(WebView.EventType.LOADED, ()=> {
     this.webview.evaluateJS(`setToken(${JSON.stringify(token)})`);
})

再然后又加了个延时,倒是可以了,但是不是很稳定

this.webview.node.on(WebView.EventType.LOADED, ()=> {
    this.scheduleOnce(()=> {
        this.webview.evaluateJS(`setToken(${JSON.stringify(token)})`);
    }, 8)
})

最后就直接用url来传了

this.webview.url = `${params.host}?token=${token}`;

接收

const urlParams = new URLSearchParams(window.location.search);
const token = urlParams.get("token");

内部向外部传递消息

一开始我是这么设置关键字的

let scheme = "closepage";
this.webview.setJavascriptInterfaceScheme(scheme);
this.webview.setOnJSCallback(()=>{
    this.close();
})
let token = params.access_token;
this.webview.url = `${params.host}?token=${token}`;

看了半天,并没有啥问题啊,就是识别不了关键字
看了这篇帖子
应该是要先打开webview的内部项目,激活,再去设置关键字,为了保险我是在loaded里设置的关键字

this.webview.node.on(WebView.EventType.LOADED, ()=> {
	// 约定的关键字
	let scheme = "closepage";
	// 设置关键字
    this.webview.setJavascriptInterfaceScheme(scheme);
    // 识别到URL前缀为关键字的回调
    this.webview.setOnJSCallback(()=>{
        this.close();
    })
})

还有注意关键字不能有大写字母!!

web-mobile打包问题

打包时要注意,记得勾选上MD5,这样重新上传新包后就不用清缓存才能加载新包内容了
在这里插入图片描述

细节问题

  • 记得跳转时要记得关闭原bgm,返回时重新播放bgm
  • 如果内部项目是用的浏览器预览,可以选择”网页全屏“
    在这里插入图片描述

相关文章:

  • 【第七节】windows sdk编程:Windows 中的对话框
  • 智慧校园综合安防系统建设方案
  • 项目-个人博客测试报告
  • 04自媒体文章-自动审核(阿里云自动审核文章和图片、服务降级处理、异步调用@Async、自管理敏感词DFA、OCR识别图片文字、文章详情-静态文件生成)
  • leetcode:1827. 最少操作使数组递增(python3解法)
  • 【机器人-基础知识】标定 - 相机标定全解
  • 在IDEA中连接达梦数据库:详细配置指南
  • C++之创建线程
  • ens33没有分配到IPV4问题
  • [C语言基础]13.动态内存管理
  • vscode编译器的一些使用问题
  • 【Film】MM-StoryAgent 1:沉浸式叙事故事书视频生成,具有跨文本、图像和音频的多代理范式
  • Kali Linux快速入门指南
  • 用旧的手机搭建 MQTT Broker
  • vue-seamless-scroll无缝滚动到下一屏点击事件失效的解决办法
  • 专题三搜索插入位置
  • 新矩阵(信息学奥赛一本通-2041)
  • 文生图技术的演进、挑战与未来:一场重构人类创造力的革命
  • Qt启动新窗口
  • Android Dagger2 框架依赖图构建模块深度剖析(三)
  • 美国调整对华加征关税
  • 金正恩观摩朝鲜人民军各兵种战术综合训练
  • 刘永明|在从普及到提高中发展新大众文艺
  • 高适配算力、行业大模型与智能体平台重塑工业城市
  • 第1现场 | 印巴停火次日:当地民众逐渐恢复正常生活
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等