【教程】Cocos Creator 对接TikTok指北

一、前情提要

 由于工作需要,最近开始接tiktok渠道,第一次听到tiktok最近才开始小游戏,下意识以为哪路营销机构号又开始炒作卖出海课程了,结果调研了一番,没想到真的是今年1月底才开始上线试点的功能,一时不知道如何吐槽,在国内都卷成红海的市场在海外居然才刚上线,过于令人不敢相信。

 不过一想到之前非大陆小游戏平台都是由FB掌舵,一时也不是不能接受,FB对于小游戏的资源投入越来越少,TK这时候开始做小游戏虽感觉有些晚了,但仍然是一个不错的选择,看看字节那边怎么做海外市场的合规了。

 由于我只是一个技术,此处不涉及到任何有关于开发者账号申请的环节,有意者可以自寻查阅官方文档,进一步研究,但我猜可能你需要一个HK的主体来做这件事,因为如果你想上架美区,TK有个专门的USDS审核。

二、前置条件

所需条件

  1. 一部安卓手机,最好有谷歌框架,安装最新版本的TK
  2. 开通了IAA的TK开发者平台账户(IAA需要额外开通)
  3. 最好是JP/US区的活跃TK账户

已知的坑

 之前是要一个测试版本的包体,但是现在不再需要了,但我这边用IOS的最新包扫测试二维码调不出来游戏,所以最好用安卓来调试游戏,不知道是否是BUG。

 同时有些TK号是没有灰度到这个功能的,如果是这种情况,你可以扫二维码进入游戏,但是你的侧边栏是不会有tiktok mini的字样的。如果没有的话,你可以尝试联系那边的运营,或者用其他设备注册一个新的JP/US账户。

三、开发者后台配置

好了,你应该是有一份平台后台的账户密码的,前往开发者后台登录你的账户:

https://developers.tiktok.com/


登录以后点击这里跳转到后台:

创建小游戏

在此处创建小游戏,填写一些相关信息,随即你可以获得小游戏的 APPIDClientKey

添加调试权限

其次,添加你自己用户的调试权限,否则在TikTok你无法扫二维码测试你的游戏。

在最新版本的TikTok下进行添加,操作路径如下:

添加完成以后就可以开始打包调试了。

四、Cocos 端接入

Login 接入

登录必须是要接入的,不接入无法在真机进行游戏测试,具体接入办法也很简单。

 首先,我们需要拿到一个授权的 code,在TK环境里面有一个全局的 TTMinis 的类,在里面调用 TTMinis.game.login ,里面需要传三个回调,一个 success,一个 fail,一个 complete,具体可以看文档里给的代码:


 其次,拿到 code 以后把这个传到服务器后端,后端需要给 openapi 传一个 POST 请求,里面包含 client_secret 一系列的东西, 不要把这些数据存到前端包里,也不要通过客户端发 ,具体要求见图:

后端配置完毕以后,login 对接结束。原始文档见:

https://bytedance.sg.larkoffice.com/docx/CG6wdxffcouMY3xIqQTlDEyWgBe?302from=wiki

用户留存

 在接入 login 以后还没有完善,还需要接两个用户留存的功能,一个是侧边栏,一个是桌面图标,这两个功能都需要美术出一个小UI引导一下用户,官方文档里面也提到了怎么去接,话术应该怎么套。

桌面图标

这里是基础的对接代码,过于简单不解释。

//添加到桌面
TTMinis.game.addShortcut({
  //成功
  success: () => {
    console.log("success");
  },
  //失败
  fail: (error) => {
    //错误代码
    const error_code = error.error_code;
    //错误信息
    const error_msg = error.error_msg;
    console.log("fail", error);
  },
  //完成
  complete: () => {
    console.log("complete");
  }
});

//判读用户是否可以领取添加到桌面奖励
TTMinis.game.getShortcutMissionReward({
  success: ({ canReceiveReward }) => {
    console.log("success", canReceiveReward);
  },
  fail: (error) => {
    //错误代码
    const error_code = error.error_code;
    //错误信息
    const error_msg = error.error_msg;
    console.log("fail", error);
  },
  complete: () => {
    console.log("complete");
  }
});

侧边栏

第二个需要对接的就是侧边栏,操作路径是这样的:

 这里有个坑要注意,TK 的侧边栏 API 是从 41.0.0 版本才开始支持的(按官方说法预计7月17日上线),所以调用之前最好先用 canIUse 做一下版本兼容判断,不然低版本直接调就崩了。当然,不做也行,因为低版本压根不会灰度到TK的小游戏功能,哈哈。

if (TTMinis.game.canIUse("startEntranceMission")) {
  TTMinis.game.startEntranceMission({
    success: () => {
      console.log("success");
    },
    fail: () => {
      console.log("fail");
    },
    complete: () => {
      console.log("complete");
    }
  });
}

startEntranceMission 就是拉起侧边栏引导复访的,没什么好说的,三个回调传进去就行。调用形式如下:

TTMinis.game.startEntranceMission({
  success: () => void;
  fail: () => void;
  complete: () => void;
});

getEntranceMissionReward 是用来判断用户是否可以领取侧边栏复访奖励的,success 回调里会给你一个 canReceiveReward 的 boolean,true 就是可以领:

TTMinis.game.getEntranceMissionReward({
  success: ({ canReceiveReward }) => {
    console.log("success", canReceiveReward);
  },
  fail: () => {
    console.log("fail");
  },
  complete: () => {
    console.log("complete");
  }
});

IAA 激励广告接入

 好了,基本的必要接入已经好了,剩下的IAA激励接入可以看文档自己实现,实现起来还是字节那套经典的API,没什么需要细讲的,下面是文档地址:

https://bytedance.larkoffice.com/wiki/JTEiw409LiLkUSk2SltcsAqonkg

激励广告的接入流程分三步:先创建广告实例,再注册回调,最后展示。

第一步 ,用 adUnitId 创建一个广告实例:

const rewardedVideoAd = TTMinis.game.createRewardedVideoAd({
  adUnitId: 'xxx'
});

第二步 ,注册关闭和报错回调,关闭回调里的 res.isEnded 是判断用户有没有看完的关键,true 才发奖励:

const handleClose = (res) => {
  rewardedVideoAd.offClose(handleClose);
  if (res.isEnded) {
    // 播放完成,发奖励
  } else {
    // 没看完,不发
  }
};
rewardedVideoAd.onClose(handleClose);

const handleError = (err) => {
  rewardedVideoAd.offError(handleError);
  console.log(err, '激励视频广告拉取或播放错误');
};
rewardedVideoAd.onError(handleError);

第三步 ,调 show 展示广告。这里要注意两个坑:

 一、是广告拉取或播放失败会自动退出,不会卡住;

 二、是每个 rewardedVideoAd 实例 只能 show 一次 ,用完就释放了,下次要重新 createRewardedVideoAd ,别复用同一个实例。

五、打包配置

配置请求域名

所有游戏里需要请求的域名都要填进去:

打包设置

在 Cocos 上打包你的游戏,注意打包平台选 字节小游戏 即可,不要选其他的,appid 正常填写。

 这里有个小问题,不知道为什么TK那边其实是接受直接上传H5(web-mobile)包的,但是你在使用TTMG测试的时候是必须要字节包才可以调试,否则会提示 game.js 未找到。对于此点,我暂且蒙在鼓里。

 TK那边上线可以传H5包,也可以传原生包。如果在引擎选了字节包的话,打出来的包就是他们要的原生包。似乎原生包是运行在他们自己模拟的一套运行环境,而H5包是运行在 WebView 上的,或许会和iOS端有什么关系?此处暂不做更多讨论,望大佬解读一下。

六、调试

 调试游戏需要用的是内部的 ttmg-cli 小工具。同时你的账户必须要有测试权限,测试权限的添加上面已经提到过了。

安装 ttmg-cli

  1. 安装 nodejs(不解释):下载 | Node.js 中文网
  2. 安装命令行工具:
# 我喜欢 pnpm,快试试 pnpm(推荐)
npm install pnpm -g
pnpm add @ttmg/cli
# 直接使用 npm
npm install @ttmg/cli -g
ttmg -v

npm 包地址:https://www.npmjs.com/package/@ttmg/cli

  1. 安装好以后登录一次,需要开发者账户的邮箱和密码:
ttmg login

调试流程

进入打包输出目录,启动调试:

cd path/to/your-game-project/build/bytedance
ttmg dev

首次调试需要填一下 client-key,获取途径上文已经提到:

首次调试后,本地命令行会记录上次调试的 Client Key:

随即就会弹出一个浏览器,里面长这样:

 下面那三个按钮按我的配置点开,然后如果要调试小游戏,直接用手机扫码即可。这三个选项分别是: 关闭白名单域名功能开启广告功能提示调试信息 。打开域名校验开关后,在开发者平台不注册域名也可正常发出请求;开启广告 Mock 以后可以正常测试广告功能。

 打开展示开发信息面板是因为我觉得好看。这里可以看到有两种模式,一种是 远程调试 ,一种是 真机预览 。远程调试需要在同一个网络环境,也就是连上同一个WiFi。

 开发文档里面说,"远程调试"是把渲染和操作都同步到电脑上了,实际上感觉只是把 Chrome 的调试器接进去了,然后还卡的要死,不过好处是可以直接在 Chrome 的 F12 开发者工具里面进行调试:

 另一种是真机调试,是模拟真实环境,会把包体上传到字节CDN以后给客户端进行下载,真机运行。但是在我测试里,无论是远程调试还是真机调试,都是需要上传包体的,所以他们这个到底是为了啥,我暂且不理解。

 侧边栏可以看到有一个代码预检的功能,其中可以看哪些API已经接入,哪些没有接入,不详细解释。

启动模式

 这里聊一下启动模式,这个功能比较关键,因为有些神秘原因,比如说账户地区、账户灰测没测上等等,你有可能是侧边栏拉不出来那个 TikTok Minis 字样的,这时候你需要用这里来调试。

 配置完了以后,直接在测试栏里面选择你刚才设置的模式,重新扫码即可。这样就能调试侧边栏功能是否接入成功了,和直接从APP的侧边栏进入是一样的效果。

 到这里基本要开发做的事情基本结束了,剩下的就是要运营来调试了,具体情况看你们那边的运营怎么说。

七、FAQ

Q1:广告拉不出来,控制台提示 inactive

优先检查一下是不是广告位 IAA 没有激活:

Q2:在抖音开发者工具里运行报错 ERROR 3121

ERROR 3121, please go to <https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#3121> to see details.

 打图集的时候注意不能使用 webp 格式,他们对 webp 格式到现在都没有一个比较好的优化,但是他们支持 ASTC 格式,你可以选择把图集打成 ASTC 10x10 的格式:

 或者打成PNG格式,然后在导出的时候挂一个插件压缩PNG图集,比如 https://store.cocos.com/app/detail/2419:

Q3:分包格式问题

 如图设置即可,注意要选小游戏分包,同时不需要配置远程包。TK渠道支持 30MB 的总包大小,绝大部分情况下都足够了,除非是想做热更。

差不多就这么多了,剩下如果还有问题可以加我的邮箱进一步探讨:<用户名>@foxmail.com

又或者是在论坛回复,如果我有时间看到的话我尽可能会回复的。

7赞

点个赞,当时自己刚开始接入这个新平台的时候头都大了,不过我自己懒一直没有开贴帮其他人,感恩所有愿意总结发帖分享经验的人。

我补充一点吧:如果碰到有什么奇奇怪怪的bug解决不了,不要用真机调试,得换成远程调试,这个真机调试会吞输出,明明看不到报错但是一直有问题,用远程调试之后就能在F12看见报错内容了,之前花了大半天才发现的,我也一个多月没接触tiktok了,不知道现在修复了没

1赞

mark~

mark~

只是做了一些微小的工作。
我其实对接的时候处于一个比较尴尬的状态,我接触不到sg字节那边的人,只能问发行商,就连文档入口都是从你这边找到的,整个过程完全是瞎摸索,他们的文档也是编排格式非常复杂,完全找不到重点,不过好在对接难度没有太过分