# 接入准备(必读)

# 1、集成指南

# 1.1、导入资源

根据游戏使用的Unity 版本选择对应的.unitypackage,点击Assets -> Import Package -> Custom Package导入所有资源。

  • Editor: iOS 平台插件管理工具以及相关的文件配置等。
  • script: Unity SDK 脚本目录。
  • Plugins: 插件目录,包含 Android、OpenHarmony、Switch、Steam、WeGame、MiniGame、PS4、XboxOne 平台插件管理工具。

  • DHSDKHelper.cs: SDK 所有的接口都封装在这个里面。
  • JsonUtils.cs: SDK 和插件通信数据采用 Json 数据格式。
  • UIMainUnifiedVersion.cs: SDK 调⽤的 Demo 实例,可以作为参考 API 用法。

WARNING

其中的UIMainUnifiedVersion.cs是 Unity SDK Demo 的脚本。直接挂载到Main Camera上,即可快速测试 Unity SDK 功能。(游戏构建正式包时,需删除此脚本!)

# 1.2、配置查询

所有需要向 SDK 查询的配置数据或者缓存数据都可以通过此接口进行查询。

TIP

该接口返回查询内容,数据类型为字符串(string)。在没有值的情况下,将返回空字符。

鸿蒙注意事项

鸿蒙系统该接口为异步回调,无法实时同步返回。游戏需要针对鸿蒙特殊处理,sdk 回调码为 21,示例如下

//data数据返回json的key就是调用query传入的key
{"requestCode":"21","resultCode":"0","data":"{\"dev_os\":\"harmony\"}"}
string key = "dh_channelId";
string value = DHSDKHelper.query(key);

string dev_os = DHSDKHelper.query("dev_os"); // 设备系统类型
string dev_uuid = DHSDKHelper.query("dev_uuid"); // 设备唯一ID
string ad_channel = DHSDKHelper.query("dh_mainchannel"); // 二级渠道号(CPS主渠道)
string ad_subchannel = DHSDKHelper.query("dh_secochannel"); // 三级渠道号(CPS次渠道)

配置信息,主要参数说明如下:

key 别名 示例 备注
dh_appId 开放平台 AppID
dh_channelId 渠道编号 1058(官方安卓)、1013(官方 iOS) 安卓/苹果 Key 相同(一级渠道)
dh_channelName 渠道名称
dh_mainchannel CPS 主渠道 100001 玩家广告来源渠道(二级渠道)
dh_secochannel CPS 次渠道 100002 玩家广告来源渠道(三级渠道)
dev_os 设备系统
dev_uuid 设备唯一 ID
dev_brand 设备品牌
dev_model 设备型号
firebase_messaging_token firebase 推送 token
dh_mode 国内海外标识 国内为1,海外为0

# 2、安卓配置

# 2.1、配置 Manifest

  • Unity 2020 版本及之前:/Assets/Plugins/Android/DHSDKPlugin/AndroidManifest.xml
  • Unity 2021 版本及之后:/Assets/Plugins/Android/DHSDKPlugin.androidlib/src/main/AndroidManifest.xml

接入方请确保游戏母包的 AndroidManifest.xml 清单文件中包含如下配置,并且替换为发行给的参数:

DANGER

请根据实际情况进行替换参数。其中 dh_unified_field = true 为固定项,否则会导致无法正常接入。


<manifest>
    <!-- SDK -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- SDK END -->

    <application
            android:name="com.dh.framework.app.DHApplication"
            android:usesCleartextTraffic="true"> <!-- 按需变动 -->
        <!-- SDK -->
        <meta-data android:name="dh_appId" android:value="1696674719"/> <!-- 替换参数 -->
        <meta-data android:name="dh_regCode" android:value="******"/> <!-- 替换参数 -->
        <meta-data android:name="dh_channelId" android:value="1000"/> <!-- 无需变动 -->
        <meta-data android:name="dh_channelName" android:value="test"/> <!-- 无需变动 -->
        <meta-data android:name="dh_mainchannel" android:value="0"/> <!-- 无需变动 -->
        <meta-data android:name="dh_secochannel" android:value="0"/> <!-- 无需变动 -->
        <meta-data android:name="dh_mode" android:value="1"/> <!-- 无需变动 -->
        <meta-data android:name="dh_payType" android:value="1"/> <!-- 无需变动 -->
        <meta-data android:name="dh_signinType" android:value="1"/> <!-- 无需变动 -->
        <meta-data android:name="dh_unified_field" android:value="true"/> <!-- 无需变动 -->
        <uses-library android:name="org.apache.http.legacy" android:required="false"/> <!-- 无需变动 -->

        <activity
                android:name="com.dhplugin.unity.DHUnityActivity"
                android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
                android:exported="true"
                android:screenOrientation="landscape"> <!-- TODO: portrait(竖屏) or landscape(横屏) -->
            <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
            <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false"/>
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- SDK END -->
    </application>
</manifest>

# 2.2、配置 Application

方式一:

若游戏已有自定义Application,需改为继承com.dh.framework.app.DHApplication

import com.dh.framework.app.DHApplication;

public class GameApplication extends DHApplication {
    @Override
    public void onCreate() {
        super.onCreate();
    }
}

同时需要在AndroidManifest.xml文件的<application>标签中进行如下配置:

<application android:name="xxx.xxx.xxx.GameApplication">
  ...
</application>

方式二:

若游戏没有自定义Application,则直接在AndroidManifest.xml文件的<application>标签中进行如下配置:

<application android:name="com.dh.framework.app.DHApplication">
  ...
</application>

# 2.3、设置全局回调

接入方根据实际情况接入全局回调。

# 2.4、生命周期回调

TIP

接入方若直接使用com.dhplugin.unity.DHUnityActivity作为游戏的Activity则跳过此步骤。若接入方需要自定义则需要如下配置。

推荐建立一个BaseActivity,并让游戏中的所有Activity继承该BaseActivity,这样只需重写一次相关方法。

DANGER

其中,onDestroy()方法只需在主 Activity 中调用一次。该方法用于在程序最终关闭时释放变量引用,若在游戏中途调用,将导致无法调用 SDK。

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;

import com.dhplugin.unity.DHUnityHelper;

public class BaseActivity {
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        DHUnityHelper.onCreate(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        DHUnityHelper.onStart(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        DHUnityHelper.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        DHUnityHelper.onPause(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        DHUnityHelper.onStop(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        DHUnityHelper.onDestroy(this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        DHUnityHelper.onNewIntent(this, intent);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, requestCode, data);
        DHUnityHelper.onActivityResult(this, requestCode, resultCode, data);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        DHUnityHelper.onBackPressed(this);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        DHUnityHelper.onConfigurationChanged(newConfig);
    }
}

# 3、苹果配置

DANGER

添加Sign in with AppleUniversal Link后,苹果后台的包名和证书也需要更新,否则会编译报错。

# 3.1、苹果登录

WARNING

Sign in with Apple功能接入需要XCode版本至少大于11才行,否则会报错。

Xcode工程的Target -> Signing & Capabilities中,点击+ Capability

添加Associated Domains模块

添加后在里面填写Universal Link地址参数:applinks:sdk-config.17m3.com

然后继续点击+ Capability,选择Sign in with Apple选项

添加后最终效果如下

# 3.2、配置 Manifest

Editor->Mods下的iOSManifest.projconfig文件需要配置相关参数,可以文本格式打开。

  • projmods: 负责配置是使用苹果In-App Purchase还是使用越狱渠道支付。
  • AppChannel: 为1时会在Unity导出的UnityAppController.mm文件插入 SDK 所需代码,默认为1不用修改。
  • URLTypeSchemes: 负责设置工程的URLScheme,用于第三方授权登录时回调,主要格式如下:dh+appID, tencent+QQKey, wx+WeiXinKey, wb+weiboKeydianhunxqtweixinalipay是支付所需参数不需要修改。

示例如下(使用的是越狱渠道支付):

{
  "projmods": [
    "DHUnitySDKMain",
    "DHUnitySDKLogin",
    "DHUnitySDKAliPay",
    "DHUnitySDKDataCollection",
    "DHUnitySDKShare",
    "DHUnitySDKPush"
  ],
  "AppChannel": 1,
  "URLTypeSchemes": [
    "dh1297305671",
    "dianhunxqtweixinalipay",
    "tencent1103300313",
    "wx932f7c792a64900f",
    "wb1213431043"
  ]
}

如果想要使用苹果In-App purchase支付,projmods参数改为如下:

{
  "projmods": [
    "DHUnitySDKMain",
    "DHUnitySDKLogin",
    "DHUnitySDKAppStorePay",
    "DHUnitySDKDataCollection",
    "DHUnitySDKShare",
    "DHUnitySDKPush"
  ]
}

# 3.3、配置 MainConfig

Editor->Mods->iOS->DHSDKMain目录下需要配置IOSMainConfig.plist文件里面游戏的相关参数:

参数 类型 含义 是否必须
appID String 产品 ID,SDK 必要参数,由开放平台分配 Y
loginIsShowTourist Boolean 登录是否显示游客登录选项 Y
loginMainChannel String 登录主渠道号 N
loginSecoChannel String 登录次渠道号 N
loginRegCode String 注册邀请码,支持注册功能,SDK 服务器将分配给相应的产品注册邀请码 Y
KDKey String 用于第三方调用的参数,该参数用于”口袋梦三国”授权登录 N
QQKey String 应用在 QQ 互联注册并审核后的 APP ID Y
WeiXinKey String 应用在微信开放平台注册并审核后的 APP ID Y
WeiXinSecret String 应用在微信开放平台注册的 KEY Y
weiboKey String 应用在新浪微博开放平台注册并审核后的 APP Key N
weiboRedirectUrl String 应用在新浪微博开放平台注册并审核后的授权回调页 地址,在新浪微博开放平台高级信息中设置,如无特别 需求,推荐填新浪默认地址(https://api.weibo.com/oauth2/default.html) N
version String 应用版本号 Y
isPayTest Boolean 是否选择测试支付 Y
TalkingDataAppid String 数据收集后台 talkingData 应用 ID N
TalkingDataChannel String 数据收集 TalkingData 渠道名称 N
TalkingDataKey String 数据收集后台 talkingdata 应用的 key N
ADTrackingAppid String 数据收集后台 ADTracking 应用 ID N
ADTrackingChannel String 数据收集 ADTracking 渠道名称 N
ADTrackingKey String 数据收集后台 ADTracking 应用的 key N
UMKey String 国内友盟分享需要的 Key,可去友盟后台申请 N
XGAPPID String 信鸽推送后台申请的 APPID N
XGKey String 信鸽推送后台申请的 APPKey N

TIP

QQkey, weiboKey, XGAPPID等参数需要去相关平台申请,可能会有延时。

# 3.4、其他配置

info.plist(如自动打包配置失败)

配置好了 IOSMainConfig.plist 后还需要对 XCode 工程的 Info.plist 文件进行配置,才能正确处理登录,分享授权等流程


信鸽推送配置

需要在苹果后台开启应用包名的推送功能,并在 XCode 工程中进行如下配置

信鸽后台配置:

可以前往信鸽网站http://xg.qq.com/?ADTAG=EXTERNAL.MEDIA.PUSH_11 (opens new window) 去创建信鸽推送后台应用,并获取推送的参数,填到 IOSMainConfig.plist 中的 XGAPPID 和 XGKey 中

信鸽后台参数示例

# 4、鸿蒙配置

# 4.1、SDK 说明

DANGER

  • SDK 提供两种 zip 资源,一种是不包含配置的 SDK,一种是包含配置的 SDK。包含配置的 SDK 为正式参数,游戏直接替换配置文件或替换内部参数;不包含配置的 SDK 仅做接入使用,无法联调。
  • Java 环境要求 JDK17
  • Unity 必须先升级为团结引擎才能进行适配鸿蒙

# 4.1.1、SDK 目录结构说明

  • /demo:demo 工程
  • /resource: SDK 资源
  • /resource/entry/libs/dhsdkhelper.har: SDK har 包
  • /resource/entry/src/main/resources/rawfile/dh_config.json: SDK 配置文件,直接拷贝至/entry/src/main/resources/rawfile 目录
  • /resource/entry/src/main/resources/rawfile/dh_wenxin_config.json: SDK 配置文件,直接拷贝至 /entry/src/main/resources/rawfile目录
  • /resource/entry/build-profile.json5: Module 级配置文件
  • /resource/entry/oh-package.json5: Module 级配置文件
  • /resource/hvigor/hvigor-config.json5: 编译工具版本配置文件
  • /resource/material: 签名配置目录
  • /resource/build-profile.json5: 工程级构建配置文件
  • /resource/metadata.json5: SDK 自定义的metadata配置
  • /resource/oh-package.json5: 工程级配置文件
  • /resource/*-debug.p7b: 联调版本p7b profile
  • /resource/*-publish.p7b: 发布版本p7b profile
  • /resource/dh-debug.cer: 联调版本 cer
  • /resource/dh-release.cer: 发布版本 cer
  • /resource/dh.p12: 签名文件

# 4.2、配置文件修改

TIP

团结引擎 1.3.0 之前版本导出的工程为 ts 模式,且 api 为 11,需要手动 Export 工程然后使用 DevEco 迁移 api12 后编译出包。团结引擎 1.3.0 及以后版本默认导出 ets 模式,api 为 12,不需要手动迁移。

# 4.2.1、工程级 build-profile.json5

(1) 修改 app/signingConfigs 值

参考/resource/build-profile.json5,拷贝内部app/signingConfigs值替换游戏app/signingConfigs值
说明:name为default的配置是联调签名配置,name为publish的配置是发布签名配置,根据当前包体属性选择修改app/products元素中的signingConfig值
示例如下:
"app": {
    "signingConfigs": [
    {
        "name": "default",
        "type": "HarmonyOS",
        "material": {
            "storePassword": "***",
            "certpath": "dh-debug.cer",
            "keyAlias": "***",
            "keyPassword": "***",
            "profile": "zhzf2-debug.p7b",
            "signAlg": "SHA256withECDSA",
            "storeFile": "dh.p12"
        }
    },
    {
        "name": "publish",
        "type": "HarmonyOS",
        "material": {
            "storePassword": "***",
            "certpath": "dh-release.cer",
            "keyAlias": "***",
            "keyPassword": "***",
            "profile": "zhzf2-publish.p7b",
            "signAlg": "SHA256withECDSA",
            "storeFile": "dh.p12"
        }
    }],
    "products": [
    {
        "name": "default",
        "signingConfig": "default",
        "compatibleSdkVersion": "5.0.0(12)",
        "runtimeOS": "HarmonyOS"
    }]
}

(2) 修改 app/products 值

app/products各个元素中增加buildOption属性,值为
{
	"strictMode": {
		"useNormalizedOHMUrl": true
	}
}
示例如下:
"products": [
      {
        "name": "default",
        "signingConfig": "default",
        "compatibleSdkVersion": "5.0.0(12)",
        "runtimeOS": "HarmonyOS",
        "buildOption": {
          "strictMode": {
            "useNormalizedOHMUrl": true
          }
        }
      }
    ]

# 4.2.2、工程级 oh-package.json5(团结引擎 1.3.0 及以上版本不需要操作)

直接拷贝平台/resource/oh-package.json5 到项目根目录,不需要修改

# 4.2.3、entry/build-profile.json5

如果研发有动态import模块,请buildOption/arkOptions/runtimeOnly/packages的数组值中追加dhsdkhelper; 否则拷贝arkOptions属性到buildOption节点

示例如下:

{
  buildOption: {
    arkOptions: {
      runtimeOnly: {
        // 配置本模块变量动态import其他模块名,要求与dependencies中配置的名字一致。
        packages: ["dhsdkhelper"],
      },
    },
  },
}

# 4.2.4、entry/oh-package.json5

如果研发有引用模块,记得保留现有dhsdkhelper的引用,dependencies值中追加"dhsdkhelper": "file:libs/dhsdkhelper.har" ,同时执行ohpm install; 注意:追加内容不允许修改!!!

示例如下:

{
  dependencies: {
    dhsdkhelper: "file:libs/dhsdkhelper.har",
  },
}

# 4.2.5、entry/src/main/module.json5

(1) 修改 module/metadata

请将/resource/metadata.json5的metadata数组内部元素合并追加到游戏工程entry/src/main/module.json5的module/metadata数组中
注意:如果是更新sdk请先移除原电魂SDK中的metadata元素!!!

(2) module/abilities 增加 skills 属性,同时替换子属性 uris/host 为 QQ 的 appid(QQ appid 联系技术获取)

"skills": [
    {
    	"entities": [
    		"entity.system.home",
    		"entity.system.browser"
    	],
    	"actions": [
    		"action.system.home",
    		"ohos.want.action.viewData",
    		"wxentity.action.open"
    	],
    	"uris": [
    	{
    		"scheme": "qqopenapi",
    		"host": "101494849",
    		"path": "auth",
    		"linkFeature": "Login",
    	}
    	]
    }
]

(3) module 增加 querySchemes

"querySchemes": [
	"https",
	"qqopenapi",
	"weixin"
]

# 4.2.6、hvigor/hvigor-config.json5(团结引擎 1.3.0 及以上版本不需要操作)

直接拷贝平台/resource/hvigor/hvigor-config.json5,不需要修改

# 4.2.7、修改包名

修改根目录AppScope目录的app.json5文件,替换bundleName节点属性为游戏的正式包名

# 4.3、文件资源拷贝

# 4.3.1、签名文件

解压 sdk 资源包,拷贝/resource/material目录、/resource/*.p7b文件、/resource/*.cer文件、/resource/dh.p12。共一个目录,5 个文件到游戏工程根目录下。

# 4.3.2、har 包

entry目录下创建libs目录,解压 SDK 资源包,将resource/entry/libs目录下的dhsdkhelper.har拷贝至libs目录,文件名不可修改

# 4.3.3、rawfile

拷贝/resource/entry/src/main/resources/rawfile目录到游戏工程entry/src/main/resources目录下

# 4.4、代码处理

# 4.4.1、TuanjiePlayerAbility.ets

  • 添加引用
import { DHSDKHelper } from "dhsdkhelper";
  • 调用生命周期方法

(1) 在 onWindowStageCreate 生命周期调用 DHSDKHelper 的 onWindowStageCreate 生命周期方法,示例如下:

import { DHSDKHelper } from 'dhsdkhelper';

onWindowStageCreate(windowStage: window.WindowStage): void {
    //调用SDK的onWindowStageCreate方法
    DHSDKHelper.onWindowStageCreate(this.context,windowStage)

(2)在 onCreate 生命周期调用 DHSDKHelper 的 onCreate 方法,示例如下:

import { DHSDKHelper } from 'dhsdkhelper';

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    TuanjieLog.info('%{public}s', 'TuanjiePlayerAbility onCreate, bundleCodeDir:' + this.context.bundleCodeDir);
    //调用SDK的onCreate方法
    DHSDKHelper.onCreate(want, launchParam)
  }

(3)在 onNewWant 生命周期调用 DHSDKHelper 的 onNewWant 方法,如果当前没有 onNewWant 方法,可直接复制下面的方法

import { DHSDKHelper } from 'dhsdkhelper';

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    //调用SDK的onNewWant方法
    DHSDKHelper.onNewWant(want, launchParam)
  }

# 4.4.2、入口界面类(团结引擎 1.3.1 入口类为 TuanjiePlayerAbilityIndex.ets,团结引擎 1.4.2 入口类为 Index.ets)

重要提示

游戏启动页默认不允许显示,需要在收到 sdk 的同意温馨提示回调后显示

  • 添加引用

    import { DHSDKHelper } from "dhsdkhelper";
    import {
      ADInfo,
      DHCallbackRequestCode,
      DHCallbackResultCode,
      DHHarmonyManager,
    } from "../DHHarmonyManager";
    
  • 设置页面显示与隐藏

    代码示例如下:

      //第一步:声明显示标识字段
      @State visible: Visibility = Visibility.Hidden
      ...
      //第二步:build的根元素设置属性visibility
      build(){
          Column(){...}
          .visibility(this.visible)
      }
    
  • 设置接口调用监听

    在入口类的aboutToAppear生命周期中添加如下代码(未找到 aboutToAppear 生命周期可直接复制整个 aboutToAppear 方法):

    aboutToAppear(): void {
        SetToGlobalThis('launchContext', getContext(this));
        TuanjieLog.info('%{public}s', '引擎aboutToAppear');
        DHHarmonyManager.getInstance().setListener((funcName, funcParams) => {
          TuanjieLog.info('%{public}s', '引擎监听到sdk接口调用:' + funcName);
          //主线程调用SDK接口
          if (funcName == DHHarmonyManager.FUNCTION_LOGIN) {
            DHSDKHelper.login(getContext(this))
          } else if (funcName == DHHarmonyManager.FUNCTION_LOGOUT) {
            DHSDKHelper.logout(getContext(this))
          } else if (funcName == DHHarmonyManager.FUNCTION_PAY) {
            if (funcParams.length > 0) {
              DHSDKHelper.pay(getContext(this), funcParams[0])
            }
          } else if (funcName == DHHarmonyManager.FUNCTION_SHOW_FAQS) {
            if (funcParams.length > 0) {
              DHSDKHelper.showFaqs(getContext(this), funcParams[0])
            }
          } else if (funcName == DHHarmonyManager.FUNCTION_SET_ALIAS) {
            if (funcParams.length > 0) {
              DHSDKHelper.setAlias(getContext(this), funcParams[0])
            }
          } else if (funcName == DHHarmonyManager.FUNCTION_DEL_ALIAS) {
            if (funcParams.length > 0) {
              DHSDKHelper.delAlias(getContext(this), funcParams[0])
            }
          } else if (funcName == DHHarmonyManager.FUNCTION_OPEN_USER_CENTER) {
            if (funcParams.length > 0) {
              DHSDKHelper.openUserCenter(getContext(this), funcParams[0])
            }
          } else if (funcName == DHHarmonyManager.FUNCTION_QUERY) {
            if (funcParams.length > 0) {
              DHSDKHelper.query(getContext(this), funcParams[0])
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_EXEC) {
            if (funcParams.length > 0) {
              DHSDKHelper.exec(getContext(this), funcParams[0])
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_SHARE_PHOTO) {
            if (funcParams.length > 0) {
              DHSDKHelper.sharePhoto(getContext(this), funcParams[0])
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_SHARE_LINKS) {
            if (funcParams.length > 0) {
              DHSDKHelper.shareLinks(getContext(this), funcParams[0])
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_COULD_PLAY_AD) {
            if (funcParams.length > 0) {
              try{
                let adInfo:ADInfo = JSON.parse( funcParams[0])
                DHSDKHelper.couldPlayAd(getContext(this), adInfo.uid,adInfo.adType)
              }catch(e){
                TuanjieLog.error('%{public}s', '引擎异常:'+funcParams[0]+','+e);
              }
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_PLAY_AD) {
            if (funcParams.length > 0) {
              try{
                let adInfo:ADInfo = JSON.parse( funcParams[0])
                DHSDKHelper.playAd(getContext(this), adInfo.uid,adInfo.adType)
              }catch(e){
                TuanjieLog.error('%{public}s', '引擎异常:'+funcParams[0]+','+e);
              }
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_SET_GAME_USER_INFO) {
            if (funcParams.length > 1) {
              DHSDKHelper.setGameUserInfo(getContext(this), funcParams[0],funcParams[1])
            }
          }else if (funcName == DHHarmonyManager.FUNCTION_TRACK) {
            if (funcParams.length > 1) {
              DHSDKHelper.trackEvent(getContext(this), funcParams[0],funcParams[1])
            }
          }
        })
        DHSDKHelper.init(getContext(this), (requestCode: number, resultCode: number, data: string) => {
            TuanjieLog.info('%{public}s', '引擎监听到回调:' + requestCode + ',' + resultCode + ',' + data);
            //判断同意温馨提示成功,成功后可以展示游戏引擎界面
            if (requestCode == DHRequestCode.REQ_AGREE_WENXIN_TIPS && resultCode == DHResultCode.OK) {
              //设置展示引擎的界面
              this.visible = Visibility.Visible
            } else if (requestCode == DHRequestCode.REQ_INIT && resultCode == DHResultCode.OK) {
              TuanjieLog.info('%{public}s', 'sdk初始化完成,乐变查询热更开始');
              //乐变查询热更,如果游戏使用乐变,请打开下面注释,同时import 乐变库
              //LebianSdk.queryUpdate((ret) => {
                ////文档说明: https://qlhwsgprmx.feishu.cn/wiki/RSwYwc3yBiwJSBkpZsXcmW47n3X
                //TuanjieLog.info('%{public}s', 'sdk初始化完成,乐变查询热更结束:' + ret);
              //})
            }
            TuanjieMainWorker.getInstance()
              .postMessage({
                type: 'callbackToUnity',
                requestCode: requestCode,
                resultCode: resultCode,
                data: data
              })
          })
      }
    

# 4.4.3、TuanjieMainWorker.ets

  • 添加引用

    import { DHHarmonyManager } from "../DHHarmonyManager";
    

    constructor构造方法中定义的onmessage类型别名中,msg.data.type"RUN_ON_UI_THREAD_JS"的逻辑代码中添加 funcName判断,建议在最后添加如下代码

    private constructor() {
    	...
    	this.threadWorker.onmessage = (msg) => {
    		...
    		if (msg.data.type == "RUN_ON_UI_THREAD_JS") {
    			...
    			//添加如下代码
          let funcName: string = msg.data.funcName;//如果内部已声明funcName可屏蔽该行
    		    if (funcName == DHHarmonyManager.CALL_DHSDK) {
                	let subFuncName:string = msg.data.subFuncName
              		TuanjieLog.info('%{public}s', '引擎调用电魂sdk接口:' + subFuncName);
              		let subFuncParams:string[] = msg.data.subFuncParams
              		DHHarmonyManager.callSdkFunction(subFuncName, subFuncParams)
            	}
    		}
    	}
    }
    
Last Updated: 2025/4/8 14:02:25