Unity接入TapPlay测试不通过的解决方案

暑期时候参加了学院的社会实践,任务是制作一款跟非遗传承相关的小游戏。当我和团队一起开发完成之后,想要上架TapTap。结果在接入TapPlay测试的时候出现了问题。

问题来源

第一次上传游戏包体的时候,由于不清楚目前游戏审核的形势,所以没有添加游戏开始前隐私政策的弹窗。因此TapTap那边的工作人员找到我,要求我在Unity程序启动前添加隐私政策弹窗。


图1: Taptap的人找到我

当我根据官方提供的解决方案对我的项目重新进行打包,然后提交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 = "隐私政策文本。。。";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        //如果已经同意过隐私协议则直接进入Unity Activity
        if (GetPrivacyAccept()){
            EnterUnityActivity();
            return;
        }
        ShowPrivacyDialog();//弹出隐私协议对话框
    }
 
    @Override
    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测试然后上架的话,也不失为一种可以尝试的途径,既不需要复杂的配置,也不需要深入了解太多的东西,只需要纯粹地添加字符串就行。