针对 Creator 2.1 及以下版本的 iOS 14 原生平台适配说明

首先感谢 @rochgh 同学的分享,本文仅仅是对其进行一次完整说明。

由于我们未能在 最新版 的 iOS 14 上重现问题,有可能苹果已经修复了这个 bug,也有可能是我们重现的方式不对,欢迎开发者们提供重现 demo 供我们进一步确认。


**Creator 1.x、2.0、2.1 版本的部分项目,升级到 iOS 14 后可能会在动态加载资源时遭遇黑屏。如果遇到这个问题的话需要手动进行适配。**新版本则无此问题。

问题的根源在于,Creator 2.2.0 之前在 iOS 14 上出于性能、包体的考虑一直使用的是 iOS 系统自带 的 JavaScriptCore(JSC)脚本引擎,JSC 在 iOS 上比之前 Cocos2d-JS 所用的 SpiderMonkey 会有一些性能优势。
但是 JSC 的实现并不规范,为了匹配 Creator 的类型系统,我们在引擎编译时做了 workaround,如 1.10 加入的 instanceof shim,还有之前的 typeof shim。但是 iOS 14 修改了自带的 JSC 的原有行为,使得我们的 typeof 判断跟着出错了。
(从 V8 支持 JIT-less 开始,我们也第一时间在 Creator 2.2.0 中把 iOS 上的 JSC 替换成了 V8,因此新版本用户已经没有这些问题了。)

适配方法:

一、打开编辑器安装目录下的 resources/engine/bin/jsb_polyfill.js 文件(Mac 在 Contents/Resources 目录下),替换文件末尾的最后一个函数体,原先代码:

function t(t) {
  ...
}

替换为:

function t(t) {
  return t && t.constructor === Function ? "function" : "object";
}

二、打开同目录下的 jsb_polyfill.dev.js,同样替换文件末尾的最后一个函数体,原先代码:

function __realTypeOfObj(obj) {
  ...
}

替换为:

function __realTypeOfObj(obj) {
  return obj && obj.constructor === Function ? "function" : "object";
}

替换后重新构建项目即可。构建后请重新在所有目标 iOS 操作系统版本上进行验证,而不仅仅是验证 iOS 14,确保都可以正常运行。

1赞

2个月前线上就有反馈这个问题了,后面就按照论坛某位大佬的教程修复掉了。

1赞

这是针对原生吗?

是的 123

@jare 如果IOS下使用的是SpiderMonkey 是不是就没有这个问题了呢?

是的,但是性能不够好

代码改完之后安卓设备更新完直接黑屏,creator1.8.2,有大佬遇到的吗

姿势不对吧,我项目之前是1.8.2后面升级到1.9.3 没问题

ccc1.9.3
.cache里面的文件生成是依赖源码的。
需要额外修改


1赞

你的项目勾选加密脚本了吗

如果使用了自定义引擎,重新build引擎以后,注意删除 engine/bin/.cache

ios14 字体描边都变成了黑色,什么情况?

我也是 同样遇到了字体描边变黑的情况 求解决方案
版本:2.3.3

1.9.2 版本 第一个替换的内容 怎么没有你所说的这个 函数体啊

@jare

留下足迹!!!!

12 楼不是可以吗?