Player Network SDK 接入 - Unity
前提条件
游戏使用的每个 SDK 插件的版本(包括游戏启动器使用的版本)必须保持一致。如果游戏需要同时访问多个版本的 Player Network SDK,或者只有一个组件需要升级,请联系 Player Network 助手。
进入PlayerNetwork SDK 下载页面,按需选择对应的引擎和平台,下载PlayerNetwork SDK。详情可参考PlayerNetwork SDK 下载指引文档。
步骤1:安装 SDK
- Android
- iOS
- Windows
- SDK 1.27 及之后版本
- SDK 1.24 ~ 1.26
- SDK 1.24 之前版本
Unity 2021 ~ Unity 6
androidx
minSdkVersion: 21
targetSdkVersion: 34
compileSdkVersion: 34
如果接入 LINE,minSdkVersion 需要升级到 24。
如果接入 Discord,minSdkVersion 需要升级到 23。
项目提审前需注意:从 SDK V1.24.00 开始,Google 新增了 foreground service permissions 权限声明。如果该声明未通过 Google 审核,重新提交审核可能需要一周左右的时间。更多信息,请参见前台服务必须定义类型。
Unity 2021 ~ Unity 2022
androidx
minSdkVersion: 21
targetSdkVersion: 34
compileSdkVersion: 34
如果接入 LINE,minSdkVersion 需要升级到 24。
如果接入 Discord,minSdkVersion 需要升级到 23。
项目提审前需注意:从 SDK V1.24.00 开始,Google 新增了 foreground service permissions 权限声明。如果该声明未通过 Google 审核,重新提交审核可能需要一周左右的时间。更多信息,请参见前台服务必须定义类型。
Unity 2018 ~ Unity 2022
- Unity 2022 及之后版本
- Unity 2022 之前版本
androidx
minSdkVersion: 19
targetSdkVersion: 34
compileSdkVersion: 34
如果接入 VK,minSdkVersion 需要升级到 21。
如果接入 Discord,minSdkVersion 需要升级到 23。
androidx
minSdkVersion: 16
targetSdkVersion: 34
compileSdkVersion: 34
如果接入 LINE,minSdkVersion 需要升级到 19。
如果接入 Firebase,minSdkVersion 需要升级到 19,Android Gradle 需要升级到 V6.7.1 或以上,Android Gradle Plugin 需要升级到 V4.2.0 或以上。
如果接入 VK,minSdkVersion 需要升级到 21。
如果接入 Discord,minSdkVersion 需要升级到 23。
如果接入 Adjust,minSdkVersion 需要升级到 18。
1. 将 Player Network SDK 添加到您的项目
- 解压 SDK 软件包。
- 将
INTLSDK文件夹复制到项目的Assets文件夹中。 - 将 Player Network SDK 的
Plugins文件夹合并到项目的Plugins文件夹中。
Player Network SDK package
├─INTLSDK // Player Network SDK CS scripts which provide APIs and callbacks
│ ├─Editor // Player Network SDK Editor scripts which include Player Network SDK XUPorter
│ └─Scripts // Player Network SDK scripts which include INTLCore and other plugin scripts
├─LevelInfinite // LI PASS APIs
├─Plugins // Player Network SDK plugins for various platforms
│ ├─Android
│ ├─iOS
│ ├─MacOS
│ └─Windows~
├─Symbols // Player Network SDK symbol table *.so files
└─UnionAdapter // UnionAdpater APIs which adapts to both MSDK and Player Network SDK
INTLSDK/Scripts/INTLCore
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| └─INTLCore
| ├─Editor // INTLCore PostProcess.cs / PreProcess.cs files for different platforms
| | ├─INTLCoreAndroidPostProcess.cs
| | ├─INTLCoreiOSPostProcess.cs
| | ├─INTLCoreMacOSPostProcess.cs
| | ├─INTLCoreWindowsPostProcess.cs
| | └─INTLCoreWindowsPreProcess.cs
| └─Scripts // INTLCore scripts
| ├─INTLAPI.cs // Player Network SDK APIs
| ├─INTLConfig.cs // Player Network SDK data structures
| ├─INTLDefine.cs // Player Network SDK static strings
| ├─INTLErrorCode.cs // Player Network SDK error codes
| ├─Modules
| └─Utils
├─LevelInfinite
├─Plugins
├─Symbols
└─UnionAdapter
INTLSDK/Script/INTLConfig
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| | └─Editor // Player Network SDK configuration files, PostProcess.cs files, and encryption tools
| | ├─Encrypt
| | | ├─decrypt // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─Decrypt.exe // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─encrypt // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─Encrypt.exe // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─EncryptConfig.ini // Player Network SDK file to enable or disable INTLConfig.ini encryption
| | | ├─INTLConfigINI.cs
| | | ├─INTLConfigINIEditor.cs
| | | └─INTLEditorTools.cs
| | ├─INTLConfigAndroidPostProcess.cs
| | ├─INTLConfigiOSPostProcess.cs
| | ├─INTLConfigMacOSPostProcess.cs
| | ├─INTLConfigSwitchPreProcess.cs
| | ├─INTLConfigWind...sPostProcess.cs
| | └─Resources // Player Network SDK configurations
| | ├─APASConfig.ini // APAS device level configuration file
| | └─INTLConfig.ini // Player Network SDK main configuration file
| └─INTLCore
├─LevelInfinite
└─Plugins
2. 加载所需的权限和插件
如果您的游戏尚未创建 Android 自定义 activity,请参见 Create a custom activity。
添加用于加载权限、库和插件的 Player Network SDK 代码至自定义启动 activity(Android 游戏会在此处请求权限和加载插件)。
为加载库添加代码
static {
try {
System.loadLibrary("INTLFoundation");
System.loadLibrary("INTLCore");
System.loadLibrary("INTLUnityAdapter");
}
catch (Exception e) {
e.printStackTrace();
}
}
注册 activity 生命周期
import com.intlgame.api.INTLSDK;
import android.content.Intent;
import android.os.Bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// add this line
INTLSDK.initialize(MainActivity.this);
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// add this line
INTLSDK.onNewIntent(intent);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// add this line
INTLSDK.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int arg0, String[] arg1, int[] arg2) {
super.onRequestPermissionsResult(arg0, arg1, arg2);
// add this line
INTLSDK.onRequestPermissionsResult(arg0, arg1, arg2);
}
载入动态权限
通过代码获取动态权限
添加以下代码以动态申请权限:
import android.app.Activity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
private void RequestPermission(Activity activity, List<String> permissionList, int requestCode) {
if (null != activity && null != permissionList) {
List<String> permissionNeeded = new ArrayList();
for (int i = 0; i < permissionList.size(); ++i) {
String permission = (String) permissionList.get(i);
if (null != permission && 0 != ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission)) {
permissionNeeded.add(permission);
}
}
if (permissionNeeded.size() > 0) {
ActivityCompat.requestPermissions(activity, (String[]) permissionNeeded.toArray(new String[permissionNeeded.size()]), requestCode);
}
}
}
private void RequestDynamicPermissions() {
List<String> permissions = new ArrayList();
permissions.add("android.permission.INTERNET");
permissions.add("android.permission.READ_PHONE_STATE");
this.RequestPermission(this, permissions, 100);
}
调用 RequestDynamicPermissions:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// add this line
RequestDynamicPermissions();
INTLSDK.initialize(MainActivity.this);
}
异型屏兼容设置
在 Android P 之后,Android 已为异型屏提供标准 API。但对于 Android O 设备,不同供应商存在不同的实现逻辑。Player Network SDK 提供了统一的 C++ API 和 Java API,以支持小米、华为、三星、VIVO 和 OPPO 等不同的 Android O 设备。
Player Network SDK 包含了一个 INTLUnityAdapter 模块,支持 Unity 游戏使用 C# 对 C++ API 进行非托管调用。更多信息,请参见 异步异形屏信息读取。
一般上,手机的全屏纵横比大于2.1。为避免黑边,用户必须将 android.max_aspect 修改为2.1以上。
对于使用 Android Oreo 操作系统的华为和小米手机,用户必须配置 AndroidManifest。
<!--Supports full-screen aspect ratio of 2.4 to adapt to the future 21:9 ultra-widescreen-->
<meta-data android:name="android.max_aspect" android:value="2.4" />
<!--Xiaomi O version definition: Whether to use ear areas (high-risk area)-->
<!--values:
none: ear areas not rendered in portrait or landscape mode,
portrait: ear areas rendered in portrait mode,
landscape: ear areas rendered in landscape mode,
portrait|landscape: ear areas rendered in both portrait and landscape mode
-->
<meta-data android:name="notch.config" android:value="portrait|landscape"/>
<!--Huawei O version definition: App pages use notch area-->
<meta-data android:name="android.notch_support" android:value="true"/>
对于使用 Android API 获取异型屏安全区域信息的游戏,请添加以下配置:
在 MainActivity 中添加以下代码。
import android.os.Build;
import android.view.WindowManager;
import android.view.View;
private void setFullScreen()
{
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// Set full screen
int systemUiVisibility = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
systemUiVisibility = this.getWindow().getDecorView().getSystemUiVisibility();
int flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
systemUiVisibility |= flags;
getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
}
// P version is allowed to use the notch area
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
this.getWindow().setAttributes(lp);
}
}
在此调用 setFullScreen()。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// add this line
setFullScreen();
this.RequestDynamicPermissions();
INTLSDK.initialize(this);
}
在 PlayerSetting 中,选择 Render outside safe area.

3. 生成 JAR 包
在生成 JAR 包前,将 Plugins/Android/AndroidManifest.xml 内的 com.intlgame.unity.MainActivity 全部替换为游戏的实际包名,例如 com.example.myapp.MainActivity。
Player Network SDK 使用 Gradle 生成 JAR 包。Gradle 配置文件包括第三方 SDK 版本号以及 Player Network SDK 和第三方渠道所需的依赖项。游戏需要根据所需的插件添加必要的依赖项。
mainTemplate.gradle 和 INTLCore.mainTemplate.gradle 文件是 Player Network SDK Gradle 配置文件。请根据游戏需求更新 Gradle 配置。
Unity 2018
| 文件 | 文件路径 |
|---|---|
| mainTemplate.gradle | Plugins/Android |
| INTLCore.mainTemplate.gradle | Plugins/Android/Gradle |
至少有两项更新:
- 将您游戏中的
mainTemplate.gradle合并到 Player Network SDK 中的mainTemplate.gradle中,并保留 Player Network SDK 标记的内容。
buildscript {
repositories {**ARTIFACTORYREPOSITORY**
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
maven {
url "https://mirrors.tencent.com/nexus/repository/maven-public/"
}
maven {
url "https://mirrors.tencent.com/repository/maven/thirdparty"
}
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
mavenCentral()
google()
jcenter()
}
dependencies {
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
classpath 'com.android.tools.build:gradle:4.0.1'
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
**BUILD_SCRIPT_DEPS**
}
}
allprojects {
repositories {**ARTIFACTORYREPOSITORY**
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
maven {
url "https://mirrors.tencent.com/nexus/repository/maven-public/"
}
maven {
url "https://mirrors.tencent.com/repository/maven/thirdparty"
}
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
mavenCentral()
google()
jcenter()
flatDir {
dirs 'libs'
}
}
}
- 按照第三方渠道集成的说明进行操作。
- 将
INTLCore.mainTemplate.gradle中的{placeholder}文本替换为 INTLConfig.ini 配置文件中的值。
android {
compileSdkVersion rootProject.ext.common.compileSdkVersion
buildToolsVersion rootProject.ext.common.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.common.minSdkVersion
targetSdkVersion rootProject.ext.common.targetSdkVersion
multiDexEnabled rootProject.ext.common.minSdkVersion < 21
manifestPlaceholders = [
"FACEBOOK_APPID" : "{INTL_FACEBOOK_APP_ID}",
"GOOGLE_APPID" : '{INTL_GOOGLE_APP_ID}',
"FACEBOOK_CLIENT_TOKEN" : "{INTL_FACEBOOK_CLIENT_TOKEN}",
'GOOGLEPGS_APPID' : '{INTL_GOOGLEPGS_APPID}',
'VK_APPID' : '{INTL_VK_APP_ID}',
'GARENA_APP_ID' : '{INTL_GARENA_APP_SDK_ASSIGN_ID}',
'QQ_APPID' : '{INTL_QQ_APP_ID}',
'GOOGLE_CLIENT_ID' : '{INTL_GOOGLE_CLIENT_KEY_ANDROID}',
'DISCORD_APP_ID' : '{INTL_DISCORD_APP_ID}',
'DISCORD_REDIRECT_SCHEME' : '{INTL_DISCORD_REDIRECT_SCHEME}',
'DISCORD_REDIRECT_HOST' : '{INTL_DISCORD_REDIRECT_HOST}',
'DISCORD_REDIRECT_PATH' : '{INTL_DISCORD_REDIRECT_PATH}',
'DMM_LOGIN_ACTIVITY_DATA_SCHEME': '{INTL_DMM_LOGIN_ACTIVITY_DATA_SCHEME}',
'WEBVIEW_TASK_AFFINITY' : '',
'VNG_GG_APP_ID' : '{INTL_VNG_GG_APP_ID}',
'VNG_GG_CLIENT_TOKEN' : '{INTL_VNG_GG_CLIENT_TOKEN}',
]
}
}
Unity 2019 及以上
| 文件 | 文件路径 |
|---|---|
| mainTemplate.gradle | Plugins/Android |
| baseProjectTemplate.gradle | Plugins/Android |
| launcherTemplate.gradle | Plugins/Android |
| INTLCore.mainTemplate.gradle | Plugins/Android/Gradle |
| INTLCore.baseProjectTemplate.gradle | Plugins/Android/Gradle |
| INTLCore.launcherTemplate.gradle | Plugins/Android/Gradle |
至少存在两项更新:
- 将游戏中的
mainTemplate.gradle、baseProjectTemplate.gradle和launcherTemplate.gradle合并到 Player Network SDK 中相应的 Gradle 文件中,并保留 Player Network SDK 标记的内容。
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK - INTLCore ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
dependencies {
implementation "androidx.appcompat:appcompat:1.4.0-alpha03"
implementation "androidx.annotation:annotation:1.0.0"
implementation "com.google.android.gms:play-services-ads-identifier:17.0.0"
// Migrated to :app
// implementation "com.google.android.play:core:1.10.0"
}
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK - INTLCore ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK - INTLFacebook ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
dependencies {
implementation "androidx.annotation:annotation:1.0.0"
implementation "com.facebook.android:facebook-login:16.1.3"
implementation "com.facebook.android:facebook-share:16.1.3"
implementation "com.facebook.android:facebook-core:16.1.3"
implementation "com.facebook.android:facebook-gamingservices:16.1.3"
implementation "com.facebook.android:facebook-common:16.1.3"
implementation "com.facebook.android:facebook-applinks:16.1.3"
}
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK - INTLFacebook ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Player Network SDK ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
apply from: "$rootDir/INTL.Gradle/INTLCore.mainTemplate.gradle"
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Player Network SDK ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
- 按照第三方渠道集成的说明进行操作。
- 将
INTLCore.launcherTemplate.gradle中的{placeholder}文本替换为INTLConfig.ini配置文件中的值。
android {
compileSdkVersion rootProject.ext.common.compileSdkVersion
buildToolsVersion rootProject.ext.common.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.common.minSdkVersion
targetSdkVersion rootProject.ext.common.targetSdkVersion
multiDexEnabled rootProject.ext.common.minSdkVersion < 21
manifestPlaceholders = [
"FACEBOOK_APPID" : "{INTL_FACEBOOK_APP_ID}",
"FACEBOOK_CLIENT_TOKEN" : "{INTL_FACEBOOK_CLIENT_TOKEN}",
"GOOGLE_APPID" : '{INTL_GOOGLE_APP_ID}',
'GOOGLEPGS_APPID' : '{INTL_GOOGLEPGS_APPID}',
'VK_APPID' : '{INTL_VK_APP_ID}',
'GARENA_APP_ID' : '{INTL_GARENA_APP_SDK_ASSIGN_ID}',
'QQ_APPID' : '{INTL_QQ_APP_ID}',
'GOOGLE_CLIENT_ID' : '{INTL_GOOGLE_CLIENT_KEY_ANDROID}',
'DISCORD_APP_ID' : '{INTL_DISCORD_APP_ID}',
'DISCORD_REDIRECT_SCHEME' : '{INTL_DISCORD_REDIRECT_SCHEME}',
'DISCORD_REDIRECT_HOST' : '{INTL_DISCORD_REDIRECT_HOST}',
'DISCORD_REDIRECT_PATH' : '{INTL_DISCORD_REDIRECT_PATH}',
'DMM_LOGIN_ACTIVITY_DATA_SCHEME': '{INTL_DMM_LOGIN_ACTIVITY_DATA_SCHEME}',
'WEBVIEW_TASK_AFFINITY' : '',
'VNG_GG_APP_ID' : '{INTL_VNG_GG_APP_ID}',
'VNG_GG_CLIENT_TOKEN' : '{INTL_VNG_GG_CLIENT_TOKEN}',
]
}
}
4. Player Network SDK 配置
手动修改 INTLConfig.ini 配置时,请联系 Player Network 助手确认内容变更是否符合预期,详见 SDK Config 须知。
请按照 INTLConfig.ini 的说明进行相应配置。
5. 初始化 Player Network SDK
在集成第三方渠道之前,必须先初始化 Player Network SDK。更多详情,请参见 初始化 SDK。
using INTL;// import INTL namespace
void InitializeINTLSDK()
{
INTLAPI.IsDebug = true; // 设置 SDK 为 Debug 模式打印出日志,默认为 false
INTLAPI.InitSDK();
}
- SDK 1.27 及之后版本
- SDK 1.24 ~ 1.26
- SDK 1.24 之前版本
Unity 2021 - Unity 6
Unity 2021 ~ Unity 2022
Unity 2018 ~ Unity 2022
1. 将 Player Network SDK 添加到您的项目
- 解压 SDK 软件包。
- 将
INTLSDK文件夹复制到项目的Assets文件夹中。 - 将 Player Network SDK 的
Plugins文件夹合并到项目的Plugins文件夹中。
Player Network SDK package
├─INTLSDK // Player Network SDK CS scripts which provide APIs and callbacks
│ ├─Editor // Player Network SDK Editor scripts which include Player Network SDK XUPorter
│ └─Scripts // Player Network SDK scripts which include INTLCore and other plugin scripts
├─LevelInfinite // LI PASS APIs
├─Plugins // Player Network SDK plugins for various platforms
│ ├─Android
│ ├─iOS
│ ├─MacOS
│ └─Windows~
├─Symbols // Player Network SDK symbol table *.so files
└─UnionAdapter // UnionAdpater APIs which adapts to both MSDK and Player Network SDK
INTLSDK/Scripts/INTLCore
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| └─INTLCore
| ├─Editor // INTLCore PostProcess.cs / PreProcess.cs files for different platforms
| | ├─INTLCoreAndroidPostProcess.cs
| | ├─INTLCoreiOSPostProcess.cs
| | ├─INTLCoreMacOSPostProcess.cs
| | ├─INTLCoreWindowsPostProcess.cs
| | └─INTLCoreWindowsPreProcess.cs
| └─Scripts // INTLCore scripts
| ├─INTLAPI.cs // Player Network SDK APIs
| ├─INTLConfig.cs // Player Network SDK data structures
| ├─INTLDefine.cs // Player Network SDK static strings
| ├─INTLErrorCode.cs // Player Network SDK error codes
| ├─Modules
| └─Utils
├─LevelInfinite
├─Plugins
├─Symbols
└─UnionAdapter
INTLSDK/Script/INTLConfig
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| | └─Editor // Player Network SDK configuration files, PostProcess.cs files, and encryption tools
| | ├─Encrypt
| | | ├─decrypt // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─Decrypt.exe // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─encrypt // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─Encrypt.exe // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─EncryptConfig.ini // Player Network SDK file to enable or disable INTLConfig.ini encryption
| | | ├─INTLConfigINI.cs
| | | ├─INTLConfigINIEditor.cs
| | | └─INTLEditorTools.cs
| | ├─INTLConfigAndroidPostProcess.cs
| | ├─INTLConfigiOSPostProcess.cs
| | ├─INTLConfigMacOSPostProcess.cs
| | ├─INTLConfigSwitchPreProcess.cs
| | ├─INTLConfigWind...sPostProcess.cs
| | └─Resources // Player Network SDK configurations
| | ├─APASConfig.ini // APAS device level configuration file
| | └─INTLConfig.ini // Player Network SDK main configuration file
| └─INTLCore
├─LevelInfinite
└─Plugins
2. 加载所需的权限和插件
XUPorter 在导出 Xcode 项目时自动添加依赖库和源代码文件,以方便打包。
Player Network SDK 优化了 XUPorter 的原始版本,从而避免了 XUPorter 解决方案与 Player Network SDK 解决方案之间的冲突。
- 添加了
INTLSDKEditor命名空间,以避免其他组件也使用 XUPorter 时发生命名冲突。 - 更改了 MODS 文件的搜索路径。这样,Player Network SDK XUPorter 只搜索
INTLSDK/目录中的 MODS 文件,而不是重复添加其他组件的配置。 - 生命周期被添加到
UnityAppController.mm中。
Player Network SDK XUPorter 解决方案
INTL{Plugin}Kit.projmods 是 Player Network SDK 的 Info.plist 配置文件。Player Network SDK 会读取 INTLSDK/Editor/XUPorter/Mods 目录中的 INTL{Plugin}Kit.projmods 文件,并在 Xcode 中添加导入的 bundle、框架和其他依赖包。
由于每个 INTL{Plugin}Kit.projmods 文件都对应一个插件,游戏需要根据游戏对插件的要求更新每个文件,并用 INTLConfig.ini 配置文件中的值替换 {placeholder} 文本。
例如,更新 INTLFacebookKit.projmods 以获得所需的配置。
"Info.plist":{
"LSApplicationQueriesSchemes":
[
"fb",
"fb-messenger-api",
"fbshareextension",
"fbauth2",
"fb-messenger-share-api",
"fbapi"
],
"NSAppTransportSecurity":
{
"NSAllowsArbitraryLoads":true
},
"FacebookClientToken":"{INTL_FACEBOOK_CLIENT_TOKEN}",
"CFBundleURLTypes" :
[
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Facebook",
"CFBundleURLSchemes":["fb{INTL_FACEBOOK_APP_ID}"]
}
]
}
iOS 使用说明
集成时,用户可根据自己的需要修改内容,并 与法律团队确认内容是否合规。如果没有修改,请用游戏名称替换 INTLSample。
根据 iOS 权限要求,在申请敏感权限时,当系统弹出提示用户填写信息时,填写 用途描述。
-
在
Assets/INTLSDK/Editor/XUPorter/Mods~/INTLCoreKit.projmods中,以下权限已升级:"NSPhotoLibraryUsageDescription"
"NSCameraUsageDescription"
"NSLocationWhenInUseUsageDescription"
"NSPhotoLibraryAddUsageDescription"
"NSMicrophoneUsageDescription"集成时,用户可以根据需要修改内容。
-
在
Assets/INTLSDK/Editor/XUPorter/Mods~/INTLADTrackingKit.projmods中,以下权限已升级:"NSUserTrackingUsageDescription"
3. 合并隐私清单
版本要求:Player Network SDK V1.22 及更高版本
从 2024 年春季开始,对于需更新或上传至 Apple App Store Connect 的应用,开发者需明确 注明使用原因,以展示该应用如何使用 required reason API(需提交使用原因的 API)。更多信息,请参见 即将发布的第三方 SDK 要求。
对于受影响的 Player Network SDK 插件,需要手动合并的包括 INTLFoundation、INTLCore、INTLGarena,其中 INTLGarena 只在项目确认接入 Garena 时需配置。
另外,INTLLine 已在 Player Network SDK 自动整合而无需额外操作。
由于其他第三方 SDK 的隐私清单尚未公布,目前 Player Network SDK 隐私清单中不包含对应的内容。要查看尚未发布插件的列表,请参见 iOS 17 隐私清单。
步骤
-
在 Player Network SDK 产物目录内找到所需插件的隐私清单
PrivacyInfo.xcprivacy。
- Unity
- Unreal Engine
插件 路径 INTLFoundation /Plugins/iOS/INTLSDK/INTLFoundation/INTLFoundation.framework/PrivacyInfo.xcprivacy INTLCore /Plugins/iOS/INTLSDK/INTLCore/INTLCore.framework/PrivacyInfo.xcprivacy INTLGarena /Plugins/iOS/INTLSDK/INTLGarena/INTLGarena.framework/PrivacyInfo.xcprivacy 插件 路径 INTLFoundation /INTLSDK/Source/INTLFoundation/Libs/iOS/INTLFoundation/INTLFoundation.embeddedframework/INTLFoundation.framework/PrivacyInfo.xcprivacy INTLCore /INTLSDK/Source/INTLCore/Libs/iOS/INTLCore/INTLCore.embeddedframework/INTLCore.framework/PrivacyInfo.xcprivacy INTLGarena /INTLSDK/Source/INTLGarena/Libs/iOS/INTLGarena/INTLGarena.embeddedframework/INTLGarena.framework/PrivacyInfo.xcprivacy -
将 Player Network SDK 内的
PrivacyInfo.xcprivacy中的4个节点,用于与游戏项目内PrivacyInfo.xcprivacy中对应的内容进行比较,并根据以下条件合并。

-
Privacy Nutrition Label Types (NSPrivacyCollectedDataTypes)为使用数据的类型描述节点:
比较各个item的Collected Data Type (NSPrivacyCollectedDataType),有不同值则添加至游戏项目文件。
若存在相同值则比较Collection Purposes (NSPrivacyCollectedDataTypePurposes),有不同值则添加至游戏项目文件。

-
Privacy Tracking Domains (NSPrivacyTrackingDomains)为域名追踪列表节点:
比较对应节点,有不同值则添加至游戏项目文件。 -
Privacy Tracking Enabled (NSPrivacyTracking)描述是否开启 App Tracking Transparency 功能:
比较对应节点,Player Network SDK 隐私清单的值为YES时修改游戏项目文件。 -
Privacy Accessed API Types (NSPrivacyAccessedAPITypes)为使用接口的类型描述节点:
比较各个item的Privacy Accessed API Type (NSPrivacyAccessedAPIType),有不同值则添加至游戏项目文件。
若存在相同值则比较Privacy Accessed API Reasons (NSPrivacyAccessedAPITypeReasons),有不同值则添加至游戏项目文件。

-
-
通过 Xcode 15 生成隐私报告来验证是否符合预期。

4. Player Network SDK 配置
手动修改 INTLConfig.ini 配置时,请联系 Player Network 助手确认内容变更是否符合预期,详见 SDK Config 须知。
请按照 INTLConfig.ini 的说明进行相应配置。
5. 初始化 Player Network SDK
在集成第三方渠道之前,必须先初始化 Player Network SDK。更多详情,请参见 初始化 SDK。
using INTL;// import INTL namespace
void InitializeINTLSDK()
{
INTLAPI.IsDebug = true; // 设置 SDK 为 Debug 模式打印出日志,默认为 false
INTLAPI.InitSDK();
}
- SDK 1.27 及之后版本
- SDK 1.24 ~ 1.26
- SDK 1.24 之前版本
Unity 2021 - Unity 6
Unity 2021 ~ Unity 2022
Unity 2018 ~ Unity 2022
支持 64-bit 的 Windows 7、Windows 10、Windows 11 操作系统。
由于 Windows 平台的特性,游戏的安装目录不能含有英文字符分号(;),否则会导致游戏无法找到必要的 DLL,导致游戏运行失败。
如果 Windows 平台接入 Google、Facebook、LINE、Apple 等渠道,需要引入 WebView。
建议基于 Microsoft Visual C++ Redistributable 2015-2022 编译器运行。
-
Windows 7:
- 安装 Microsoft Visual C++ Redistributable packages 并添加
VC_redist.x64.exe /install /quiet /norestart命令到安装程序脚本。 - 安装 Windows 7 安全更新 (KB3063858)。
- 安装 Microsoft Visual C++ Redistributable packages 并添加
-
Windows 8 和 Windows 8.1:
安装 Microsoft Visual C++ Redistributable packages 并添加
VC_redist.x64.exe /install /quiet /norestart命令到安装程序脚本。
1. 将 Player Network SDK 添加到您的项目
- 解压 SDK 软件包。
- 将
INTLSDK文件夹复制到项目的Assets文件夹中。 - 将 Player Network SDK 的
Plugins文件夹合并到项目的Plugins文件夹中。
Player Network SDK package
├─INTLSDK // Player Network SDK CS scripts which provide APIs and callbacks
│ ├─Editor // Player Network SDK Editor scripts which include Player Network SDK XUPorter
│ └─Scripts // Player Network SDK scripts which include INTLCore and other plugin scripts
├─LevelInfinite // LI PASS APIs
├─Plugins // Player Network SDK plugins for various platforms
│ ├─Android
│ ├─iOS
│ ├─MacOS
│ └─Windows~
├─Symbols // Player Network SDK symbol table *.so files
└─UnionAdapter // UnionAdpater APIs which adapts to both MSDK and Player Network SDK
INTLSDK/Scripts/INTLCore
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| └─INTLCore
| ├─Editor // INTLCore PostProcess.cs / PreProcess.cs files for different platforms
| | ├─INTLCoreAndroidPostProcess.cs
| | ├─INTLCoreiOSPostProcess.cs
| | ├─INTLCoreMacOSPostProcess.cs
| | ├─INTLCoreWindowsPostProcess.cs
| | └─INTLCoreWindowsPreProcess.cs
| └─Scripts // INTLCore scripts
| ├─INTLAPI.cs // Player Network SDK APIs
| ├─INTLConfig.cs // Player Network SDK data structures
| ├─INTLDefine.cs // Player Network SDK static strings
| ├─INTLErrorCode.cs // Player Network SDK error codes
| ├─Modules
| └─Utils
├─LevelInfinite
├─Plugins
├─Symbols
└─UnionAdapter
INTLSDK/Script/INTLConfig
├─INTLSDK
│ ├─Editor
│ └─Scripts
│ ├─INTLConfig
| | └─Editor // Player Network SDK configuration files, PostProcess.cs files, and encryption tools
| | ├─Encrypt
| | | ├─decrypt // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─Decrypt.exe // Player Network SDK decryption tool for INTLConfig.ini
| | | ├─encrypt // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─Encrypt.exe // Player Network SDK encryption tool for INTLConfig.ini
| | | ├─EncryptConfig.ini // Player Network SDK file to enable or disable INTLConfig.ini encryption
| | | ├─INTLConfigINI.cs
| | | ├─INTLConfigINIEditor.cs
| | | └─INTLEditorTools.cs
| | ├─INTLConfigAndroidPostProcess.cs
| | ├─INTLConfigiOSPostProcess.cs
| | ├─INTLConfigMacOSPostProcess.cs
| | ├─INTLConfigSwitchPreProcess.cs
| | ├─INTLConfigWind...sPostProcess.cs
| | └─Resources // Player Network SDK configurations
| | ├─APASConfig.ini // APAS device level configuration file
| | └─INTLConfig.ini // Player Network SDK main configuration file
| └─INTLCore
├─LevelInfinite
└─Plugins
2. 更改缓存目录
默认情况下,Player Network SDK PC 用户和应用程序生成的缓存目录为:
C:/ProgramData/INTLC:/Users/{name}/AppData/Local/INTL/local/INTL。
在调用 InitSDK 之前,游戏开发者必须设置缓存目录。更多信息,请参见 更改用户数据文件夹目录 API。
// For example, game id is 11, and the game application name is INTLSDKDemo.
// Then the game invokes the interface like this:
INTLAPI.SetSDKDefaultUserStorage("D:\\game_data\\");
// The data cache path for Player Network SDK will be D:\game_data\11\INTLSDKDemo\.
3. Player Network SDK 配置
手动修改 INTLConfig.ini 配置时,请联系 Player Network 助手确认内容变更是否符合预期,详见 SDK Config 须知。
请按照 INTLConfig.ini 的说明进行相应配置。
4. 初始化 Player Network SDK
在集成第三方渠道之前,必须先初始化 Player Network SDK。更多详情,请参见 初始化 SDK。
using INTL;// import INTL namespace
void InitializeINTLSDK()
{
INTLAPI.IsDebug = true; // 设置 SDK 为 Debug 模式打印出日志,默认为 false
INTLAPI.InitSDK();
}
为了释放 Player Network SDK 的全局状态,建议在应用程序生命周期结束时关闭 SDK。
有关上述 Windows 专用 API 的更多详情,请参见 ShutDown(关闭)。
步骤2:验证 Player Network SDK 接入成功
- 修改 INTLConfig.ini 文件中
INTL Log节点下的配置。
[INTL Log]
LOG_LEVEL = 1
LOG_ENCRYPT_ENABLE = 0
LOG_COMPRESS_ENABLE = 0
LOG_CONSOLE_OUTPUT_ENABLE = 1
LOG_FILE_OUTPUT_ENABLE = 1
- 运行程序,当日志中显示
Init INTL SDK success.时,表示接入成功。