客户端
本文档描述如何在游戏端提供聊天室功能。 如果已接入了 INTLSDK 提供的其他功能,请参见 步骤5 。
步骤1:准备接入 INTLSDK
在 Player Network 注册游戏。注册通过后,按照步骤准备接入 INTLSDK。目前使用 Game Onespace 的业务请继续使用 Game Onespace。
获取密匙
注册被批准后,游戏将生成以下信息:
- GAME_ID :Player Network 游戏的唯一标识。
- SDK_KEY , SERVER_KEY ,和 WEB_KEY :用于创建签名的密匙。
只有 业务管理员 有权限获取这些密匙信息。
确认您是否是业务管理员
-
进入 Player Network 。
-
在 业务列表 的 业务名称 页面,查看您是否具有 业务管理员 权限。
业务管理员获取密匙
-
进入 Player Network 业务管理页面。
-
点击对应游戏的 查看 。
-
在 业务详情 页面,查看游戏的密匙信息。
普通用户获取密匙信息
普通用户请联系业务管理员请求密钥信息。
下载 INTLSDK
游戏使用的各插件版本必须一致,包括登录器使用的 SDK 版本也必须与游戏一致。如果业务需要同时接入不同版本的 SDK,或者只升级一个插件,需要联系 INTL 助手。
一旦通过权限审批,根据下列步骤下载 INTLSDK。
-
进入 Player Network 。
-
在 Player Network 左侧导航栏,点击 INTLSDK 下载 进入下载页面。
最新版 是 INTLSDK 最新发布的版本; 稳定版 是上一个发布的版本。
-
选择操作系统平台。
-
选择所需的功能模块。
-
点击 下载 。
-
在 选择引擎 弹窗中,选择需要的游戏引擎版本。
-
点击 下载 下载业务自主选择的操作系统,功能模块,和游戏引擎组合的 SDK。
步骤2:接入 INTLSDK
Android
1. 添加 INTLSDK 配置
- Unity
- Unreal Engine
- 解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Assets目录下。 -
将 INTLSDK 的
插件文件夹合并到插件工程中的文件夹。
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/ | INTLSDK 的 CS 脚本,提供可调用的接口方法和回调方法 |
| INTLSDK/Editor/ | INTLSDK Editor 脚本,包含 INTLSDK XUPorter 方案 |
| INTLSDK/Scripts/ | INTLSDK 脚本,包括 INTLCore 和其他插件的脚本 |
| LevelInfinite/ | LI PASS 接口 |
| Plugins/ | INTLSDK 平台插件目录 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
| UnionAdapter/ | 用于适配 MSDK 和 INTLSDK 的 UnionAdpater 接口 |
INTLSDK/Scripts/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLCore/Editor/ | INTLCore 插件 PostProcess.cs 文件 |
| INTLSDK/Scripts/INTLCore/Script/ | INTLCore 插件脚本文件 |
| INTLSDK/Scripts/INTLCore/Script/INTLAPI.cs | INTLSDK 所有 API 接口 |
| INTLSDK/Scripts/INTLCore/Script/INTLDefine.cs | INTLSDK 定义的数据结构 |
| INTLSDK/Scripts/INTLCore/Script/INTLConfig.cs | INTLSDK 静态字符串集合 |
| INTLSDK/Scripts/INTLCore/Script/INTLErrorCode.cs | INTLSDK 错误码集合 |
INTLSDK/Script/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLConfig/Editor/ | INTLSDK 配置文件,PostProcess.cs 文件,及加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/encrypt | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/Encrypt.exe | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/EncryptConfig.ini | 设置是否开启加密功能的配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/APASConfig.ini | APAS 机型分档配置文件 |
-
解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Plugins目录下。
如果工程中没有Plugins目录,请创建一个。 -
按照示例打开工程的
{Project Name}.Build.cs文件 并添加 INTLSDK 到 Unreal Engine。public INTLSample(ReadOnlyTargetRules Target) : base(Target)
{
PrivateDependencyModuleNames.AddRange(new string[] {
"INTLCore",
"INTLFoundation"
});
}
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/INTLSDK.uplugin | INTLSDK 插件描述文件 |
| INTLSDK/Resources/ | INTLSDK 资源文件目录 |
| INTLSDK/Source/ |
INTLSDK 插件模块
每个模块都包含自己的 Build.cs 文件,库和接口。 |
| INTLSDK/Source/INTLConfig/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLCore/ | INTLSDK 插件 Core 模块 |
| LevelInfinite/ | LI PASS 接口 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
INTLSDK/Source/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLCore/INTLCore.Build.cs | INTLCore 模块 Build.cs 文件 |
| INTLSDK/Source/INTLCore/Libs/ | INTLCore 模块 Lib 库目录 |
| INTLSDK/Source/INTLCore/Public/ |
INTLSDK 插件的 Public 接口目录
INTLSDKAPI.h :INTLSDK 各类接口 INTLSDKPluginObserver.h :INTLSDK 回调接口 INTLSDKPluginDefine.h :INTLSDK 类型定义 INTLSDKOutputUtility.h :INTLSDK 对回调结果处理的工具类 INTLSDKBaseUserWidget.h :INTLSDK 中 UserWidget 的基类,包含了注册和反注册回调接口的实现。 |
| INTLSDK/Source/INTLCore/Private/ | INTLSDK 插件的 Private 目录 |
INTLSDK/Source/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLConfig/Configs | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLConfig/Configs/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Resources/APASConfig.ini | APAS 机型分档配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Android/INTLConfig_APL.xml | INTLSDK Android 平台 Gradle 配置 |
2. 加载需要的权限和插件
- Unity
- Unreal Engine
将 INTLSDK 用于加载权限,库,和插件的代码添加到游戏自定义的启动 activity 中,即 Android 游戏请求权限和加载插件的 activity。
将 INTLSDK 用于加载库和注册生命周期的代码添加到
INTLConfig_APL.xml
,即 Android 游戏位于
INTLSDK/Source/INTLConfig/Configs/Android
的 Gradle 配置文件。
-
添加以下加载库的代码:
MainActivity.javastatic
{
try {
System.loadLibrary("INTLFoundation");
System.loadLibrary("INTLCore");
System.loadLibrary("INTLUnityAdapter");
}
catch (Exception e)
{
e.printStackTrace();
}
} -
添加以下注册生命周期的代码:
- Unity
- Unreal Engine
MainActivity.java@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// request permission
RequestDynamicPermissions();
// 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);
}INTLConfig_APL.xml<!--GameActivity.java onCreate code -->
<gameActivityOnCreateAdditions>
<insert>
RequestDynamicPermissions();
INTLSDK.initialize(this);
</insert>
</gameActivityOnCreateAdditions>
<!--GameActivity.java onDestroy code-->
<gameActivityOnDestroyAdditions>
<insert>
</insert>
</gameActivityOnDestroyAdditions>
<!--GameActivity.java onStart code-->
<gameActivityOnStartAdditions>
<insert>
</ insert>
</gameActivityOnStartAdditions>
<!--GameActivity.java OnRestart code-->
<gameActivityOnRestartAdditions>
<insert>
</insert>
</gameActivityOnRestartAdditions>
<!--GameActivity.java onStop code-->
<gameActivityOnStopAdditions>
<insert>
</insert>
</gameActivityOnStopAdditions>
<!--GameActivity.java onPause code-->
<gameActivityOnPauseAdditions>
<insert>
</insert>
</gameActivityOnPauseAdditions>
<!--GameActivity.java onResume code-->
<gameActivityOnResumeAdditions>
<insert>
</insert>
</gameActivityOnResumeAdditions>
<!-- GameActivity.java onActivityResult code -->
<gameActivityOnActivityResultAdditions>
<insert>
INTLSDK.onActivityResult(requestCode, resultCode, data);
</insert>
</gameActivityOnActivityResultAdditions>
<!--GameActivity.java OnNewIntent code-->
<gameActivityOnNewIntentAdditions>
<insert>
INTLSDK.onNewIntent(newIntent);
</insert>
</gameActivityOnNewIntentAdditions>
<!--GameActivity.java onRequestPermissionsResult code-->
<gameActivityOnRequestPermissionsResultAdditions>
<insert>
INTLSDK.onRequestPermissionsResult(arg0, arg1, arg2);
</insert>
</gameActivityOnRequestPermissionsResultAdditions> -
动态加载权限。
游戏可以使用以下两种方法之一来动态加载 Android 权限。
通过代码获取动态权限
添加动态加载权限代码。
private final int PermissionRequestCode = 100;
private void RequestPermission(Activity activity, List<String> permissionList, int requestCode)
{
if(null==activity || null==permissionList){
return;
}
List<String>
permissionNeeded = new ArrayList<String>();
for(int i=0; i<permissionList.size(); i++){
String permission = permissionList.get(i);
if(null!=permission && PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission)){
permissionNeeded.add(permission);
}
}
if(permissionNeeded.size()>0){
ActivityCompat.requestPermissions(activity, permissionNeeded.toArray(new String[permissionNeeded.size()]), requestCode);
}
}
private void RequestDynamicPermissions()
{
List<String> permissions = new ArrayList<String>();
//INTLCore
permissions.add(Manifest.permission.INTERNET);
this.RequestPermission(this, permissions, PermissionRequestCode);
}
通过配置添加动态权限并自定义对话框的风格和语言
-
在
AndroidManifest中配置启动界面。其中{YOUR_START_ACTIVITY}是游戏配置的完成权限申请后的跳转页面。<activity android:name="com.intlgame.tools.permission.PermissionGrantActivity">
<meta-data android:name="INTLSDK_GAME_ACTIVITY_CLASSNAME" android:value="{YOUR_START_ACTIVITY}"/>
<meta-data android:name="INTLSDK_DENY_SETTINGS_TYPE" android:value="setting" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity> -
在
res/strings.xml中添加以下配置,完成权限提示。
如果不配置以下内容,会直接进行授权动作。直接授权有不符合 Google Play 的规范风险,可能会导致审核不通过。
```xml
<string name="intl_permission_confirm">确认</string>
<string name="intl_permission_cancel">退出</string>
<string name="intl_permission_settings">设置</string>
<string name="intl_always_denied_warning">请到设置界面打开权限,否则无法正常进入游戏</string>
<string name="intl_permission_grant_warning"> 请求xxx 权限的原因:1、游戏中存在保存视频等,需要您授予相机权限;2、游戏中存在文件的读写操作需要您授予读写权限</string>
<string name="intl_permission_title">INTL</string>
<! - 配置您想要应用的权限 (可选) -->
<string-array name="intl_permission_granted_list">
<item>android.permission.CAMERA</item>
<item>android.permission.INTNET</item>
<item>android.permission.WRITE_EXTERNAL_STORAGE</item>
<item>android.permission.READ_EXTERNAL_STORAGE</item>
</string-array>
```
-
(可选) 在
res/styles.xml中添加以下内容,进行对话框样式配置。更多的对话框样式,请参见 Android 官方文档 。<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="INTLPermissionTheme" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
<!-- 这里设置背景 -->
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowNoTitle">false</item>
<!-- 这里是修改顶部标题背景颜色,具体颜色自己定,可以是图片 -->
<item name="android:topDark">@android:color/holo_purple</item>
<!-- 这里是修改内容区域背景颜色 -->
<item name="android:centerDark">@android:color/background_light</item>
<item name="android:windowIsTranslucent">false</item>
</style>
</resources>
-
适配异形屏
从 Android P 开始,Android 推出标准 API 支持异形屏适配,但是对应 Android O 的设备,各供应商有不同的实现逻辑。INTLSDK 提供统一的 C++ 接口和 Java 接口,目前支持 Xiaomi,Huawei,Samsung,VIVO,OPPO 机型。
INTLSDK 封装了一个
INTLUnityAdapter模块用于 Unity 游戏允许游戏使用 C# 进行不受管理的调用到 C++ API。Unreal Engine 游戏可以通过 UPL 调用 Java 接口。
更多信息,请参见 异步异形屏信息读取接口 。
工程配置
一般来说,移动设备的全屏宽高比大于2.1。 为避免黑色边界,必须将
android.max_aspect修改为大于 2.1。对于 Android Oreo 系统的华为手机和小米手机,需要额外配置
AndroidManifest。- Unity
- Unreal Engine
<!--持全面屏宽高比:2.4适应未来21:9超宽屏-->
<meta-data android:name="android.max_aspect" android:value="2.4" />
<!--小米O版本定义:是否使用耳朵区域(危险区)-->
<!--value取值:none: 横竖屏都不绘制耳朵区,portrait:竖屏绘制到耳朵区,landscape:横屏绘制到耳朵区,portrait|landscape:横竖屏都绘制到耳朵区-->
<meta-data android:name="notch.config" android:value="portrait|landscape"/>
<!--华为O版本定义:应用页面使用刘海区域-->
<meta-data android:name="android.notch_support" android:value="true"/>注意对于 Unreal Engine 4,为了避免在合并
AndroidManifest时发生冲突,需要在 项目设置 > Android > 最大支持的宽高比 设置最大支持的宽高比为2.4。
<androidManifestUpdates>
<log text="INTL-Sample-UPL AndroidManifestUpdates finish" />
<addElements tag="application">
<meta-data android:name="notch.config" android:value="portrait|landscape"/>
<meta-data android:name="android.notch_support" android:value="true"/>
</addElements>
</androidManifestUpdates>对于使用 Android 接口获取异形屏安全区域信息的业务,请添加以下配置。
- Unity
- Unreal Engine
在
MainActivity中增加以下内容,并且在onCreate中增加setFullScreen调用。MainActivity.javaprivate 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);
}
}在 PlayerSetting 勾选上 Render outside safe area 。
在
INTLConfig_APL.xml中添加以下配置。INTLConfig_APL.xml<gameActivityClassAdditions>
<insert>
// 使用cutout区域
private void setFullScreen()
{
Log.debug("INTL::setFullScreen");
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
int 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版本允许使用刘海
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);
}
}
</insert>
</gameActivityClassAdditions>
<gameActivityOnCreateAdditions>
<insert>
setFullScreen();
INTLSDK.initialize(this);
// ...其它业务代码
// 下面使用Android原生的调用方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets)
{
Context mContext = getApplicationContext();
DisplayCutoutManager displayCutoutManager = Singleton.getSingleton(DisplayCutoutManager.class);
// 是否是异形屏设备
if (displayCutoutManager.hasCutoutSupport(mContext, insets))
{
// 获取异形屏安全区域
Rect safeRect = displayCutoutManager.getSafeDisplay(mContext, insets);
// 获取异形屏刘海区域
List<Rect> rects = displayCutoutManager.getCutoutSize(mContext, insets);
// 游戏业务逻辑,可以通过native调用传递异形屏相关信息
}
return insets;
}
});
}
</insert>
</gameActivityOnCreateAdditions>
3. 生成 JAR 包
INTLSDK 使用 Gradle 构建生成 JAR 包。Gradle 配置文件包含第三方 SDK 版本号,以及 INTLSDK 和第三方渠道所需的依赖项。游戏需要基于所需的插件添加必要的依赖项。
- Unity
- Unreal Engine
mainTemplate.gradle
and
INTLCore.mainTemplate.gradle
文件是 INTLSDK 的 Gradle 配置文件。请根据游戏的需求更新 Gradle 配置。
Unity 2018
| 文件 | 路径 |
|---|---|
| mainTemplate.gradle | Plugins/Android |
| INTLCore.mainTemplate.gradle | Plugins/Android/Gradle |
至少需要以下两处更新:
-
将
mainTemplate.gradle从游戏合并到 INTLSDK 的mainTemplate.gradle中,并保留由 INTLSDK 标记的内容。
-
将
INTLCore.mainTemplate.gradle中的 {占位符} 文本替换为 INTLConfig.ini 配置文件中的值。
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从游戏合并到 INTLSDK 对应的配置文件中,并保留 INTLSDK 标记的内容。
-
将
INTLCore.launcherTemplate.gradle中的 {占位符} 文本替换为INTLConfig.ini配置文件中的值。
INTLConfig_APL.xml
文件是 INTLSDK 的 Gradle 配置文件。请基于游戏需求更新 Gradle 配置。将 {占位符} 文本替换为
INTLConfig.ini
配置文件中的值。
iOS
1. 添加 INTLSDK 配置
- Unity
- Unreal Engine
- 解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Assets目录下。 -
将 INTLSDK 的
插件文件夹合并到插件工程中的文件夹。
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/ | INTLSDK 的 CS 脚本,提供可调用的接口方法和回调方法 |
| INTLSDK/Editor/ | INTLSDK Editor 脚本,包含 INTLSDK XUPorter 方案 |
| INTLSDK/Scripts/ | INTLSDK 脚本,包括 INTLCore 和其他插件的脚本 |
| LevelInfinite/ | LI PASS 接口 |
| Plugins/ | INTLSDK 平台插件目录 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
| UnionAdapter/ | 用于适配 MSDK 和 INTLSDK 的 UnionAdpater 接口 |
INTLSDK/Scripts/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLCore/Editor/ | INTLCore 插件 PostProcess.cs 文件 |
| INTLSDK/Scripts/INTLCore/Script/ | INTLCore 插件脚本文件 |
| INTLSDK/Scripts/INTLCore/Script/INTLAPI.cs | INTLSDK 所有 API 接口 |
| INTLSDK/Scripts/INTLCore/Script/INTLDefine.cs | INTLSDK 定义的数据结构 |
| INTLSDK/Scripts/INTLCore/Script/INTLConfig.cs | INTLSDK 静态字符串集合 |
| INTLSDK/Scripts/INTLCore/Script/INTLErrorCode.cs | INTLSDK 错误码集合 |
INTLSDK/Script/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLConfig/Editor/ | INTLSDK 配置文件,PostProcess.cs 文件,及加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/encrypt | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/Encrypt.exe | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/EncryptConfig.ini | 设置是否开启加密功能的配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/APASConfig.ini | APAS 机型分档配置文件 |
-
解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Plugins目录下。
如果工程中没有Plugins目录,请创建一个。 -
按照示例打开工程的
{Project Name}.Build.cs文件 并添加 INTLSDK 到 Unreal Engine。public INTLSample(ReadOnlyTargetRules Target) : base(Target)
{
PrivateDependencyModuleNames.AddRange(new string[] {
"INTLCore",
"INTLFoundation"
});
}
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/INTLSDK.uplugin | INTLSDK 插件描述文件 |
| INTLSDK/Resources/ | INTLSDK 资源文件目录 |
| INTLSDK/Source/ |
INTLSDK 插件模块
每个模块都包含自己的 Build.cs 文件,库和接口。 |
| INTLSDK/Source/INTLConfig/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLCore/ | INTLSDK 插件 Core 模块 |
| LevelInfinite/ | LI PASS 接口 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
INTLSDK/Source/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLCore/INTLCore.Build.cs | INTLCore 模块 Build.cs 文件 |
| INTLSDK/Source/INTLCore/Libs/ | INTLCore 模块 Lib 库目录 |
| INTLSDK/Source/INTLCore/Public/ |
INTLSDK 插件的 Public 接口目录
INTLSDKAPI.h :INTLSDK 各类接口 INTLSDKPluginObserver.h :INTLSDK 回调接口 INTLSDKPluginDefine.h :INTLSDK 类型定义 INTLSDKOutputUtility.h :INTLSDK 对回调结果处理的工具类 INTLSDKBaseUserWidget.h :INTLSDK 中 UserWidget 的基类,包含了注册和反注册回调接口的实现。 |
| INTLSDK/Source/INTLCore/Private/ | INTLSDK 插件的 Private 目录 |
INTLSDK/Source/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLConfig/Configs | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLConfig/Configs/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Resources/APASConfig.ini | APAS 机型分档配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Android/INTLConfig_APL.xml | INTLSDK Android 平台 Gradle 配置 |
2. 加载需要的权限和插件
- Unity
- Unreal Engine
XUPorter 从 Unity 导出 Xcode 的时候,可以自动化配置 Xcode 工程,添加依赖库和源码文件,便于打包操作。
INTL 在原来的 XUPorter 基础上做了优化。如果业务也使用了 XUPorter 方案,INTL 的方案和业务的方案不会冲突。
-
添加了
INTLSDKEditor命名空间,避免其他组件也使用 XUPorter 时命名重复。 -
更改了搜索 mods 文件的路径,让 INTLSDK XUPorter 只搜索
Asset/INTLSDK/目录下的 mods 文件,不会重复添加其他组件的配置。 -
在
UnityAppController.mm中增加生命周期。
INTL XUPorter 方案
INTL{Plugin}Kit.projmods
是 INTLSDK 的
Info.plist
配置文件。INTLSDK 通过读取
INTLSDK/Editor/XUPorter/Mods
目录中的
INTL{Plugin}Kit.projmods
文件,在 Xcode 中增加所导入的 bundle,framework 等依赖包。
每个插件都有一个对应的
INTL{Plugin}Kit.projmods
文件,游戏要根据所需的插件配置对应的文件,并以
INTLConfig.ini
配置文件中的值替换 {占位符} 文本。
例如,根据需求更新
INTLFacebookKit.projmods
。
在配置文件中添加 INTLSDK 相关配置。
例如, Facebook 插件配置 ,业务需要修改成自己的 Facebook 相关配置。
- INTLSDK 1.18
- INTLSDK 1.17.04 or earlier
修改
INTLSDK/Source/INTLConfig/Configs/iOS/Plist/INTLFacebook.plist
。
<key>CFBundleURLSchemes</key>
<array>
<string>fb{FACEBOOK_APPID}</string>
</array>
业务需到 Unreal Engine > Settings > Project Settings > Platforms > iOS > Extra Plist Data 修改配置,在 Plist 文件中添加 SDK。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fb</string>
<string>fb-messenger-api</string>
<string>fbshareextension</string>
<string>fbauth2</
string>
<string>fb-messenger-share-api</string>
<string>fbapi</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Facebook</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb{FACEBOOK_APPID}</string>
</array>
</dict>
</array>
iOS 使用说明
根据 iOS 权限要求,在申请敏感权限时,填写 使用说明 ,系统会弹出提示用户填写此信息。
- Unity
- Unreal Engine
-
在
Assets/INTLSDK/Editor/XUPorter/Mods~/INTLCoreKit.projmods,下列权限已升级:"NSPhotoLibraryUsageDescription"
"NSCameraUsageDescription"
"NSLocationWhenInUseUsageDescription"
"NSPhotoLibraryAddUsageDescription"
"NSMicrophoneUsageDescription"在接入时,用户可以根据需要修改内容。
-
在
Assets/INTLSDK/Editor/XUPorter/Mods~/INTLADTrackingKit.projmods,下列权限已升级:"NSUserTrackingUsageDescription"警告接入时,用户可以根据需要修改内容, 并与法律团队确认内容是否合规 。如果无修改, 将 INTLSample 替换为游戏名称。
:::
-
在
Plugins/INTLSDK/Source/INTLConfig/Configs/iOS/Plist/INTLCore.plist中,下列权限已升级:<key>NSPhotoLibraryUsageDescription</key>
<key>NSCameraUsageDescription</key>
<key>NSLocationWhenInUseUsageDescription</key>
<key>NSPhotoLibraryAddUsageDescription</key>
<key >NSMicrophoneUsageDescription</key> -
在
Plugins/INTLSDK/Source/INTLConfig/Configs/iOS/Plist/INTLADTracking.plist中,下列权限已升级:<key>NSUserTrackingUsageDescription</key>警告接入时,用户可以根据需要修改内容, 并与法律团队确认内容是否合规 。如果无修改, 将 INTLSample 替换为游戏名称。
:::
3. 适配 Swift SDK
-
如果接入 INTL Facebook ,iOS SDK 需要升级到版本 10 以上。
-
如果接入 INTL LINE ,iOS SDK 需要升级到版本 10 以上。
-
如果接入 INTL DMM ,iOS SDK 需要升级到版本 11 以上。
-
如果接入 INTL Discord ,iOS SDK 需要升级到版本 11 以上。
-
如果接入 INTL DMM ,iOS SDK 需要升级到版本 11 以上。
版本要求:IOS SDK 9 及之后的版本
如果模块使用到的是 Swift 版本的 SDK,这里会涉及到 iOS 的 Swift 和 Objective-C 的混编问题。 Xcode 为了兼容混编需要有一个 bridge 的桥接层对齐两种语言的类名等,需要如下操作。
-
新建文件,选择 Swift File 类型。
-
按照需求命名并确保文件后缀是 .swift,然后点击 Create 。
-
点击 Create Bridging Header 。
请确保选择 Create Bridging Header 。否则,Xcode 将不会创建桥接层文件。
- 确保 Xcode 工程中创建了两个文件(一份为第二步创建的 .swift 文件,另一份为自动创建的 project_name-Bridging-Header.h 文件)。
文件内容无需更改。
- Unity
- Unreal Engine
不适用。
Unreal Engine 中无法直接增加 iOS 端 Swift 模块,需要修改引擎配置。
-
使用 Xcode 12 及以上版本时,需要在
/Plugins/INTLSDK/Source/INTLCore/INTLCore.Build.cs中添加以下的代码。PublicSystemLibraryPaths.Add("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos");
PublicSystemLibraryPaths.Add("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos");注意由于 INTLSDK 已经提前进行了以下配置,使用其他版本的 Xcode 时可以省略这个步骤。
由于使用 Xcode 12 及以上版本的 Swift lib 在编译 Unreal Engine 时会报以下错误,只有使用 Xcode 12 及以上版本时需要这个步骤解决问题。
:::
-
修改本地 Unreal Engine 的源代码。
在 /Your_UE_Installation_Path/Engine/Source/Programs/UnrealBuildTool/ProjectFiles/Xcode/XcodeProject.cs 的
private void AppendProjectBuildConfiguration(StringBuilder Content, string ConfigName, string ConfigGuid)函数中添加下面的代码。// Enable Swift
Content.Append("\t\t\t\tCLANG_ENABLE_MODULES = YES;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tSWIFT_VERSION = 5.0;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\";" + ProjectFileGenerator.NewLine);
if (ConfigName == "Debug")
{
Content.Append("\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";" + ProjectFileGenerator.NewLine);
}
Content.Append("\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tEMBEDDED_CONTENT_CONTAINS_SWIFT = YES;" + ProjectFileGenerator.NewLine);
-
在 /Your_UE_Installation_Path/Engine/Source/Programs/UnrealBuildTool/Platform/IOS/IOSToolChain.cs 的
string GetLinkArguments_Global(LinkEnvironment LinkEnvironment)函数中添加下面的代码。
- Before XCode 12
- XCode 12 and later
// enable swift support
Result += " -rpath \"/usr/lib/swift\"";
Result += " -rpath \"@executable_path/Frameworks\"";
// /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/
String swiftLibPath = String.Format(" -L {0}Platforms/{1}.platform/Developer/SDKs/{1}{2}.sdk/usr/lib/swift",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName : Settings.Value.SimulatorPlatformName, Settings.Value.IOSSDKVersion);
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.
Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
// 该行代码需要前置(前置的代码位置见下面示例图片)
// enable swift support, make sure '/usr/lib/swift' goes before '@executable_path/Frameworks'
Result += " -rpath \"/usr/lib/swift\"";
// enable swift support
Result += " -rpath \"@executable_path/Frameworks\"";
// /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/
String swiftLibPath = String.Format(" -L {0}Platforms/{1}.platform/Developer/SDKs/{1}{2}.sdk/usr/lib/swift",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName : Settings.Value.SimulatorPlatformName, Settings.Value.IOSSDKVersion);
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
// Xcode 12 adds the swiftCompatibility51 library, so you need to add the following code
if (Settings.Value.IOSSDKVersionFloat >= 14.0f)
{
Result += String.Format(" -lswiftCompatibility51");
}
-
打开解决方案重新编译
/Users/intl/UE4/UE_4.25/Engine/Source/Programs/UnrealBuildTool/UnrealBuildTool.sln。
Windows
Windows 平台的游戏安装目录不应包含分号 (;) ,否则游戏将无法运行。
获取 Windows 数字签名 ,请联系安全团队的 [tingdai] 。
系统需求
由于Windows平台的特性,游戏的安装目录不能包含有英文字符分号(;),否则会导致游戏无法找到必要的dll,导致游戏运行失败。
-
Windows 7:
-
安装 Microsoft Visual C++ Redistributable packages 并添加
VC_redist.x64.exe /install /quiet /norreest命令到安装程序脚本。
-
-
Windows 8 和 Windows 8.1:
安装 Microsoft Visual C++ Redistributable packages 并添加命令到安装程序脚本。
1. 添加 INTLSDK 配置
- Unity
- Unreal Engine
- 解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Assets目录下。 -
将 INTLSDK 的
插件文件夹合并到插件工程中的文件夹。
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/ | INTLSDK 的 CS 脚本,提供可调用的接口方法和回调方法 |
| INTLSDK/Editor/ | INTLSDK Editor 脚本,包含 INTLSDK XUPorter 方案 |
| INTLSDK/Scripts/ | INTLSDK 脚本,包括 INTLCore 和其他插件的脚本 |
| LevelInfinite/ | LI PASS 接口 |
| Plugins/ | INTLSDK 平台插件目录 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
| UnionAdapter/ | 用于适配 MSDK 和 INTLSDK 的 UnionAdpater 接口 |
INTLSDK/Scripts/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLCore/Editor/ | INTLCore 插件 PostProcess.cs 文件 |
| INTLSDK/Scripts/INTLCore/Script/ | INTLCore 插件脚本文件 |
| INTLSDK/Scripts/INTLCore/Script/INTLAPI.cs | INTLSDK 所有 API 接口 |
| INTLSDK/Scripts/INTLCore/Script/INTLDefine.cs | INTLSDK 定义的数据结构 |
| INTLSDK/Scripts/INTLCore/Script/INTLConfig.cs | INTLSDK 静态字符串集合 |
| INTLSDK/Scripts/INTLCore/Script/INTLErrorCode.cs | INTLSDK 错误码集合 |
INTLSDK/Script/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Scripts/INTLConfig/Editor/ | INTLSDK 配置文件,PostProcess.cs 文件,及加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/encrypt | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/Encrypt.exe | INTLSDK 提供的 INTLConf.ini 加密工具 |
| INTLSDK/Scripts/INTLConfig/Editor/Encrypt/EncryptConfig.ini | 设置是否开启加密功能的配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Scripts/INTLConfig/Editor/Resources/APASConfig.ini | APAS 机型分档配置文件 |
-
解压 SDK 包。
-
将
INTLSDK文件夹拷贝到工程的Plugins目录下。
如果工程中没有Plugins目录,请创建一个。 -
按照示例打开工程的
{Project Name}.Build.cs文件 并添加 INTLSDK 到 Unreal Engine。public INTLSample(ReadOnlyTargetRules Target) : base(Target)
{
PrivateDependencyModuleNames.AddRange(new string[] {
"INTLCore",
"INTLFoundation"
});
}
INTLSDK 包
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/INTLSDK.uplugin | INTLSDK 插件描述文件 |
| INTLSDK/Resources/ | INTLSDK 资源文件目录 |
| INTLSDK/Source/ |
INTLSDK 插件模块
每个模块都包含自己的 Build.cs 文件,库和接口。 |
| INTLSDK/Source/INTLConfig/ | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLCore/ | INTLSDK 插件 Core 模块 |
| LevelInfinite/ | LI PASS 接口 |
| Symbols/ | INTLSDK 符号表 *.so 文件 |
INTLSDK/Source/INTLCore
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLCore/INTLCore.Build.cs | INTLCore 模块 Build.cs 文件 |
| INTLSDK/Source/INTLCore/Libs/ | INTLCore 模块 Lib 库目录 |
| INTLSDK/Source/INTLCore/Public/ |
INTLSDK 插件的 Public 接口目录
INTLSDKAPI.h :INTLSDK 各类接口 INTLSDKPluginObserver.h :INTLSDK 回调接口 INTLSDKPluginDefine.h :INTLSDK 类型定义 INTLSDKOutputUtility.h :INTLSDK 对回调结果处理的工具类 INTLSDKBaseUserWidget.h :INTLSDK 中 UserWidget 的基类,包含了注册和反注册回调接口的实现。 |
| INTLSDK/Source/INTLCore/Private/ | INTLSDK 插件的 Private 目录 |
INTLSDK/Source/INTLConfig
| 文件夹/文件 | 说明 |
|---|---|
| INTLSDK/Source/INTLConfig/Configs | INTLSDK 插件配置文件目录 |
| INTLSDK/Source/INTLConfig/Configs/Resources/INTLConfig.ini | INTLSDK 主要配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Resources/APASConfig.ini | APAS 机型分档配置文件 |
| INTLSDK/Source/INTLConfig/Configs/Android/INTLConfig_APL.xml | INTLSDK Android 平台 Gradle 配置 |
2. 更改缓存目录
默认 INTLSDK PC 用户和应用程序生成的缓存将在:
-
C:/ProgramData/INTL -
C:/Users/{name}/AppData/Local/INTL/local/INTL
调用 InitSDK 之前,游戏开发者必须设置缓存目录。更多信息,请参见 更改用户数据文件目录 API 。
- Unity
- Unreal Engine
// 例如,game ID 为 11,游戏应用名称为 INTLSDKDemo。
// 游戏调用以下接口:
INTLAPI.SetSDKDefaultUserStorage("D:\\game_data\\");
// INTLSDK 数据缓存目录为 D:\game_data\11\INTLSDKDemo\。
// 例如,game ID 为 11,游戏应用名称为 INTLSDKDemo。
// 游戏调用以下接口:
UINTLSDKAPI::
SetDefaultUserStorageDirectory("D:\\game_data\\")
// INTLSDK 数据缓存目录为 D:\game_data\11\INTLSDKDemo\。
3. 加密配置文件
不要手动删除
INTLConfig.ini
,打包脚本时 INTLSDK 将只拷贝
INTLConfig.ini.new
文件。
版本需求:INTLSDK V1.15
- Unity
- Unreal Engine
从 INTLSDK 1.17 开始,默认启用加密。
-
打开
EncryptConfig.ini文件。
-
检查
ENABLE的对应值。
默认为 0,说明此功能是关闭的。
-
开启加密,则将
ENABLE的对应值修改为 1,即ENABLE = 1。
-
在 Unity 引擎中选择 INTL > INTLConfig.ini Settings 。
-
修改
INTLConfig.ini并保存。
如果成功开启加密功能,则修改完成同时会对INTLConfig.ini加密。 -
在
INTLConfig.ini所在的文件夹中检查INTLConfig.ini.new文件的大小。
如果文件内容不是 0KB,则加密成功。
- INTLSDK 1.17
- INTLSDK 1.16.04 or earlier
-
打开
DefaultEngine.ini文件。
-
将配置
bEnableConfigIniEncryption值设置为True开启加密功能,设置为False关闭加密功能。
[/Script/INTLSDK.Settings]
bEnableConfigIniEncryption=True
-
在 Unreal Engine 中点击
INTLEncrypt检查加密是否成功。
-
检查
INTLConfig.ini.new文件的大小,如果文件内容不是 0KB,加密成功。
| 平台 | 路径 |
|---|---|
| Windows | INTLSDK/Source/INTLConfig/Configs/Encrypted/Windows/INTLConfig.ini.new |
| Android | INTLSDK/Source/INTLConfig/Configs/Encrypted/Android/INTLConfig.ini.new |
| iOS | INTLSDK/Source/INTLConfig/Configs/Encrypted/iOS/INTLConfig.ini.new |
-
打开
EncryptConfig.ini文件。
-
检查
ENABLE的对应值。
默认为 0,说明此功能是关闭的。
-
开启加密,则将
ENABLE的对应值修改为 1,即ENABLE = 1。
-
在 Unreal Engine 中点击 INTLEncrypt 检查加密是否成功。
-
在
INTLConfig.ini所在的文件夹中检查INTLConfig.ini.new文件的大小。
如果文件内容不是 0KB,则加密成功。
4. Windows 特定接口
- Unity
- Unreal Engine
| API | 函数定义 |
|---|---|
| SetSDKDefaultUserStorage | 更改 INTLSDK 用户数据文件夹的目录。 |
| notifyUnityQuit | 在应用的生命周期结束时,建议关闭 SDK 来释放 INTLSDK 的全局状态。 |
| API | 函数定义 |
|---|---|
| SetDefaultUserStorageDirectory | 更改 INTLSDK 用户数据文件夹的目录。 |
| 重启(Restart) | 在编辑器中的应用程序生命周期结束时,建议重新启动 SDK 来释放 INTLSDK 的全局状态。 |
| ShutDown | 在应用的生命周期结束时,建议关闭 SDK 来释放 INTLSDK 的全局状态。 |
步骤3:完成 INTLSDK 的基础配置
INTLConfig.ini
是 INTLSDK 的配置文件,位于
INTLSDK/Source/INTLConfig/Configs/Resources
。 此配置文件包含了所有业务需关注的下载 SDK 时选择的操作系统,功能模块,和游戏引擎组合所需的配置。完整的配置列表,请参见
SDK 配置
。
在配置功能模块和渠道之前,先配置基本的SDK 环境和日志。
- 使用 key=value 的方式,key 采用全大写。
- 有多个值的,使用英文逗号 (,) 隔开。
- 开关相关等字段需要加上后缀 "_ENABLE",true 为 1,false 为 0。
文件路径
INTLConfig.ini
在工程中的路径为:
- Unity
- Unreal Engine
| 1.17.00 | 1.16.05 |
|---|---|
INTLSDK/Scripts/INTLConfig/Editor/Resources/INTLConfig.ini
|
Android:
/Plugins/Android/assets/INTLConfig.ini
iOS:
/Plugins/iOS/INTLSDK/INTLCore/INTLSDK.bundle/INTLConfig.ini
Windows, PS5:
/Plugins/x86_64/INTLConfig.ini
Nintendo:
/Plugins/Switch/INTLConfig.ini
|
| 1.17.00 | 1.16.05 |
|---|---|
INTLSDK/Source/INTLConfig/Configs/Resources/INTLConfig.ini
|
Android:
INTLSDKPlugin/Source/INTLSDKPlugin/INTLSDK/Android/assets/INTLConfig.ini
iOS:
INTLSDKPlugin/Source/INTLSDKPlugin/INTLSDK/iOS/INTLCore/INTLSDK.bundle/INTLConfig.ini
Windows, PS5:
INTLSDKPlugin/Source/INTLSDKPlugin/INTLSDK/resources/INTLConfig.ini
Nintendo:
INTLSDKPlugin/Source/INTLSDKPlugin/INTLSDK/Switch/INTLConfig.ini
|
SDK 环境
| 字段 | 说明 | 备注 |
|---|---|---|
| INTL_URL |
INTLSDK 后台服务的 URL 根据不同的环境配置。
更多信息,请参见 后台环境 。 |
必填 |
| GAME_ID | Player Network 游戏唯一标识 ID | 必填 |
| SDK_KEY | 网络通信签名 Key | 必填 |
| LIFECYCLE |
Android 插件生命周期监听
插件要求进行生命周期监听的,需要添加该配置。 例如,
LIFECYCLE = Adjust,Facebook,Google,Twitter,AppsFlyer
。
|
必填 |
| ANDROID_LOCAL_NOTIFICATION_ENABLE |
Android 本地推送开关
默认:关闭 |
选填 |
| DEBUG_CHANNEL |
第三方渠道的 debug 模式,只有当
LOG_LEVEL
<= 1 时才生效。
不同渠道可以用 (,) 隔开。 例如,
DEBUG_CHANNEL = Adjust,AppsFlyer,Firebase
。
|
选填 |
| SHOW_TEST_TOAST |
显示测试环境 toast 弹窗
0:隐藏,1:显示 默认值:1 |
选填 |
INTL 日志
| 字段 | 说明 | 说明 |
|---|---|---|
| LOG_LEVEL |
日志级别
0:调试 1:信息 2:警告 3:错误 默认:3 |
选填 |
| LOG_ENCRYPT_ENABLE |
是否需要加密日志
0:关闭 1:开启 默认:1 |
选填 |
| LOG_COMPRESS_ENABLE |
是否输出落地日志
0:关闭 1:开启 默认:0 |
选填 |
| LOG_CONSOLE_OUTPUT_ENABLE |
是否输出 console 日志
0:关闭 1:开启 默认:0 |
选填 |
| LOG_FILE_OUTPUT_ENABLE |
是否输出日志文件
0:关闭 1:开启 默认:0 |
选填 |
| LOG_MAX_FILE_SIZE |
最大日志文件大小
单位:字节 默认:2x1024x1024(2 MB) |
选填 |
| LOG_FILE_EXCESS_ACTION |
文件超过最大大小后的行为
0:删除并重写 1:不再写入 默认:0 |
选填 |
| LOG_AUTO_DELETE_FILE_ENABLE |
自动清除过期的日志文件
0:关闭 1:开启 默认:1 |
选填 |
| LOG_FILE_LIMIT_HOURS |
日志文件的过期时间
单位:小时 默认:10*24(10天) |
选填 |
步骤4:测试 INTLSDK 集成
编译并运行您的项目以测试 INTLSDK 是否接入成功。如果您能在日志中搜索到 "INTL" 和 "intl_log" 关键字,说明 SDK 接入成功。
步骤5:配置所需的公会渠道
在左侧导航栏, 选择 功能 > 公会 > 频道 查看支持的登录频道列表。 按照每个频道的说明配置所需的登录频道。
频道信息
步骤6:初始化 INTLSDK
在 Windows 初始化 SDK 之前,需调用 SetDefaultUserStorage 接口设置用户数据缓存目录。
在调用任何账号服务 API 之前,按照以下步骤初始化 SDK。
- Unity
- Unreal Engine
INTLAPI.cs
包含了 INTLSDK 的所有API,业务只需要关注本文档中列出的 API。
-
在游戏开始时,执行
INTLAPI.InitSDK();方法初始化 INTLSDK。代码示例
INTLAPI.IsDebug = true; // Set INTLSDK to Debug mode to print more detailed log. The default value is false.
INTLAPI.InitSDK(); -
调用 INTLSDK 的功能模块来接入业务功能。
-
在游戏开始时,执行
UINTLSDKAPI::Init();方法来初始化 INTLSDK。
INTLSDK 初始化必须放在 UGameInstance 的
Init
方法里,不能放在 UGameInstance 的构造函数里。
代码示例
UINTLSampleGameInstance()::UINTLSampleGameInstance()
{
// INTLSDK initialization cannot be placed in the constructor
// UINTLSDKAPI::Init();
}
void UINTLSampleGameInstance::Init()
{
Super::Init();
//INTLSDK initialization is recommended in the Init method of UGameInstance
UINTLSDKAPI::Init();
mWindowMgr = NewObject<UINTLWindowMgr>(this);
mWindowMgr->AddToRoot();
}
-
调用 INTLSDK 的功能模块来接入业务功能。
-
如果需要接入 Epic Channel 渠道,请在 Unreal Engine 4 的 Tick 事件中增加
OnTickEvent调用,保证 Epic 的异步回调功能正常。代码示例
UINTLSDKAPI::OnTickEvent(); -
INTLSDK 提供两种配置回调的方法。
a. Unreal 事件处理法适用于同时使用 Unreal 蓝图和 C++ 的项目。更多信息,请参见 配置回调 。
代码示例
TScriptInterface<IINTLPluginObserver> Observer;
Observer.SetObject(this);
Observer.SetInterface(Cast<IINTLPluginObserver>(this));
UINTLSDKAPI::AddObserver(Observer);b. C++ 事件处理法适用于只使用 C++ 的项目。
代码示例
//配置回调
FINTLAuthBaseEvent authBaseEvent;
authBaseEvent.AddUObject(this, &OnAuthBaseResult_Implementation);
UINTLSDKAPI::SetAuthBaseResultObserver(authBaseEvent);
//Remove callback
UINTLSDKAPI::GetAuthBaseResultObserver().Clear();
步骤7:注册公会模块回和调用公会模块
欲了解更多公会 API,请参见 公会 API 。