01/10/2025 10:53:04
接入教程(鸿蒙)
Release note:
日期 | 版本号 | 更新说明 | 备注 |
---|---|---|---|
12.17 | 5.38.101 | 解决 UE418 打开 webview 崩溃问题 添加测试环境提示框 引擎脚本自动依赖 msdkoaid 插件 更新 tpns SDK 1.0.5 去掉 abc 文件的调试信息 |
|
12.06 | 5.38.101 | 支持判断 QQ、微信是否安装(仅支持在应用主线程调用) webview 优化、支持跳转 WeChat 支付 支持获取 OAID |
注意: 1. 微信配置的改动(7.5.4 部分) 2. 默认接入 OAID,不需要的自行剔除 3. OAID 权限需要业务获取,对应的权限声明也要业务加载权限清单里 |
11.29 | 5.38.100 | 更新灯塔 SDK,支持上报 appVersion 更新 PixUI SDK 支持配置 QQ 登录方式为账密登录 优化同步方法调用逻辑 支持工具模块 |
|
10.29 | 5.38.100 | xg 插件更新 tpns sdk 1.03 版本(解决推送 crash) | |
10.25 | 5.38.100 | 支持 QQ 登录(qq 扫码和 qq 客户端授权),原帐密和扫码登录功能下掉 webview 增加关闭回调 支持未成年人登录控制(接入前请联系 MSDK 产品) |
|
10.17 | - | 支持微信登录 | |
10.12 | - | webview 的工具栏功能补齐,横竖屏支持,webview 支持左滑退出 解决 QQ 登录时,输入密码时超时问题 更新 tpns 库 插件动态库包体积优化 |
|
09.18 | - | 解决 env 被其他线程使用导致的问题 | |
09.12 | - | 更新 tpns sdk,解决 xg 在 ue 引擎中启动崩溃问题 删除 QQ 网页登录功能,支持的 QQ SDK 扫码和账密登录 |
一、 MSDK鸿蒙版本说明
1.1 版本下载:
UE 引擎: GCloudUE_2.2.19.0_hms_dev-20241217.zip
Unity & 团结 引擎: GCloudUnity_2.2.19.0_hms_dev-20241217.zip
其他 引擎: GCloudUE_2.2.19.0_hms_dev-20241217.zip
1.2 最低版本要求
- 鸿蒙 API 12
- IDE 版本需要更新到最新
1.3 支持的功能
功能陆续补齐中...
- 登录模块:支持的功能:自动登录、游客登录、获取登录态、重置游客、qq 登录、微信登录
- 好友模块:不支持
- 分享模块:不支持
- 群组模块:不支持
- 公告模块:支持
- 推送模块:支持的插件:XG
- 事件上报模块:支持的插件:Beacon
- 异常上报模块:支持的插件:Bugly
- WebView模块:支持的功能:打开网页、获取加密票据、中控逻辑、工具栏、横竖屏,部分js调native功能(参考7.6部分)
- 位置模块:不支持
- 工具模块:支持
- 扩展模块:不支持
1.4 依赖的组件 重要!!!
MSDK 依赖 GCloudCore、PixCore、PxEmbed、PluginCrosCurl,因此接入 MSDK 时,需要带上这些组件。
1.5 插件版本
整包中可以查看每个插件的版本号。
二、开发机本地环境搭建
2.1 DevEco-Studio 环境搭建
下载安装 鸿蒙 DevEco Studio。
2.2 团结引擎环境搭建
2.2.1 官网下载团结引擎
推荐通过团结 Hub 下载。
2.2.2 配置团结引擎使用的 SDK
在下载安装 鸿蒙 DevEco Studio,将 mac 下 DevEco Studio.app/Contents/sdk/HarmonyOS-NEXT-DB2/openharmony(windows 目录:DevEco Studio\sdk\HarmonyOS-NEXT-DB2\openharmony)目录拷贝出来放到一个新创建的目录(作为团结引擎使用的 sdk 目录),并将 openharmony 文件夹名字修改成 12(sdk api的版本,注意这里名字随 sdk api 变化而变化)。
在团结引擎中,打开设置,选择 “External Tools” 条目,配置 OpenHarmony SDK、Node.js SDK、JDK 路径,其中 OpenHarmony SDK 路径选择上面创建好的 “12” 这个目录。
2.3 UE 引擎环境搭建
找华为的人拿支持鸿蒙 API12 的 UE 引擎。
三、原生接入 MSDK
MSDK 环境配置:参考 MSDKV5 文档。
3.1 ets 层
- 在入口 Ability(如:TuanjiePlayerAbility(团结引擎),UnityPlayerAbility(unity 引擎),UE 引擎脚本已处理)中,初始化 MSDK,注意 import 时引入的 MSDKPIXCore 一定要小写(跟 dependencies 中的名字保持一致)
- 在 entry module 中,修改 build-profile.json5,将插件名(这里仅填入了 webview 的插件名,实际需要填入业务需要接入的所有 MSDK 插件名,以及 pxembed 库。!!! 不要漏了,不然出各种问题)填入(注意这里是 buildOption 中)
- 在 entry module 中,修改 src/main 目录下的 module.json5,添加网络权限
- 在工程的 oh-package.json5 文件中,将 MSDK 的插件包加上依赖(其中路径填写 har 包存放的路径)
- 在工程的 oh-package.json5 文件中(注意不是 entry 中的),将 msdkpixcore 路径填入 overrides 中(其中路径填写 har 包存放的路径)
- 在工程级的 build-profile.json5 文件中(注意不是 entry 中的),添加 useNormalizedOHMUrl 属性(注意这个属性只有 api12 及以上才有)
- 将整包中 Plugins/OpenHarmony/MSDKPIXCore/raw(或者 rawfile 文件夹)文件夹下的所有文件,拷贝到工程中 entry 中 /src/main/resoources/rawfile 目录下(注意不要将文件夹(raw/rawfile)也拷贝了)
整包
工程
3.2 c#、c++层
参照 MSDKV5 接入文档:集成指南 · MSDK Developer Reference
如需使用 c++ 接口,则需要使用 ue 或其他引擎整包,里面携带了头文件。
四、团结引擎接入 MSDK
4.1 MSDK 集成和工程导出
- 整包资源:可以从 GCloud(较新)获取,也可以从 1.1 中获取
- 将 GCloudUnity.zip 解压,将其拷贝到团结引擎工程的 Assets 目录下
- 将 Plugins/OHOS_HAR/GCloud 中的文件移动到 OpenHarmony 文件夹中
- 通过团结引擎导出工程,将 TuanjiePlayerAbility.ts 文件的后缀修改为 ets
- 对导出工程进行配置,可参考本文档第 3 部分内容
4.2 MSDK api 调用
api 文档可参照:客户端API · MSDK Developer Reference
4.3 团结引擎 Demo 工程介绍
Demo 工程微盘路径(后续持续更新,压缩包名携带时间):MSDK 鸿蒙版本团结引擎 Demo
- MSDK c# 接口
- demo 中登录、公告、webview 的 API 调用示例(后续持续更新)
- sdk 资源包,如下图所示
注意:
- Demo 工程暂时需要导出鸿蒙工程,然后通过鸿蒙工程直接将 Demo 运行在鸿蒙手机上
- 这里 Demo 工程导出为鸿蒙工程后,无需像第 3 部分内容中配置工程了(已经通过脚本进行修改了)
五、UE 引擎接入 MSDK
MSDK 以 UE 插件的形式提供 SDK,除 MSDKPIXCore,其它插件按需集成。每个插件存在各自特有的配置,集成其他插件的时候,请按照插件要求添加相应的配置。以下提供 UE 引擎的接入指引,适配最新的 API 12, 验证引擎 UE 4.26.2(支持鸿蒙的 UE 引擎,请联系鸿蒙同学获取引擎)。
5.1 资源下载与集成
- 在微盘获取 UE 资源,通常以 GCloud 整包格式提供(1.1 中获取链接)
整包中已经包含包括 MSDKPIXCore、MSDKPIXQQ、MSDKPIXWebView、MSDKPIXBugly、MSDKPIXXG、MSDKPIXBeacon 等 6 个 UE 插件。其中,MSDKPIXXG、MSDKPIXBeacon 两个插件在 UE 引擎上暂未验证通过,可以等验证通过后,再集成二者。另外,GCloud、GCloudCore 为其它组件包括 MSDK 的依赖插件,需要一并集成。
解压后,请将GCloud、GCloudCore、MSDKPIXCore、其他组件拷贝到 UE 引擎的插件目录。拷贝后的示例应如下:
其中,MSDKPixDev426 是工程目录,Plugins 为 UE 插件目录。然后,用 UE 引擎打开工程,编译 OpenHarmony 平台。如下示例:
5.2 MSDK 配置
MSDKPIXCore 是 MSDK 核心框架层,通过 MSDKConfig.ini 文件进行配置,具体配置项可以参考原生接入。MSDKConfig.ini 文件随MSDKPIXCore 一同发布,具体路径在 “MSDKPIXCore\Source\MSDKPIXCore\lib\Harmony\rawfile” 下面,如下示例:
各种 MSDK 相关的配置,如调试开关、服务器地址等在这里配置。QQ 扫码登录、Bugly 上报,这两个功能相应的配置也在 MSDKConfig.ini 中,请参考原生接入文档,完善其中的配置。相应功能,UE 中暂无需特殊操作。
5.3 功能示例
MSDK 当前支持游客登录、QQ 扫码登录、WebView 打开网页、Bugly 上报等。调用步骤与原生步骤类似,首先定义和实现 Observer,然后将 Observer 设置到 MSDK,随后,在需要的地方调用 MSDK 的接口,最后,在 Observer 中处理 MSD K的回调。对于 Bugly,当前仅支持崩溃日志上报,集成并配置后,MSDK 会自动初始化 Bugly,Bugly 后台查看统计数据。以下是这几个功能在UE中的调用示例,可以参考:
5.3.1 定义&实现 Observer
/*
* Observer for login, the methoids OnLoginRetNotify and OnBaseRetNotify should be implemented
*/
class ULoginObserver : public MSDKLoginObserver {
virtual void OnLoginRetNotify(const MSDKLoginRet& loginRet)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, loginRet.retMsg.c_str());
};
virtual void OnBaseRetNotify(const MSDKBaseRet& baseRet)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, baseRet.retMsg.c_str());
};
};
5.3.2 设置 Observer 到 MSDK
ULoginObserver ueObserver;
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("Set Observer..."));
MSDKLogin::SetLoginObserver(&ueObserver);
5.3.3 调用接口
// 游客登录
void UMSDKUserWidgetBase::GuestLogin()
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("GuestLogin..."));
MSDKLogin::Login("Guest");
}
// QQ扫码登录
void UMSDKUserWidgetBase::QrLogin()
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("QrLogin..."));
MSDKLogin::Login("QQ", "", "WebView");
}
// 打开WebView
void UMSDKUserWidgetBase::OpenWebView()
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("OpenWebView..."));
MSDKWebView::OpenUrl("https://www.google.com/");
}
// 获取Encoded Url
void UMSDKUserWidgetBase::GetURLEncoded()
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("GetURLEncoded..."));
std::string urlEncoded = MSDKWebView::GetEncodeUrl("https://www.google.com/");
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, urlEncoded.c_str());
}
5.4 其他
- 鸿蒙 bugly 控制台:https://bugly.woa.com/v2/workbench/apps
- 与 GCloud 一起集成的时候,注意保证先初始 GCloud
- 由于引擎限制,可能运行时找不到插件的问题,必要时加 strictMode 标签
- 遇到集成编译问题可以及时联系 MSDK 同学
六、其他引擎接入 MSDK
整包资源:1.1 中获取。
6.1 导入依赖
6.1.1 拷贝对应 SDK 资源
- 导入 GCloudCore 插件依赖:将 /GCloudCore/Source/GCloudCoreLib/OpenHarmony 目录下的 har 包拷贝到 entry/libs 目录下,将rawfile目录下的文件拷贝到 entry/src/main/resources/rawfile 目录下
- 导入 MSDK 插件依赖:将游戏所需要的 MSDK 插件(如 MSDKPIX{插件名})中的 /MSDKPIX{插件名}/Source/MSDKPIX{插件名}/lib/OpenHarmony 目录下的 har 包拷贝到 entry/libs 目录下,将rawfile目录下的文件拷贝到 entry/src/main/resources/rawfile 目录下
- 导入 PixCore 依赖:将 /PixCore/Source/PixCore/ThirdParty/Libraries/OHOS 目录下的 har 包拷贝到 entry/libs 目录下,将so文件拷贝到 entry/libs/${abi} 目录下(注意这里 abi 指的是 arm64-v8a、x86_64 等等),如:
- 导入 PixEmbed 依赖:将 /PixEmbed/Source/PixEmbed/ThirdParty/Libraries/OHOS 目录下的 har 包拷贝到 entry/libs 目录下
- 导入 PluginCrosCurl 依赖:将 /PluginCrosCurl/Source/PluginCrosCurl/lib/OpenHarmony 目录下的 har 包拷贝到 entry/libs 目录下
6.1.2 添加依赖配置
在工程级的 on-package.json5 将上述拷贝过来的 har 包进行依赖配置
注意:- 其中只添加了两个 MSDK 插件(msdkpixcore.har、msdkpixqq.har),如果游戏需要接入多个 MSDK 插件,则都需要添加到依赖配置中
- overrides 中需要配置 msdkpixcore 和 pxembed 两个库
- 这里 dependencise 和 overrides 中的 key 都是 小写 的
6.2 注册 GCloud 声明周期
6.2.1 在启动 Ability(如 EntryAbility.ets)文件中添加下面的代码
这里代码是用于注册 GCloud 生命周期
注意:这里 11~14 行仅仅添加了 MSDK 和 MSDK 所需要的库的生命周期注册,如果游戏需要集成其他 SDK 库,则参照其 SDK 规则自行添加import { GCLifecycleDispatch } from 'gcloudcore';
class GCLifecycleImport {
static instance: GCLifecycleImport = new GCLifecycleImport();
importFinished:boolean;
private constructor() {
hilog.info(0x0000, "GCLifecycleImport", 'GCLifecycleDispatch: GCLifecycleImport constructor');
this.importFinished = false;
(async () => {
hilog.info(0x0000, "GCLifecycleImport", 'GCLifecycleDispatch: addObserver start');
GCLifecycleDispatch.GetInstance().addObserver(await import('plugincroscurl'));
GCLifecycleDispatch.GetInstance().addObserver(await import('gpixui'));
GCLifecycleDispatch.GetInstance().addObserver(await import('msdkpixcore'));
GCLifecycleDispatch.GetInstance().addObserver(await import('gcloudcore'));
hilog.info(0x0000, "GCLifecycleImport", 'GCLifecycleDispatch: addObserver finish');
this.importFinished = true;
})();
}
}
6.2.2 在启动 Ability(如 EntryAbility.ets)的生命周期函数中,添加 GCloud 生命周期分发函数调用
在 onCreate、onNewWant、onDestroy、onWindowStateCreate、onWindowStageDestroy、onForegroud、onBackgroud 生命周期函数中调用
GCLifecycleDispatch.GetInstance().onCreate(this.context, want, launchParam)
GCLifecycleDispatch.GetInstance().onNewWant(want, launchParam)
GCLifecycleDispatch.GetInstance().onDestroy()
GCLifecycleDispatch.GetInstance().onWindowStateCreate(windowStage)
GCLifecycleDispatch.GetInstance().onWindowStageDestroy()
GCLifecycleDispatch.GetInstance().onForegroud()
GCLifecycleDispatch.GetInstance().onBackgroud()
6.3 使用 MSDK c++ 接口
api 文档可参照:客户端API · MSDK Developer Reference
6.4 CMake链接MSDKPIXCore动态库
MSDK C++ 接口的符号都在 msdkpixcore 中,因此需要业务自己链接 msdkpixcore。
6.4.1 添加动态库寻找路径
if(DEFINED PACKAGE_FIND_FILE)
include(${PACKAGE_FIND_FILE})
endif()
6.4.2 链接动态库
注意这里 msdkpixcore 的大小写target_link_libraries(xxx msdkpixcore::MSDKPIXCore) # 此处的xxx是业务自己的动态库名字
6.4.3 头文件位置
将头文件拷贝到游戏工程中,在 cmakelist 中添加头文件搜索路径,如:include_directories(xxx/xxx/xxx)
七、模块功能的使用
此处只列举跟 Android、iOS 不一样的地方。其他的用法可参考。MSDK文档
7.1 推送模块
接口使用方式可以参考文档推送模块
7.1.1 信鸽渠道(XG)
配置信息:
在 MSDKConfig.ini中,添加 XG 鸿蒙的配置
登录 登录 - 腾讯云,在产品管理>配置管理页面获取应用的 AccessID、AccessKey。这里可以复用 Android 端的
XG_ACCESS_ID_HARMONY = xxx
XG_ACCESS_KEY_HARMONY = xxx
除了 MSDKLocalNotification 结构体和离线模式,其他接口跟 Android 端用法一样。另支持 cleanBadgeNumber 清除角标功能。
- 后台推送接口:
- 鸿蒙通道消息分类:
移动推送 鸿蒙消息分类功能使用说明-SDK 文档-文档中心-腾讯云
- 鸿蒙通道的抵达回执:
移动推送 鸿蒙通道抵达回执获取指南-SDK 文档-文档中心-腾讯云
- 离线模式:
离线模式下需要在 entry module 的 /src/main/module.json5 中添加 metadata 字段,可参照文档 鸿蒙离线通道配置、鸿蒙参数申请指南。
- MSDKLocalNotification:
用于添加本地消息时,需要使用到的本地消息体。
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
notifyId | string | 否 | 通知 id,设置 SDK 内部会根据时间生成 |
threadId | string | 否 | 通知分组,不传则使用默认分组 |
traceId | string | 否 | 附加参数 |
type | int | 是 | NOTIFICATION 通知 1 - PUSHMESSAGE 透传消息 2 - |
notificationSlotType | int | 否 | 通知slot 类型,参考 notificationManager.SlotType 已有如下值 0 - UNKNOWN_TYPE 未知类型 1 - SOCIAL_COMMUNICATION 社交通信 2 - SERVICE_INFORMATION 服务提醒 3 - CONTENT_INFORMATION 内容资讯 4 - LIVE_VIEW 实况窗(预留能力,暂未支持) 5 - CUSTOMER_SERVICE 客服消息。该类型用于用户与商家之间的客服消息,需由用户主动发起 |
isAlertOnce | boolean | 否 | 设置是否仅有一次此通知提醒 |
largetIcon | string | 否 | 通知大图标。可选字段,图像像素的总字节数不超过 100KB。实际显示效果依赖于设备能力和通知中心 UI 样式 |
largetIconType | int | 否 | 大图标图片类型: 0 本地图片资源文件名,图片应位于 media 目录下 1 图片 url |
title | string | 是 | 本地通知标题 |
content | string | 是 | 本地通知内容 |
additionalText | string | 否 | 通知概要内容,是对通知内容对补充,不传则使用 content 代替 |
inlines | string[] | 否 | 多行类型通知,最多支持 3 行内容,并且每行内容不能为空,如果为空则弹出普通通知 |
badgeNumber | int | 否 | 本地通知为通知消息时生效,要增加的角标数,大于等于 0, 不传角标数不变 |
date | int | 否 | 本地通知触发的日期 注意:格式为: year*10000 + month*100 + day |
hour | int | 否 | 在触发本地通知日期前提下,当天允许触发本地通知开启的小时, 24 小时制 |
min | int | 否 | 在触发本地通知日期前提下,当天允许触发本地通知的分钟,与 hour 字段配合使用 |
actionType | int | 是 | OPEN_APP 点击通知后触发的行为 0 - OPEN_CUSTOM_ABILITY 打开应用首页或打开应用自定义页面 1 - |
action | string | 否 | 当 actionType 为打开应用自定义页面时,字段 uri 和 action 至少填写一个,优先使用 action 字段 |
uri | string | 否 | 应用内置页面 ability 对应的 uri,ur对象内部结构请参见 skills 标签。当 actionType 为打开自定义页面时,字段 uri 和 action 至少填写一个。当存在多个 Ability 时,分别填写不同 Ability 的 action 和 uri,优先使用 action 查找对应的应用内置页面 |
customContent | string | 否 | 附加参数 |
ttl | int | 否 | 消息过期时间,默认 72h |
showMode | int | 否 | 通知展示模式: DEFAULT 默认都展示 0 - BACKGROUND 只有后台才展示 1 - |
注意:
actionType 中:
OPEN_APP:表示点击通知后,打开应用
OPEN_CUSTOM_ABILITY:表示点击通知后,打开应用的指定页面。有两种方式:action、uri
- action:
这里需要在 skills 中添加一个 actions,如下图,其中 actions 的内容可以自定义,但需要与上述 MSDKLocalNotification 中的 action 字段保持一致。
- uri:
这里需要在 skills 中添加一个 actions 和 uris,如下图,其中一定要配置一个空的 actions 内容如下图中的 1 处,然后在 uris 中配置自定义的 url 基本信息。这里的信息需要与 MSDKLocalNotification 中的 uri 字段保持一致,url 的组成为:{scheme}://{host}/{path}
7.2 事件上报模块
事件上报的接口:可参考文档:事件上报模块 · MSDK Developer Reference
7.2.1 灯塔渠道(Beacon)
- 配置:
灯塔应用统计已迁移到新管理端 http://analytics.beacon.tencent.com/,新管理端应用注册和绑定到所属业务的方式,参考灯塔文档指引:http://tapd.oa.com/beacon_wiki/markdown_wikis/show/#1220412912001667727,如有疑问,可咨询:灯塔小秘。
注意:
- 不能复用 Android 的 key,鸿蒙端需要重新申请,否则上报失败。
- 新申请的 key,需要找 goodhu(企业微信号)帮忙开通 qimei36
从 “项目管理-基础信息” 中获取鸿蒙端的 AppKey 填入 MSDKConfig.ini 中的 BEACON_APP_KEY_HARMONY 字段中
BEACON_APP_KEY_HARMONY = xxx
7.3 异常上报模块
异常上报的接口:可参考文档:异常上报模块 · MSDK Developer Reference
(注意:其中 MSDKCrash::LogInfo、MSDKCrash::CloseCrashReport 接口暂不支持,OnCrashExtraMessageNotify、OnCrashExtraDataNotify 两个回调返回暂不支持,待 Bugly SDK 支持后,MSDK 予以更新)
7.3.1 Bugly 渠道
7.3.1.1 配置
在 bugly2 内网注册产品,平台选择 Harmony,可以参考这份文档的“步骤一、注册产品”。
如需使用外网站点,可登录 bugly2 官网获取用户 ID 后,联系 bugly小助手 添加产品管理权限。
将APP ID 、APP KEY 填入 MSDKConfig.ini 中:
BUGLY2_APP_ID_HARMONY = xxx
BUGLY2_APP_KEY_HARMONY = xxx
7.3.1.2 Bugly 插件名更改为 Bugly2
由于 MSDK bugly 插件接入的是 bugly2 sdk,为了保持 Android、iOS 一致,现将鸿蒙端 bugly 插件改名为 bugly2
更改步骤:
- 将游戏项目工程中 MSDKPIXBugly 插件删除掉,下载最新版本鸿蒙整包(其中包含 MSDKPIXBugly2),解压后替换到游戏引擎工程中
- 在 MSDKConfig.ini 中,做如下配置的替换:
a)CRASH_REPORT_CHANNEL 将其中的 Bugly 改成 Bugly2
b)BUGLY_APP_ID_HARMONY 改成 BUGLY2_APP_ID_HARMONY
c)BUGLY_APP_KEY_HARMONY 改成 BUGLY2_APP_KEY_HARMONY
7.4 QQ 登录
7.4.1 重要提醒
MSDKPIXQQ 鸿蒙版本集成 QQOpenSDK 版本 1.0.2,支持基于 QQOpenSDK 的扫码登录和拉起 QQ App 登录。注意:原拉起 WebView 扫码登录形式已废弃。
7.4.2 QQ 客户端下载
通过华为的应用商店邀请的方式体验版本
优先确认下系统,必须是鸿蒙 NEXT,并且版本号 >= 0.0.68
鸿蒙 QQ 目前会不定期发布公测,业务可先填写相关申请人企微账号,后续有公测计划会拉群通知
7.4.3 鸿蒙应用信息提交
将以下两个信息获取,及手Q AppID一并发送给 jiaganzheng(企业微信名)
- Bundle ID:鸿蒙应用的包名,详情可查看文档中心
- fingerprint:鸿蒙应用的签名信息
1、可以通过 ets 代码获取
import { bundleManager } from '@kit.AbilityKit';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
let fingerprint = bundleInfo.signatureInfo.fingerprint.toLowerCase()
2、fingerprint 也可通过 shell 命令获取
keytool -printcert -file xxx.cer
证书指纹:
SHA1: xxx
SHA256: xxx
取这里的 SHA256 值
3、可以通过 shell 命令查询当前安装的 app 来获取 fingerprint 和 appIdentifier
# usb链接鸿蒙手机后
# 进入shell
hdc shell
# 查询信息,其中有 fingerprint 和 appIdentifier
bm dump -n 包名
7.4.4 配置
7.4.4.1 在 MSDKConfig.ini 中有如下配置
// 替换 {YOUR_QQ_APP_ID} 为业务申请的QQ APPID
QQ_APP_ID = {YOUR_QQ_APP_ID}
7.4.4.2 entry 的 module.json5 配置文件,请注意 scheme 的大小写
// module.json5 的"module"节点下配置 querySchemes
"querySchemes": [
"https",
"qqopenapi"
]
// 在 Ability 的 skills 节点中配置scheme
"skills": [
{
"entities": [
"entity.system.browser"
],
"actions": [
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "qqopenapi", // 接收 QQ 回调数据
"host": "{业务的互联 appId}", // 业务申请的互联 appId,注意这里{}也一起被替换
"path": "auth",
"linkFeature": "Login",
}
]
}
]
7.4.5 接口调用方式
注意:
- 如果之前发邮件申请过 H5 账密,未安装手Q场景下拉起的是账密页面
- 如果之前未申请过 H5 账密,未安装手Q场景下默认拉起的是下载 QQ 页面
7.4.5.1 通过拉起 QQ App 登录
c#:
// 注:permission 默认传 all 即可
MSDKLogin.Login("QQ", "all", "", "");
c++:
// 注:permission 默认传 all 即可
MSDKLogin::Login("QQ", "all", "", "");
7.4.5.2 通过 QQ SDK 扫码登录
c#:
// 注:
// 1. permission 默认传 all 即可
// 2. 在扩展参数传入 '{\"QRCode\":true}' 参数指定使用扫码登录
MSDKLogin.Login("QQ", "all", "", "{\"QRCode\":true}");
c++:
// 注:
// 1. permission 默认传 all 即可
// 2. 在扩展参数传入 '{\"QRCode\":true}' 参数指定使用扫码登录
MSDKLogin::Login("QQ","all", "", "{\"QRCode\":true}");
7.4.5.3 通过网页帐密登录
注意:需要申请 H5 账密
c#:
// 注:
// 1. permission 默认传 all 即可
// 2. 在扩展参数传入 '{\"forceWebLogin\":true}' 参数指定使用网页帐密登录
MSDKLogin.Login("QQ", "all", "", "{\"forceWebLogin\":true}");
c++:
// 注:
// 1. permission 默认传 all 即可
// 2. 在扩展参数传入 '{\"forceWebLogin\":true}' 参数指定使用网页帐密登录
MSDKLogin::Login("QQ","all", "", "{\"forceWebLogin\":true}");
7.5 微信登录
7.5.1 微信客户端下载安装
通过华为的应用商店邀请的方式体验版本
优先确认下系统,必须是鸿蒙NEXT,并且版本号 >= 0.0.68
目前已经支持华为应用商店体验了,后面统一走应用商店的方式,登记到下面的文档中
外部-鸿蒙微信 AppGallery 内测体验权限收集 联系人:peterfan(企业微信名)
登记后,会向手机号发送邀请链接,使用鸿蒙手机访问邀请链接,即可下载微信客户端内测版本。
7.5.2 鸿蒙应用信息提交
将以下两个信息获取,及微信 AppID 一并发送给 jiaganzheng(企业微信名)
7.5.2.1 可以通过 ets 代码获取
import { bundleManager } from '@kit.AbilityKit';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
let identifier = bundleInfo.signatureInfo.appIdentifier
7.5.2.2 可以通过查询当前安装的 app 来获取 fingerprint 和 appIdentifier
# usb链接鸿蒙手机后
# 进入shell
hdc shell
# 查询信息,其中有 fingerprint 和 appIdentifier
bm dump -n 包名
7.5.2.3 可以通过华为开放平台获取 appIdentifier
7.5.3 配置
在 MSDKConfig.ini 中有如下配置
// 申请的微信 APPID,AppID 可以使用 Android 的
WECHAT\_APP\_ID =
7.5.4 entry 中的 module.json5 配置 querySchemes
// module.json5 的"module"节点下配置 querySchemes
"querySchemes": [
"weixin"
]
7.5.5 接口调用方式
7.5.5.1 跳转微信客户端登录(必须先安装微信客户端)
c#:
MSDKLogin.Login("WeChat", "", "", "");
c++:
MSDKLogin::Login("WeChat", "", "", "");
7.5.5.2 微信 SDK 扫码登录
c#:
MSDKLogin.Login("WeChat", "", "", "{\"QRCode\":true}");
c++:
MSDKLogin::Login("WeChat","", "", "{\"QRCode\":true}");
7.6 WebView
鸿蒙端 WebView 功能大体可参照 MSDKV5 文档:WebView模块 · MSDK Developer Reference
其中 js 调用 native 代码 有所差异:
7.6.1 功能描述
js 代码通过 MSDKWebView 调用 Native 功能,实现网页内的全屏、打开应用、发消息、分享等功能,并将结果通知观察者(MSDKWebViewObserver)。
支持的功能如下:
方法名 | 功能说明 |
---|---|
closeWebView | 关闭 MSDK 内置浏览器 |
setFullScreen | 设置/关闭浏览器全屏。设置 isFullScreen 为 true 表示全屏;false 关闭全屏 |
setScreenOrientation | 设置浏览器横竖屏 |
jsCallNative | 暂未支持 |
sendMsgWebView | 暂未支持 |
shareWebView | 暂未支持 |
isAppInstalled | 支持 QQ 和 WeChat,参数填入 “QQ”、“WeChat” |
sendGetPhoneNumberRequest | 暂未支持 |
GoForward | JS 前进 |
GoBack | JS 后退 |
7.6.1.1 浏览器操作代码示例(支持:关闭浏览器、设置浏览器全屏、还原浏览器全屏、设置浏览器横竖屏、JS 数据到 Native)
注意:横竖屏的数值跟 Android 相反,6 表示竖屏,7 表示横屏//初始化协议参数
<script>
var SetFullScreen = '{"MsdkMethod":"setFullScreen","isFullScreen":true}';
var ReSetFullScreen = '{"MsdkMethod":"setFullScreen","isFullScreen":false}';
var CloseWebView = '{"MsdkMethod":"closeWebView","key":"value"}';
var JsCallNative = '{"MsdkMethod":"jsCallNative","type":"execCallJS"}';
// 以下是 鸿蒙 设置浏览器横竖屏示例
var SetLandscapeScreen = '{"MsdkMethod":"setScreenOrientation","screenOrientation":"7"}';
var SetPortraitScreen = '{"MsdkMethod":"setScreenOrientation","screenOrientation":"6"}';
</script>
...
//调用msdkCall,发送CloseWebView到Native
<input type="button" value="关闭MSDK内置浏览器" onclick="msdkCall(CloseWebView)">
<input type="button" value="设置浏览器全屏" onclick="msdkCall(SetFullScreen)">
<input type="button" value="还原浏览器全屏" onclick="msdkCall(ReSetFullScreen)">
<input type="button" value="设置浏览器横屏" onclick="msdkCall(SetLandscapeScreen)">
<input type="button" value="设置浏览器竖屏" onclick="msdkCall(SetPortraitScreen)">
7.6.1.2 JS 前进、后退
可通过 JS 前进、后退接口来控制内置浏览器页面的前进与后退。
var GoForward = '{"MsdkMethod":"GoForward"}';
var GoBack = '{"MsdkMethod":"GoBack"}';
//调用msdkCall,发送GoForward、GoBack到Native
<input type="button" value="前进" onclick="msdkCall(GoForward)">
<input type="button" value="后退" onclick="msdkCall(GoBack)">
7.7 OAID
获取 OAID 为敏感信息,需要经过合规流程。涉及 MSDK 的操作:
- 每次启动仅访问 OAID 相关系统方法一次
- 插件化方式接入,默认携带
7.7.1 接入步骤
接入 MSDKPIX V5.38.101 及以上鸿蒙版本的时候,按照如下必要步骤继续完成 OAID 的接入。共分为 3 步:
步骤1:获取 msdkoaid.har 包
从产品或者 MSDK 下载链接获取 msdkoaid.har 的 har 包,这个 har 包用于访问系统的 OAID。请将该 har 包放到工程的 har 包集合中,并确保打包到最终的可执行程序中。默认已经携带 msdkoaid.har 包。
步骤2:配置权限声明
OAID 的获取需要系统的 APP_TRACKING_CONSENT 权限,请在游戏的权限列表中添加相应的声明,并做描述。entry/main/src/module.json5 声明示例:
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "$string:module_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},{
"name": "ohos.permission.APP\_TRACKING\_CONSENT",
"reason": "$string:tracking_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
其中,name 设置为 ohos.permission.APP_TRACKING_CONSENT,reason 为权限说明。
步骤3:启动时索取权限
默认情况下,应用程序是没有 ohos.permission.APP_TRACKING_CONSENT 权限的,MSDK 无法获取 OAID,需要在获取 OAID 操作之前完成对相应权限的请求,并获取到用户的同意。示例代码:
const at: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
at.requestPermissionsFromUser(MSDKPlatform.getAbilityContext(), ["ohos.permission.APP\_TRACKING\_CONSENT"]).then((data) => {
if (data.authResults[0] === 0) {
MSDKLog.d('', 'succeeded in requesting permission');
}else {
MSDKLog.d('', 'user rejected');
}
}).catch((err: BusinessError) => {
MSDKLog.d('', `request permission failed, error: ${err.code} ${err.message}`);
});
建议请求 OAID 权限的代码放到游戏启动过程,与其他权限一同请求,但至少保障在 MSDK 登录前完成权限请求。当没有权限的时候,OAID 为空字符串。另外,需要关注当前华为的策略:请求权限当前暂无弹窗,默认用户同意。也就是上述方法正常调用后,即可获取到权限。用户可以在系统与元服务中将权限关闭。
步骤5:隐私协议披露
接入 OAID 后,请接入者注意披露相关隐私协议。
验证方法:MSDK 调试日志中,登录请求携带 OAID 字段,长度为 36 位。
7.7.2 注意问题
- OAID 为插件化方式接入,注意集成对应的 har 包,如果不需要,可以剔除
- OAID 优先从 TDM 中获取,由于 TDM 当前不支持,该逻辑暂不可使用
7.8 工具模块
7.8.1 判断 QQ 或微信是否安装
注意:在保持 MSDK IsAppInstall 接口不变的情况下,由于鸿蒙的线程模型的问题,目前无法做到在非主线程调用 ets 的接口并且同步返回结果,因此 IsAppInstall 接口在鸿蒙端加一个限制,只能在主线程调用(主线程判断:线程 id == 进程 id)
// C++
bool isQQInstalled = MSDKTools::IsAppInstall("QQ");
bool isWeChatInstalled = MSDKTools::IsAppInstall("WeChat");
// C#
bool isQQInstalled = MSDKTools.IsAppInstalled("QQ");
bool isWeChatInstalled = MSDKTools.IsAppInstalled("WeChat");
Q&A
1、偶现页面卡在登录界面
解决方案:MSDK 的接口只能在 MSDK 初始化完成之后调用,检查代码是否按照文档 3.1 接入 MSDK 初始化回调。
2、信鸽离线模式,在应用未启动的时候无法收到推送消息
推送问题请优先使用排查工具先检查推送下发详情。
工具箱地址:https://console.cloud.tencent.com/tpns/user-tools
工具说明:
1) 设备查询:可通过 TPNS token,获取设备详情、厂商推送注册详情、与该设备绑定的账号列表、与该设备绑定的标签列表等 2) 推送查询:可通过 TPNS token 和 pushId,查询推送状态的详情
3、MSDK 和 TDM 同时使用 qimei sdk,引起库冲突问题
现象:
解决方案:可以参照 文档中心,在 .ohpmrc 文件中,将 resolve_conflict 配置为 true.
注:最新版本的 ide 已经自动处理了这个问题。4、MSDK 和 TDM 同时使用 qimei sdk,导致编译时报错,提示 qimei sdk 缺失问题
现象:
解决方案:
- 在 ide 的菜单 Build-》Clean Project
- 在 ide 的 Terminal 中输入以下指令
ohpm clean
ohpm cache clean
ohpm install --all
5、 未成年控制的问题
MSDK 登录功能已经对接了中控,每次登录都将带上未成年标记,并透传到中控,由中控控制后续的登录流程。游戏可以通过在鸿蒙设备上打开、关闭未成年人设置来验证功能。打开、关闭未成年人开关可以参考鸿蒙文档:文档中心
注:接入功能前请先联系 MSDK 产品。
6、拉起 QQ 授权,授权后提示“暂无可用打开方式”
检查 scheme(文档7.4.4.2部分)是否配置正确。 特别注意:业务申请的互联 appId,注意这里的{}也一起被替换。
7、登录 QQ 时,报参数错误:
错误信息:
{"detail":"","message":"Third app parameters error!","type":3}
原因1:
使用的版本是 10.29 及之前的版本,QQ SDK 不支持混淆(后续版本 QQ SDK 支持了混淆)
解决:
在 entry 中的 obfuscation-rules.txt 文件中添加这一句禁止混淆:-disable-obfuscation
原因2:
使用的版本是 10.29 及之前的版本,QQ SDK 不支持 permission 传入空的情况
解决:
permission 传入"all"
8、登录 Q Q时返回 1002,加载超时
错误信息:
retCode: 9999, msgType: 1002, jsonMsg: {"thirdMsg":"加载超时"}
onSslErrorEvent: {"handler":{},"error":3,xxxxxxxxxxx}
原因:
设备时间不正确
解决:
调整设备时间为网络时间,如设备时间已经是网络时间,可重启应用尝试
9、微信登录失败,提示 “BundleID 信息校验不通过”
解决:
按照 文档 7.5.2 部分 核对相关配置是否处理
All rights reserved.