Unity接入TapPlay测试不通过的解决方案
暑期时候参加了学院的社会实践,任务是制作一款跟非遗传承相关的小游戏。当我和团队一起开发完成之后,想要上架TapTap。结果在接入TapPlay测试的时候出现了问题。
问题来源
第一次上传游戏包体的时候,由于不清楚目前游戏审核的形势,所以没有添加游戏开始前隐私政策的弹窗。因此TapTap那边的工作人员找到我,要求我在Unity程序启动前添加隐私政策弹窗。
当我根据官方提供的解决方案对我的项目重新进行打包,然后提交TapPlay测试的时候,遇到了TapPlay有些机型测试不通过的情况,在接入隐私政策弹窗之后部分机型打开游戏会发生闪退。提供的检测报告中只提供了错误日志,这对我没有接触过安卓开发的人很是苦恼。
尝试各种解决方案
后来我硬着头皮看错误日志,又是问ai又是google bing的,找到的解决方案基本都没有什么用,可能我这个问题也比较小众。实在没招了,我去TapTap开发者平台提交工单,结果工单半天不回复,最后回复一个正在联系技术人员,这我得等到什么时候。
后来刷知乎时候看见评论区有位老哥似乎和我遇到了同类型的问题,作者说隐私政策需要改成不使用本地网页。这给了我一个突破点。于是我先根据这位知乎老哥的解决方案进行尝试,cv他的代码后再次打包提交测试,结果还是不通过,shift!
最后解决方案
后来我就想,要不我根本就不要使用网页了,我直接把隐私政策文本作为字符串放在unity启动项之前的PrivacyActivity.java这个启动项里面。由于最开始使用的是webview控件用于显示文本,因此第一次打包的时候我没有注意直接用”“来换行了,所以打包出来后的隐私政策弹窗里面的文字相当杂乱无章,可读性极差。但是我并没有立即修改,而是先尝试提交TapPlay平台用于测试,来验证我这个想法的正确性。
半个小时后,测试结果出来了,竟然测试通过了,哈哈哈。看来我这个想法没有问题。于是我开始对webview控件里显示的文字进行排版,然后打包后再次提交测试。结果竟然测试又不通过了,还是同样的机型,同样的闪退问题。
难道是webview的问题吗,我把webview删掉,使用textview控件来展示隐私政策文本,然后使用”\n”来换行。最后打包提交测试,没想到通过了!!
package com.unity3d.player;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.ScrollView;
import android.widget.TextView;
public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {
final String privacyContext = "隐私政策文本。。。";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果已经同意过隐私协议则直接进入Unity Activity
if (GetPrivacyAccept()){
EnterUnityActivity();
return;
}
ShowPrivacyDialog();//弹出隐私协议对话框
}
public void onClick(DialogInterface dialogInterface, int i) {
switch (i){
case AlertDialog.BUTTON_POSITIVE://点击同意按钮
SetPrivacyAccept(true);
EnterUnityActivity();//启动Unity Activity
break;
case AlertDialog.BUTTON_NEGATIVE://点击拒绝按钮,直接退出App
finish();
break;
}
}
private void ShowPrivacyDialog(){
ScrollView scrollView = new ScrollView(this);
TextView textView = new TextView(this);
textView.setText(privacyContext);
scrollView.addView(textView);
AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);
privacyDialog.setCancelable(false);
privacyDialog.setView(scrollView);
privacyDialog.setTitle("用户条款与隐私");
privacyDialog.setNegativeButton("取消",this);
privacyDialog.setPositiveButton("确认",this);
privacyDialog.create().show();
}
//启动Unity Activity
private void EnterUnityActivity(){
Intent unityAct = new Intent();
unityAct.setClassName(this, "com.unity3d.player.UnityPlayerActivity");
this.startActivity(unityAct);
}
//保存同意隐私协议状态
private void SetPrivacyAccept(boolean accepted){
SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
prefs.putBoolean("PrivacyAccepted", accepted);
prefs.apply();
}
private boolean GetPrivacyAccept(){
SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);
return prefs.getBoolean("PrivacyAccepted", false);
}
}
总之就是,使用webview控件在有些机型上就会出现奇怪的问题,把它删掉就好了。虽然这样看来这种做法有点粗糙,但是想要快点通过TapPlay测试然后上架的话,也不失为一种可以尝试的途径,既不需要复杂的配置,也不需要深入了解太多的东西,只需要纯粹地添加字符串就行。