cocos2d x js 热更新-js热更新失败怎么办

工作需要,在空闲时间看了下Cocos2d-JS的热更新。对其进行了一个简单的实现,这里总结分享一下。
Cocos2d-JS 热更新
Cocos2d-JS 热更新是啥?Cocos2d-JS终归还是一个游戏引擎,就以游戏的过程来理解吧。传统游戏需要更新人物动画、地图场景、游戏逻辑、背景音乐怎么办?新出一个APP放到应用商店等用户下载,或者好一点游戏内提示又升级并自行下载完整的新版本APP。
使用Cocos2d-JS的热更新,那就大不一样了。它可以做到进入游戏后下载需要更新的资源甚至是脚本本身,而且更新过程不需要退出游戏。只要用户联网,就能够保证使用到最新的资源。
这些场景就非常适合使用Hot Fix
想在游戏中对春节开放新活动,不能保证应用商店能准时过审核上线
发现一个严重的Bug,需要立即修复
需要经常换游戏资源,提升新鲜感
先放一个中规中矩的版本过市场审核,然后绕过审核自己直接推新内容,哈哈
对于游戏来说,这个特性是比较重量级的。不过因为JavaScript的语言特性能支持这一功能,所以Cocos2d-JS能用此特性,而Cocos2d-x无法使用。
以下是官方提供的特性
多线程并行下载支持
两层进度统计信息:文件级以及字节级
Zip压缩文件支持
详细的错误报告
文件下载失败重试支持
1. manifest配置文件
热更新需要用到的配置文件有2种,都是以.manifest结尾。
一种是精简版,一种是完整版。精简版称为version.manifest,完整版称为project.manifest。
version.manifest:
&&&&&packageUrl&&:&&&,&
&&&&&remoteManifestUrl&&:&&&,&
&&&&&remoteVersionUrl&&:&&&,&
&&&&&version&&:&&1.0.0&,
&&&&&groupVersions&&:&{
&&&&&&&&&1&&:&&1.0.1&,
&&&&&&&&&2&&:&&1.0.2&
&&&&&engineVersion&&:&&3.3&
version.manifest是可选的,其中的所有字段也出现在project.manifest中,并且内容一样,如果没有就会从服务端下载完整版。但是如果完整版特别大,那么这个小版本的优势就很明显了。
project.manifest:
&&&&&packageUrl&&:&&&,&
&&&&&remoteManifestUrl&&:&&&,&
&&&&&remoteVersionUrl&&:&&&,&
&&&&&version&&:&&1.0.0&,
&&&&&groupVersions&&:&{
&&&&&&&&&1&&:&&1.0.1&,
&&&&&&&&&2&&:&&1.0.2&
&&&&&engineVersion&&:&&3.3&,
&&&&&assets&&:&{
&&&&&&&&&update1&&:&{
&&&&&&&&&&&&&path&&:&&src/app.zip&,
&&&&&&&&&&&&&md5&&:&&41D8EB714B14F8D&,
&&&&&&&&&&&&&compressed&&:&true,
&&&&&&&&&&&&&group&&:&&1&
&&&&&&&&},&
&&&&&&&&&update2&&:&{
&&&&&&&&&&&&&path&&:&&res/HelloWorld.png&,
&&&&&&&&&&&&&md5&&:&&A0FA3FA681DE802F74D50&,
&&&&&&&&&&&&&group&&:&&1&
&&&&&&&&},
&&&&&&&&&update3&&:&{
&&&&&&&&&&&&&path&&:&&res/Bound.png&,
&&&&&&&&&&&&&md5&&:&&E7DC5BB35ADC55E133DBA2&,
&&&&&&&&&&&&&group&&:&&1&
&&&&&&&&},
&&&&&&&&&update4&&:&{
&&&&&&&&&&&&&path&&:&&src/resource.js&,
&&&&&&&&&&&&&md5&&:&&BA47101EBB65FBFCFB61C4CC57A306CA&,
&&&&&&&&&&&&&group&&:&&2&
&&&&&searchPaths&&:&[
&&&&&res/&
所有字段具体含义,官方文档的定义还是比较详细,只是少了groupVersions这个新字段:
packageUrl : 远程资源的下载根路径。
remoteVersionUrl : 远程版本文件的路径,用来判断服务器端是否有新版本的资源。
remoteManifestUrl : 远程配置文件的路径,包含版本信息以及所有资源信息。
version : 配置文件对应的版本。
groupVersions : 是新增的功能字段,用于做增量更新很方便。
engineVersion : 配置文件对应的引擎版本。
assets : 所有资源信息。
key : 升级名称
path : 键代表资源的相对路径(相对于packageUrl)。
md5 : md5值代表资源文件的版本信息。
compressed : [可选项] 如果值为true,文件被下载后会自动被解压,目前仅支持zip压缩格式。
searchPaths : 需要添加到Cocos2d引擎中的搜索路径列表。
以我的配置为例,一个完整的更新流程是这样的:
先通过本地的version.manifest和服务端的version.manifest比较,如果本地version低于服务端,那么就会再去获取project.manifest。
如果version相同,那么会比较groupVersions。
如果本地没有下载过groupVersions中的任何更新,那么会依次下载升级包。
如果本地下载过1.0.1版本的升级包,那么就会跳过1.0.1下载属于1.0.2版本的升级内容。
如果下载失败,或者没有网络导致更新失败的,会继续使用未更新前的版本。并且下次启动会继续尝试更新。
2. 创建后台
用一种你喜欢的方式起一个后台服务。我朴实无华的用IDE(Eclipse for JavaEE)建立了一个空的Web工程,用Tomcat起了一个后台。
从刚才的配置文件可以看出,Web工程名为JsUpdateServer。
在WebContent的根目录下新建一个index.html文件,随便在里边写些东西,用来验证我的后台已经起来。
Run起来之后,在浏览器里输入http://localhost:8080/JsUpdateServer/index.html看看是不是能够看到你刚才写的内容?
到这里你的后台已经OK了~
3. 创建Cocos2d-JS工程
新建一个Cocos2d-JS工程,可以用专用的IDE(Cocos Code IDE),官网有下载,也有如何配置的教程,这里就不多说了。
在res目录下,新建一个project.manifest文件。这个是初始版本信息,之后的更新会用到这个文件。内容如下:
&&&&&packageUrl&&:&&&,&
&&&&&remoteManifestUrl&&:&&&,&
&&&&&remoteVersionUrl&&:&&&,&
&&&&&version&&:&&1.0&,&
&&&&&engineVersion&&:&&3.3&,&
&&&&&assets&&:&{
&&&&&searchPaths&&:&[&
在src目录下,新建一个jsList.js文件,内容如下:
var&jsList&=&[&
&&&&&&&&&&&&&&&src/resource.js&,&
&&&&&&&&&&&&&&&src/app.js&&
&&&&&&&&&&&&&&]
这个文件里包括的是需要加载的js文件路径,将会在其他地方加载。
在src目录下,新建一个assetsManagerScene.js文件,这里就是热更新的主要逻辑了。代码如下:
var&failCount&=&0;&
var&maxFailCount&=&1;&&&
var&AssetsManagerLoaderScene&=&cc.Scene.extend({&
_am:null,&
_progress:null,&
_percent:0,&
run:function(){&
if&(!cc.sys.isNative)&{&
this.loadGame();&
var&layer&=&new&cc.Layer();&
this.addChild(layer);&
this._progress&=&new&cc.LabelTTF.create(&update&0%&,&&Arial&,&12);&
this._progress.x&=&cc.winSize.width&/&2;&
this._progress.y&=&cc.winSize.height&/&2&+&50;&
layer.addChild(this._progress);
var&storagePath&=&(jsb.fileUtils&?&jsb.fileUtils.getWritablePath()&:&&./&);
cc.log(&storagePath&is&&&+&storagePath);
this._am&=&new&jsb.AssetsManager(&res/project.manifest&,&storagePath);&
this._am.retain();
if&(!this._am.getLocalManifest().isLoaded())&
cc.log(&Fail&to&update&assets,&step&skipped.&);&
this.loadGame();&
var&that&=&this;&
cc.EventListenerAssetsManager
var&listener&=&new&jsb.EventListenerAssetsManager(this._am,&function(event)&{&
switch&(event.getEventCode()){&
case&jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:&
cc.log(&No&local&manifest&file&found,&skip&assets&update.&);&
that.loadGame();&
case&jsb.EventAssetsManager.UPDATE_PROGRESSION:&
that._percent&=&event.getPercent();&
cc.log(that._percent&+&&%&);&
var&msg&=&event.getMessage();&
if&(msg)&{&
cc.log(msg);&
case&jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:&
case&jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:&
cc.log(&Fail&to&download&manifest&file,&update&skipped.&);&
that.loadGame();&
case&jsb.EventAssetsManager.ALREADY_UP_TO_DATE:&
cc.log(&ALREADY_UP_TO_DATE.&);&
that.loadGame();&
case&jsb.EventAssetsManager.UPDATE_FINISHED:&
cc.log(&Update&finished.&);&
that.loadGame();&
case&jsb.EventAssetsManager.UPDATE_FAILED:&
cc.log(&Update&failed.&&&+&event.getMessage());&
failCount++;&
if&(failCount&&&maxFailCount)&
that._am.downloadFailedAssets();&
cc.log(&Reach&maximum&fail&count,&exit&update&process&);&
failCount&=&0;&
that.loadGame();&
case&jsb.EventAssetsManager.ERROR_UPDATING:&
cc.log(&Asset&update&error:&&&+&event.getAssetId()&+&&,&&&+&event.getMessage());&
that.loadGame();&
case&jsb.EventAssetsManager.ERROR_DECOMPRESS:&
cc.log(event.getMessage());&
that.loadGame();&
cc.eventManager.addListener(listener,&1);&
this._am.update();&
cc.director.runScene(this);&
this.schedule(this.updateProgress,&0.5);&
loadGame:function(){&
cc.loader.loadJs([&src/jsList.js&],&function(){&
cc.loader.loadJs(jsList,&function(){&
cc.director.runScene(new&HelloWorldScene());&
updateProgress:function(dt){&
this._progress.string&=&&update&&+&this._percent&+&&%&;&
onExit:function(){&
cc.log(&AssetsManager::onExit&);
this._am.release();&
this._super();&
热更新主要是通过引擎提供的AssetsManager来实现的。
在AssetsManagerLoaderScene里,用到了res/project.manifest,是用来对版本对比的。
下载完成后的资源会被解压,然后放在jsb.fileUtils.getWritablePath()的路径下,加到引擎的搜索范围中,并且他们的优先级是高于APP原本的资源路径的。所以相同的资源名称,引擎会优先使用更新路径下的文件,就达到更新的目的。
下载成功后会执行loadGame方法,里边会加载src/jsList.js的所有资源。也就是说通过AssetsManagerLoaderScene来确保热更新完成后,再加载所有资源。
由于资源和脚本的加载顺序发生了改变,所以还要修改根目录下的main.js和“project.json”。
cc.game.onStart&=&function(){
&&&&cc.view.adjustViewPort(true);
&&&&cc.view.setDesignResolutionSize(800,&450,&cc.ResolutionPolicy.SHOW_ALL);
&&&&cc.view.resizeWithBrowserSize(true);
&&&&var&scene&=&new&AssetsManagerLoaderScene();&
&&&&scene.run();&
cc.game.run();
将启动场景改为我的热更新场景AssetsManagerLoaderScene。
project.json:
&&&&&project_type&:&javascript&,
&&&&&debugMode&:1,
&&&&&showFPS&:true,
&&&&&frameRate&:60,
&&&&&id&:&gameCanvas&,
&&&&&renderMode&:0,
&&&&&engineDir&:&frameworks/cocos2d-html5&,
&&&&&modules&:[
&&&&&&&&&cocos2d&,
&&&&&&&&&extensions&
&&&&&jsList&:[
&&&&&&&&&src/assetsManagerScene.js&&
将jsList的值改为src/assetsManagerScene.js,只要加载这个js,其他js会在AssetsManagerLoaderScene中被加载。
到这里你可以跑起来看下,虽然获取不到升级文件,但是可以以最原始的版本跑起来。
4. 在后台配置升级文件
现在到后台工程的WebContent目录下添加升级文件。
从我的manifest配置文件你可以看到,我又建立了一个res文件夹,在其中分别建立src和res分别对应Cocos2d-JS工程中的资源、脚本文件夹。
随意修改一下app.js,将其作为更新内容使用。总结了几个要注意的地方。
升级文件的路径,一定要和配置文件中的path内容一致。
升级文件是.zip,记得compressed改为true。
添加新的资源文件要记得同步更新resource.js。
新增js文件也记得同步更新jsList.js。
5. 回到Cocos2d-JS工程
核对一下project.manifest文件中的地址是不是和后台一致,内容是否正确。
没问题的话就可以跑起来了,会发现你的升级内容被下载下来并且更新了。
本文工程后台&Cocos2d-JS的简陋源码,Cocos2d-JS工程中的文件替换你的文件,通用的引擎工程太大没有上传。
其他可以使用到的教程
来源网址:
本文已收录于以下专栏:
相关文章推荐
1. 热更新基本思路
得到cocoachina论坛上fysp和akira_cn的帮助,理清了游戏热更新的思路:
执行AssetsManager后,搜索路径增加了jsb.fileUtil...
热更新的使用方法参考自/kenkofox/p/3906681.html以及官网资料,感谢大神的资料。
有几个要注意的地方:
最近主要进行游戏脚本化相关工作,脚本化的目的就是为了热更新,所以就写个demo研究下热更新。cocos版本: 3.121、基本思路
cocos的热更新主要采用其自带的AssetsManager,执行A...
前言:游戏上线后,我们常常还会需要更新,如新增玩法,活动等,这种动态的更新资源我们称为游戏的热更新。热更新一般只适用于脚本语言,因为脚本不需要编译,是一种解释性语言,而如C++语言是很难热更新的,其代...
cocos2d-js 热更新详解
这几天在尝试使用cocos2d-js解压运行本地zip文件,用的是cocos2d-x 3.13版本,xcode8.2。之前想到的是既然在热更新的时候,已经有从服务端下载zip文件解压运行的接口,那么直...
Cocos 3.6版本热更新梳理
cocos热更新实现了项目资源和脚本文件的动态更新。当工程有新的改动时,用户无需重新下载完整的安装包,而是通过对比本地与最新的版本信息,仅下载有改动的文件到本地,...
基于cocos2d js 的热更新学习笔记!
cocos2d-js-v3.2热更新
4772人阅读 评论(0)
本文章已收录于:
Cocos引擎知识库
这篇文档将介绍Cocos2d-JS 3.0的一个重量级新特性:资源管理器(仅支持JSB)。资源管理器是为游戏运行时的资源热更新而设计的,这里的资源可以是图片,音频甚至游戏脚本本身。使用资源管理器,你将...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)& & 最近用cocos js在做h5游戏,经常更新之后,要清理浏览器缓存才能更新资源,代码,但是如果是嵌入到app里的h5游戏,比如直播中嵌入游戏,不要说很多用户不知道在哪里清缓存,就算用户知道,这样的操作也非常影响用户体验,所以就研究了下用版本号进行热更新的办法。
& & 其实说起来很简单,主要就是找到CCBoot.js,在:项目名\frameworks\cocos2d-html5\CCBoot.js,里面有个_loadConfig,这个函数是加载project.json的,给这里的project.json加上版本号,每次更新的时候,只要修改project.json里面相应的js文件的版本号,退出之后再进,就会加载新的js文件.
下面放上原来的函数和修改的地方,以及修改过后的函数
& &_loadConfig: function () {
& & & & // Load config
& & & & // Already loaded
& & & & if (this.config) {
& & & & & & this._initConfig(this.config);
& & & & & &
& & & & // Load from document.ccConfig
& & & & if (document[&ccConfig&]) {
& & & & & & this._initConfig(document[&ccConfig&]);
& & & & // Load from project.json&
& & & & else {
& & & & & & try {
& & & & & & & & var cocos_script = document.getElementsByTagName('script');
& & & & & & & & for(var i = 0; i & cocos_script. i++){
& & & & & & & & & & var _t = cocos_script[i].getAttribute('cocos');
& & & & & & & & & & if(_t === '' || _t) {
& & & & & & & & & & & &
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & var _src, txt, _resP
& & & & & & & & if(i & cocos_script.length){
& & & & & & & & & & _src = cocos_script[i].
& & & & & & & & & & if(_src){
& & & & & & & & & & & & _resPath = /(.*)\//.exec(_src)[0];
& & & & & & & & & & & & cc.loader.resPath = _resP
& & & & & & & & & & & & _src = cc.path.join(_resPath, 'project.json'); &//这里加版本号
& & & & & & & & & & }
& & & & & & & & & & txt = cc.loader._loadTxtSync(_src);
& & & & & & & & }
& & & & & & & & if(!txt){
& & & & & & & & & & txt = cc.loader._loadTxtSync(&project.json&);//这里加版本号
& & & & & & & & }
& & & & & & & & var data = JSON.parse(txt);
& & & & & & & & this._initConfig(data || {});
& & & & & & } catch (e) {
& & & & & & & & cc.log(&Failed to read or parse project.json&);
& & & & & & & & this._initConfig({});
& & & & & & }
修改过后的函数
_loadConfig: function () {
& & & & // Load config
& & & & // Already loaded
& & & & if (this.config) {
& & & & & & this._initConfig(this.config);
& & & & & &
& & & & // Load from document.ccConfig
& & & & if (document[&ccConfig&]) {
& & & & & & this._initConfig(document[&ccConfig&]);
& & & & // Load from project.json&
& & & & else {
& & & & & & try {
& & & & & & & & var cocos_script = document.getElementsByTagName('script');
& & & & & & & & for(var i = 0; i & cocos_script. i++){
& & & & & & & & & & var _t = cocos_script[i].getAttribute('cocos');
& & & & & & & & & & if(_t === '' || _t) {
& & & & & & & & & & & &
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & var _src, txt, _resP
& & & & & & & & if(i & cocos_script.length){
& & & & & & & & & & _src = cocos_script[i].
& & & & & & & & & & if(_src){
& & & & & & & & & & & & _resPath = /(.*)\//.exec(_src)[0];
& & & & & & & & & & & & cc.loader.resPath = _resP
var time = new Date(); & //加上时间戳
time = time.getTime();
_src = cc.path.join(_resPath, 'project.json?version='+time);& & & & & & & & & &
& & & & & & & & & & }
& & & & & & & & & & txt = cc.loader._loadTxtSync(_src);
& & & & & & & & }
& & & & & & & & if(!txt){
txt = cc.loader._loadTxtSync(&project.json?version=&+time);
& & & & & &&
& & & & & & & & }
& & & & & & & & var data = JSON.parse(txt);
& & & & & & & & this._initConfig(data || {});
& & & & & & } catch (e) {
& & & & & & & & cc.log(&Failed to read or parse project.json&);
& & & & & & & & this._initConfig({});
& & & & & & }
本文已收录于以下专栏:
相关文章推荐
热更新的使用方法参考自/kenkofox/p/3906681.html以及官网资料,感谢大神的资料。
有几个要注意的地方:
基于cocos2d js 的热更新学习笔记!
1. 热更新基本思路
得到CocoaChina论坛上fysp和akira_cn的帮助,理清了游戏热更新的思路:
* 执行AssetsManager后,搜索路径增加了jsb.fileUtil...
工作需要,在空闲时间看了下Cocos2d-JS的热更新。对其进行了一个简单的实现,这里总结分享一下。
Cocos2d-JS 热更新
Cocos2d-JS 热更新是啥?Cocos...
cocos2d-js热更新
热更新基本思路
得到cocoachina论坛上fysp和akira_cn的帮助,理清了游戏热更新的思路:
执行AssetsManager...
首先搭建服务器的配置文件:
var sprite = new cc.Sprite(res.);
sprite.setPosition(, );
this.addChild(sprite);
var label =...
Cocos2d-x 3.0 Android修改APK名、更改图标、修改屏幕方向、修改版本号,一些需要注意的问题。
cocos2dx-lua中有assetmanagerex的c++实现类,也有绑定到lua。不过在3.10之前有缺陷,问题是当有文件下载失败时会陷入死循环,导致业务链断裂。不过网上有解决办法,可简单修改...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2170人阅读
V3.3引擎, 在存在groupversion情况下:
groupversion和version任何一个增加(先和旧的下载的project.manifest比较, 不存在则和客户端里的project.manifest比较, 增大或则减小都算变化, 只有一致才算无变化), 均算version.manifet版本号变化
version.manifest:&&& 无条件每次更新到服务器上的最新版
project.manifest:&&&& 若version.manifet版本号变化, 即下载服务端对应最新的, 否则不变.
res目录和src目录:& 下载了最新的project.manifest, 且分别取决于其对应的md5(未覆盖前的文件中的md5, 原来不存在现在有新的值也算变化, 是每个group分别比较, 一旦某个group不变则不会下载copy其对应的文件)而不是groupversion变化, 变化则把服务端各文件夹下的文件copy到对应的本地目录, 遇到同名的会替换掉旧的, 原来旧的且不同名的保持不变.即覆盖copy
1、自第一次发布后,历次更新的代码都打包在一个js.zip中,每次只更新这个js.zip。这样好处是,保证所有代码是同步的,即使没更新到,玩家也就停留在上一版。例如第一次更新,有1.js,那么js.zip只有1.js;第二次更新2.js,那么js.zip就得包含1.js和2.js,这样避免一些跳版本更新的玩家出问题。
2、非代码资源,避免修改,可以直接用新文件,但不要替换旧文件,这样目的是避免多次版本更新造成新旧混乱。设想2次更新都是zip包,两个zip包都有1.png,这时候有个跳版本更新的玩家,就会下载2个zip包,但先后顺序是不可控的。
3、每次更新manifest文件必须保留以前的assets配置,不能删除。否则,如果删了以前的assets配置,客户端会跟随着删除相应的文件。
/kenkofox/p/3906681.html
http://cn.cocos2d-x.org/tutorial/show?id=1186
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:167731次
积分:1749
积分:1749
排名:千里之外
原创:60篇
转载:45篇
译文:12篇
评论:10条
(1)(3)(1)(1)(1)(2)(1)(2)(1)(4)(1)(4)(2)(6)(6)(2)(2)(2)(3)(15)(2)(3)(2)(1)(6)(2)(4)(4)(2)(6)(4)(1)(5)(12)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'如何看待苹果禁止 JSPatch 等 iOS APP 热更新方案? - 知乎1186被浏览189850分享邀请回答require('UIView')
var view = UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor())
view.setAlpha(0.5)
简单理解,JSPatch可以理解为所有的 Objective-C 的 API 进行了映射,允许开发者在 JS 端调用任意原生代码。这显然是极其危险的。假设这段代码是通过热更新技术下载执行的,如果在中间存在黑客,把这段代码动态替换掉,比如修改为获取用户通讯录并上传到黑客的服务器,就会造成重大的安全问题。为什么游戏热更新技术可以被理解为是安全的与 JSPatch 不同的是,游戏热更新技术主要的实现方式是把动态脚本下载之后,让动态脚本调用游戏引擎提供的接口实现缺陷修复。与 JSPatch不同的是,动态脚本并不能任意调用全部原生代码,而是只能根据游戏引擎提供的接口调用相关功能。在这个过程中,游戏引擎的原生端作为一个安全沙箱,提供了一个安全的保护层,只要游戏引擎不要对外提供获取通讯录的接口,黑客就无法通过替换动态脚本的方式获取用户的隐私资料。进而可以被认为是安全的,自然不在苹果的禁止范围内。相关链接React-Native 开发者收到了苹果警告邮件。React-Native 官方辟谣,确认不是 React-Native 的问题,而是 JSPatch / Rollout 的问题JSPatch 开发者收到了苹果警告邮件,引发大量开发者围观 2016年有安全公司发布报告,指出 JSPatch 存在安全漏洞,影响了超过1000款 AppStore 上的应用。 总结苹果认为热更新技术容易被黑客利用,造成重大安全问题。在官方警告邮件中,也是在进行如此描述。JSPatch 这种基于反射,允许获取全部系统接口 的方式,确实存在着一定的安全风险。虽然可以通过安全策略去防范,但是苹果决定一刀切,严格禁止游戏引擎由于不是利用反射机制实现的热更新,不能获取全部系统接口,所以目前苹果认为是安全的,无需警告笔者作为一名技术人员,以上所有内容,都是基于客观的技术层面进行讨论,请不要上升到“商业模式”、“生态闭环”等层面的“高度”。916 条评论分享收藏感谢收起}

我要回帖

更多关于 cocos2d js教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信