常見(jiàn)拒絕原因1:小游戲無(wú)錄屏功能,不符合平臺(tái)要求 2:小游戲錄屏?xí)r間小于3S,分享按鈕點(diǎn)擊無(wú)反應(yīng)或提示錯(cuò)誤文案,不符合平臺(tái)要求 3:小游戲錄屏?xí)r間大于300S,分享按鈕點(diǎn)擊無(wú)反應(yīng)或無(wú)法正常分享錄屏,不符合平臺(tái)要求
不久前寫(xiě)了款小游戲,最近上架了字節(jié)跳動(dòng)小游戲平臺(tái)。因?yàn)檫@款游戲在微信小游戲里被歸類(lèi)為角色扮演類(lèi)(微信平臺(tái)不允許個(gè)人開(kāi)發(fā)者上架角色類(lèi)游戲),因此考慮上架字節(jié)跳動(dòng),只要有軟件著作權(quán)即可。
游戲是之前在微信平臺(tái)已經(jīng)調(diào)試通的,所以只需要按照字節(jié)的要求做一點(diǎn)修改就可以了,主要變化如下:
1.支持匿名登錄
微信小游戲只需要調(diào)用wx.login獲得code,再用code去服務(wù)端調(diào)用code2Session就能拿到unionId了,有了unionId就基本完成登錄,后續(xù)可以繼續(xù)調(diào)用接口獲得昵稱(chēng),或者干脆讓用戶(hù)自己輸入昵稱(chēng)完成角色創(chuàng)建,簡(jiǎn)單粗暴。
字節(jié)小游戲則有一堆的要求,比如支持匿名登錄(彈出登錄框,用戶(hù)選擇拒絕,也要能以游客的身份登錄游戲游玩),又比如資料同步(本機(jī)有匿名登錄的角色資料,此時(shí)又切換到非匿名的賬號(hào)登錄,之前的匿名數(shù)據(jù)需要覆蓋到該賬號(hào)里,這一條就包含了很多需要處理的后臺(tái)邏輯)
start() {
this.labelProcess.string = "游戲初始化中";
this.login()
}
login() {
let _this = this;
tt.login({
force: true,
success(res) {
// 獲取用戶(hù)信息
tt.getUserInfo({
success(resUser) {
//用戶(hù)很乖,一路確定,允許登錄也允許撈取抖音昵稱(chēng)
console.log(`getUserInfo 調(diào)用成功`, resUser.userInfo);
console.log(res.code);
if (res.code) {
_this.init(res.code,res.anonymousCode,false, resUser.userInfo.nickName) //false表示非匿名,true表示匿名登錄
}
},
fail(resUser) {
//用戶(hù)允許登錄了,但不給獲取昵稱(chēng)的權(quán)限,這時(shí)候雖然昵稱(chēng)也是匿名用戶(hù),但不能算匿名登錄了,因?yàn)閞es.code可以拿到賬號(hào)APP唯一ID,后續(xù)可以在登錄的時(shí)候把抖音昵稱(chēng)更新到游戲里(如果用戶(hù)給昵稱(chēng)權(quán)限)
_this.init(res.code,res.anonymousCode,res,false, '匿名用戶(hù)')
},
});
},
fail(res) {
//login fail了,表示用戶(hù)拒絕了登錄,啟用匿名登錄,res.code就是空,此時(shí)用res.anonymousCode去后臺(tái)調(diào)用API拿手機(jī)識(shí)別碼,手機(jī)識(shí)別碼這玩意綁定的是手機(jī),可以拿來(lái)當(dāng)匿名角色主鍵用
_this.init(res.anonymousCode,true, '匿名用戶(hù)')
},
});
//以下是微信小游戲的登錄比較,要么給res.code,要么別玩,簡(jiǎn)單粗暴
// wx.login({
// success(res) {
// if (res.code) {
// //發(fā)起網(wǎng)絡(luò)請(qǐng)求
// _this.init(res.code)
// } else {
// _this.popupError.active = true;
// _this.labelError.string = "服務(wù)器維護(hù)中~\n\n請(qǐng)睡醒一覺(jué)再試!";
// }
// }
// })
}
Init方法就是跟后端交互了,拿著res.code或者res.anonymousCode去調(diào)用jscode2session接口(注意匿名和非匿名傳遞的是不同參數(shù)),拿到openid或者anonymous_openid作為游戲賬號(hào)主鍵即可。
上面的代碼有人可能要問(wèn)了,為啥非匿名登錄init的時(shí)候也要傳res.anonymousCode?不是有res.code嗎?這就涉及到上面說(shuō)的資料同步了,在用res.code換到openId以后,如果這個(gè)openId在游戲數(shù)據(jù)庫(kù)中不存在,我們需要用這個(gè)res.anonymousCode再去換一次anonymous_openid,如果anonymous_openid在我們游戲中存在,表示這個(gè)用戶(hù)之前匿名登錄玩過(guò),此時(shí)按照平臺(tái)要求需要把這個(gè)匿名資料同步給賬號(hào)(把數(shù)據(jù)庫(kù)里anonymous_openid Update成openid即可)為什么是update不是copy?因?yàn)槟涿Y料同步一次后就要清掉,不然頻繁切換賬號(hào)就能無(wú)限復(fù)制了是不是。
2.錄屏
大坑,只要第一次上抖音基本都會(huì)因?yàn)橄嚓P(guān)問(wèn)題被駁回,無(wú)外乎幾種情況:1.直接從微信小游戲移植到抖音的,飄的不行文檔也沒(méi)看,直接就沒(méi)有錄屏被打回 2.按照官方文檔或者網(wǎng)上找的資料,有功能但是不全被駁回的 3.游戲多場(chǎng)景比較復(fù)雜官方例子用了報(bào)錯(cuò)的
增加錄屏方式:
1.首先在游戲主要場(chǎng)景新增一個(gè)按鈕,增加點(diǎn)擊事件
btnRecordingClick() {
if (stateInfo.isRecording == true) { //如果正在錄制,把當(dāng)前錄制停止,文本替換成開(kāi)始錄制告訴用戶(hù)你可以繼續(xù)錄新的了
this.lblIsRecording.string = '開(kāi)始錄制'
this.stopRecordScreen()
}
else { //如果沒(méi)在錄制,則開(kāi)始錄,文本替換告訴用戶(hù)你現(xiàn)在正在錄
this.lblIsRecording.string = '停止錄制'
this.startRecordScreen()
}
}
因?yàn)槲业挠螒蚴嵌鄨?chǎng)景的,可能在這個(gè)場(chǎng)景點(diǎn)擊了錄制會(huì)跳轉(zhuǎn)到其他場(chǎng)景,所以是否在錄制的標(biāo)志位isRecording是放在一個(gè)單例的對(duì)象里,保證其他場(chǎng)景也能用到,如果是單場(chǎng)景的游戲直接放頁(yè)面里用this.就行了
開(kāi)始錄制方法(這個(gè)方法我是放在單例對(duì)象里的,如果是單場(chǎng)景游戲不需要加callback參數(shù),直接寫(xiě)里頭就行了)
public startRecordScreen(callback) {
if (!this.recorder) this.recorder = tt.getGameRecorderManager();
//注冊(cè)開(kāi)始錄屏的回調(diào),其實(shí)注冊(cè)一次就行這里偷懶了每次錄屏都注冊(cè)了一次
this.recorder.onStart(res => {
callback("開(kāi)始錄屏")
})
//注冊(cè)錄屏結(jié)束事件,偷懶*2
this.recorder.onStop(res => {
this.isRecording = false
clearInterval(this.actionRecord);
if (this.recordingSecond < 4) { //這里用3也可以,不想管邊界了就寫(xiě)了4
callback("錄屏小于3s,無(wú)法分享!")
}
else {
console.log(res.videoPath);
this.videoPath = res.videoPath; //如果錄屏成功,則獲取視頻文件的地址
callback("結(jié)束錄屏")
}
})
//開(kāi)始錄屏
this.recorder.start({
duration: 300
});
console.log('start')
this.isRecording = true
this.recordingSecond = 0;
//開(kāi)啟一個(gè)計(jì)時(shí)器,統(tǒng)計(jì)錄制了幾秒鐘,如果大于300則停止錄制
this.actionRecord = setInterval(() => {
this.recordingSecond++
if (this.recordingSecond >= 300) {
this.isRecording = false
clearInterval(this.actionRecord);
}
}, 1000);
}
結(jié)束錄制的方法
public stopRecordScreen(callback) {
//結(jié)束錄屏
if (this.recorder)
this.recorder.stop();
}
注意點(diǎn): this.recorder.start()如果不給參數(shù)默認(rèn)是10秒,時(shí)間到后APP會(huì)自動(dòng)關(guān)掉錄像并執(zhí)行onStop注冊(cè)的方法,如果是多場(chǎng)景游戲也需要把這個(gè)事件寫(xiě)到單例對(duì)象里去,以免onStop的時(shí)候原場(chǎng)景被銷(xiāo)毀了導(dǎo)致異常。
start以后需要啟動(dòng)個(gè)計(jì)數(shù)器統(tǒng)計(jì)錄了幾秒,如果啟動(dòng)不到3秒要給提示如果不給提示審核會(huì)直接打回。如果錄屏?xí)r間到達(dá)五分鐘上限,APP也會(huì)自動(dòng)關(guān)掉錄像,需要做好邏輯處理不然也會(huì)被打回。
3.分享
遇到個(gè)坑,原本的代碼我是寫(xiě)在錄屏的onStop里,類(lèi)似于 this.recorder.onStop(res => {tt.shareAppMessage(…)})的,在IOS里測(cè)試正常但是審核那邊卻彈不出分享框被打回了,百思不得姐查遍了資料,最后也不知道在哪看到個(gè)文章說(shuō)審核的手機(jī)是vivo,在vivo下是有差異的,于是換了個(gè)方式在onStop里彈出個(gè)對(duì)話(huà)框,對(duì)話(huà)框里放個(gè)分享按鈕,由這個(gè)按鈕去做分享,代碼如下
onbtnShareClick() {
let _this = this
tt.shareAppMessage({
templateId: "xxxxxx", // 替換成通過(guò)審核的分享ID
query: "",
channel: "video",
extra: {
videoPath: stateInfo.videoPath, // 可用錄屏得到的視頻地址
videoTopics: ['XXXX']
},
success() {
_this.ndShare.active = false
_this.showWarning("分享成功");
console.log("分享成功");
},
fail(e) {
_this.showWarning("取消分享");
console.log("分享失敗");
},
});
}
templateId必須要在控制臺(tái)通過(guò)運(yùn)營(yíng)能力-分享設(shè)置,通過(guò)審核后生成的分享ID,當(dāng)然也有其他的分享方式具體可看官方文檔,channel參數(shù)必須寫(xiě) "video"如果漏掉這個(gè)參數(shù)分享對(duì)話(huà)框里是不會(huì)有視頻的。
另外可以頁(yè)面上再放一個(gè)分享按鈕,邏輯也是這個(gè),這樣如果是多場(chǎng)景游戲,在其他場(chǎng)景中錄屏達(dá)到上限結(jié)束了(或者是在分享前不小心把這個(gè)對(duì)話(huà)框關(guān)掉了),玩家也能使用分享按鈕對(duì)錄好的視頻進(jìn)行分享。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-792425.html
以上,字節(jié)的審核非??鞆牡谝淮翁釋彽饺啃迯?fù)總共也就半天時(shí)間,這點(diǎn)還是比微信給力的。以上代碼僅供邏輯參考,可能有bug或者冗余代碼(比如計(jì)數(shù)器里頭),請(qǐng)見(jiàn)諒。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-792425.html
到了這里,關(guān)于cocos creator上架字節(jié)跳動(dòng)(抖音)小游戲注意事項(xiàng)(匿名登錄、錄屏、分享等踩坑記錄)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!