Developer Account Registration
Begin by registering a TapTap developer account, which requires 1-2 days for verification. Use the official registration portal: https://developer.taptap.cn/developer-apply/
Personal developers without software copyright certificates or publication licenses can only release trial versions. Applications with in-app purchases or paid content require proper documentasion. Select the appropriate account type during registration, as TapTap doesn't support conversion between personal and enteprrise accounts.
Privacy Consent Implementation
Applications must display a privacy consent dialog before accessing user data. Configure this in Unity:
- Navigate to Project Settings → Player → Publishing Settings
- Enable Custom Main Manifest
This generates AndroidManifest.xml in Assets/Plugins/Android. Modify the file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.PrivacyConsentActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="useLocalHtml" android:value="false" />
<meta-data android:name="policyUrl" android:value="YOUR_POLICY_URL" />
</activity>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
Create PrivacyConsentActivity.java in Android/com/unity3d/player:
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.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class PrivacyConsentActivity extends Activity implements DialogInterface.OnClickListener {
boolean useLocalContent = true;
String policyUrl = "YOUR_POLICY_URL";
final String localContent = "Application terms and privacy policy description...";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
ActivityInfo activityInfo = this.getPackageManager().getActivityInfo(
getComponentName(), PackageManager.GET_META_DATA);
useLocalContent = activityInfo.metaData.getBoolean("useLocalHtml");
policyUrl = activityInfo.metaData.getString("policyUrl");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (hasConsent()) {
launchMainActivity();
return;
}
displayConsentDialog();
}
@Override
public void onClick(DialogInterface dialog, int choice) {
switch (choice) {
case AlertDialog.BUTTON_POSITIVE:
saveConsent(true);
launchMainActivity();
break;
case AlertDialog.BUTTON_NEGATIVE:
finish();
break;
}
}
private void displayConsentDialog() {
WebView contentView = new WebView(this);
if (useLocalContent) {
contentView.loadDataWithBaseURL(null, localContent, "text/html", "UTF-8", null);
} else {
contentView.loadUrl(policyUrl);
contentView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError err) {
view.reload();
}
});
}
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setCancelable(false);
dialogBuilder.setView(contentView);
dialogBuilder.setTitle("Terms and Privacy");
dialogBuilder.setNegativeButton("Decline", this);
dialogBuilder.setPositiveButton("Accept", this);
dialogBuilder.create().show();
}
private void launchMainActivity() {
Intent mainIntent = new Intent();
mainIntent.setClassName(this, "com.unity3d.player.UnityPlayerActivity");
this.startActivity(mainIntent);
}
private void saveConsent(boolean accepted) {
SharedPreferences.Editor editor = getSharedPreferences("AppSettings", MODE_PRIVATE).edit();
editor.putBoolean("PrivacyConsent", accepted);
editor.apply();
}
private boolean hasConsent() {
SharedPreferences prefs = getSharedPreferences("AppSettings", MODE_PRIVATE);
return prefs.getBoolean("PrivacyConsent", false);
}
}
Build Configuration
Configure Unity for Android builds:
- Project Settings → Player → Other Settings → Configuration
- Set Scripting Backend to IL2CPP
- Enable both ARMv7 and ARM64 under Target Architectures
Build the APK file after completing these configurations.
Application Submission
Complete the developer profile with required information, including a valid website URL. Create the application listing for Mainland China region.
Key submission requirements:
- All materials must meet platform specifications
- Screenshots cannot be from in-game scenes
- Privacy policy URL is mandatory for trial versions
Generate privacy policy content using tools like https://toolbox.yolo.blue/privacy-policy-gen and host the document on platforms like YouDao Notes for URL generation.
Initially set the application to testing phase to identify device-specific issues before formal release. Update the status to正式上线(试玩版)when ready for public availability.