ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Unity接入华为SDK从跑通demo到上架:环境配置、账号登录与推送集成全攻略

Unity接入华为SDK从跑通demo到上架:环境配置、账号登录与推送集成全攻略 简介一份面向Unity开发者的华为HMS SDK接入Demo资源包适合需在华为设备上集成游戏服务、账号登录、推送等能力的开发者。包内包含完整Unity工程与示例代码涵盖SDK导入、项目配置、初始化、登录及功能调用等关键环节并附有可运行APK及调试日志便于对照学习排错。资源共2000个文件压缩包约28.82MB文件构成以bin、class、jar、java、xml等为主bin与class对应编译库与字节码jar、java为SDK依赖及接口源码info、meta等为Unity与Android工程元数据整体结构贴近真实接入场景。该资源在CSDN已有1842人学习下载开发者可由此理解HMS SDK在Unity环境下的接入流程快速定位版本兼容、权限配置等问题并可直接基于示例工程改造缩短华为生态集成周期。1. Unity接入华为SDK demo别一上来就写业务代码先跑通官方包再谈集成做国内安卓发行的Unity开发者几乎都会撞上“华为渠道接入”这个需求。账号登录、推送、支付、角标适配每一项背后都是华为自家的HMS Core SDK。很多人拿到“Unity接入华为SDK demo”之后第一反应是往自己的项目里塞SDK包然后被一堆构建报错卡住好几天。实际上正确的顺序应该是先把官方demo完整跑通理解它的目录结构、AGC后台配置和构建链路再迁移到自己的工程。这篇文章就把从环境准备、demo导入、真机调试到踩坑排错的完整路径讲清楚适合刚开始接触HMS Core的Unity客户端同学也适合正在赶华为应用市场上架排期的团队。2. 挑对SDK和准备环境HMS Core、AGC后台与Unity工程的三方对齐很多人被“华为SDK”这个名字误导以为是一个能一把梭的集成包。实际在Unity里华为SDK是按服务拆开的每个服务对应独立的Unity包、独立的初始化代码和独立的AGC后台配置。这一章先把选型和环境准备好后面demo才能少走弯路。2.1 华为SDK不是只有一个包HMS Core各服务的Unity接入差异HMS Core是华为移动服务的能力集合Unity接入时常见的有账号登录、推送、应用内支付、游戏服务、地图、统一扫码等。在华为开发者联盟下载页面里每个服务都是一个单独的unitypackage命名一般是 HMSAccount / HMSPush / IAP 这样的关键词。下载之前先想清楚你的应用到底需要哪几个服务不要一上来把全家桶都导进去包体爆炸不说AGC后台的服务开通状态还会影响初始化。服务类型AGC后台入口Unity包关键词典型用途账号服务认证服务HMSAccount华为账号登录、读取用户资料推送服务推送服务HMSPush通知栏消息、厂商通道下发应用内支付应用内支付IAP游戏内购、去广告付费游戏服务游戏服务HMSGameService排行榜、成就、存档地图服务地图服务HMSMap地图展示、定位选型时注意一点同一服务在不同版本SDK里的初始化方式可能不一样。老版本SDK用的是“manifest里配置meta-data 全局初始化”新版本则要求在代码里显式调用初始化接口。看官方demo时先确认它对应的是哪个SDK版本再对照自己手里的包避免照着老demo写新版代码最后回调各种不触发。2.2 开发者账号与AppGallery Connect上架前必须完成的3项配置在Unity工程里写任何代码之前先把华为开发者联盟的账号搞定。流程不复杂但每一步都关系到后面能不能跑通第一步注册开发者账号第二步在AppGallery Connect后台创建应用第三步下载应用的 agconnect-services.json 配置文件。创建应用时有两个极易埋雷的地方应用包名必须和Unity工程的包名完全一致别今天起一个 com.test.demo明天Unity里改成 com.xxx.game后面所有日志报错都来自这里签名证书的SHA-256指纹必须填进后台很多demo真机闪退都是因为指纹没填或者填成了debug签名的指纹。配置完成后后台会生成一个 JSON 配置文件把它下载下来之后放进Unity工程的Assets根目录。我一般会打开文件检查一下关键字段它长这样字段结构节选如下{ agcgw: { host_url: https://connect-api.cloud.huawei.com }, client: { app_id: 123456789, api_key: xxx, package_name: com.yourcompany.yourapp }, project_info: { project_id: project-xxx } }这个JSON里最核心的是client段。app_id对应华为开发者联盟给应用分配的唯一IDapi_key是SDK访问服务端接口的凭证package_name必须和你Unity里设置的应用包名完全一致。如果这三个值任何一个有问题SDK初始化阶段就会在Logcat里报类似“app_id not match”的错误。还要确认一下文件确实放在了Assets根目录下而不是嵌套在某个子文件夹里否则Unity打包时不会把它带进APK。2.3 Unity工程侧版本、JDK、Android SDK与包名的硬性要求Unity环境的版本匹配是很多人翻车的地方。华为HMS Core Unity SDK在2019.4、2020.3、2021.3这几个LTS版本上表现最稳如果你工程还在用2018或2017建议先升级再接入硬上老版本会碰到Gradle插件的兼容性问题。还没装Unity的话用Unity Hub安装时勾选Android Build Support模块这一步很多人会忘记导致后面导出APK时报SDK工具缺失。JDK和Android SDK方面HMS Core的Android原生层要求Java 8字节码所以JDK版本建议用1.8Android SDK的compileSdkVersion在28到30之间比较稳妥。打开终端检查一下当前环境# 检查JDK版本Unity 2019-2021通常要求JDK 1.8 java -version # 检查Android SDK路径和已安装的平台版本 echo $ANDROID_HOME ls $ANDROID_HOME/platformsUnity导出APK时会优先使用Unity内置的JDK和SDK路径如果输出里版本信息异常去Unity的 External Tools 设置面板里重新指定路径即可。我习惯把ANDROID_HOME显式配置成Unity Hub安装的SDK目录这样命令行工具和Unity编辑器用的是同一套环境排查问题时少很多疑惑。还有两个设置项在建工程时就设好Player Settings里的Scripting Backend设为IL2CPPTarget Architectures勾选ARM64。华为应用市场对64位包的要求越来越严Mono模式可能在部分新机型上出现异常所以提前切换到IL2CPP能省掉后面上架时的返工。包名设置同样在Player Settings里记住一个原则Unity里的包名、AGC后台创建的包名、签名文件里的包名三者必须完全一致少一个分号都不行。3. 把官方demo导入Unity从unitypackage到APK的完整链路环境准备好之后真正的“Unity接入华为SDK demo”操作就开始了。这一章的目标只有一个让官方demo在你的华为真机上跑起来。不要着急改业务逻辑先把整条链路走通。3.1 获取demo的两种方式和目录结构获取华为SDK demo最常见的渠道有两个一个是去华为开发者联盟的HMS Core Unity SDK下载页找对应服务板块页面里会提供包含示例工程的zip包另一个是去官方GitHub仓库找Unity插件工程。第一次做接入时建议用前者下载的完整demo包因为它是已经组装好的示例工程省去自己拼装的时间。下载慢的问题常见做法是换一个网络时段重试或者直接从Google搜索包名找其他分发地址不要在一个坏链接上死磕。解压下载的zip后工程目录通常能看到这样的结构HMS-Core-Unity-Plugin/ ├── Assets/ │ ├── HMSCore/ # 各服务封装层C#脚本和Android原生aar │ ├── Plugins/Android/ # 依赖配置和AndroidManifest片段 │ └── Samples/ # 官方示例场景和测试脚本 ├── Packages/ ├── ProjectSettings/ └── build.gradle这个结构里最有价值的是HMSCore目录它包含了SDK所有的C#封装和原生库是后续业务开发要依赖的核心Samples目录里是可运行的示例场景演示了每个API的调用方式。先花十分钟把Samples里的场景和相关脚本看一遍比直接开接要高效得多你会看到它们是怎么处理登录回调、token获取这些典型逻辑的。3.2 把unitypackage导入demo工程的正确顺序拿到的是工程源码压缩包就直接解压用Unity打开拿到的是unitypackage则需要导入已有工程。导入顺序有讲究我一般是这么做的先创建一个空的Unity工程包名设好再用Build Target切到Android然后双击unitypackage导入。导入完成后马上看Console面板有没有报错如果看到一堆编译错误多半是SDK版本和Unity版本不匹配这时候先停下来换版本不要硬往下走。导入完成后把上一章下载的agconnect-services.json复制到Assets根目录。这个文件放到Assets下面是因为Unity打包时会把整个Assets目录的内容打进去JSON文件会被放进APK的assets目录SDK启动时从这个位置读取配置。放错位置导致的典型报错是初始化时找不到配置文件日志里会提示“Failed to parse agconnect-services.json”。检查文件是否就位可以直接在工程根目录下执行命令确认# 确认关键文件是否就位缺哪个补哪个 ls -la Assets/agconnect-services.json ls -la Assets/HMSCore/ ls -la Assets/Plugins/Android/确认这三个文件都在后打开Build Settings把Samples里的示例场景加入Build列表点击Build按钮生成APK。如果你用的是Unity 2019.4第一次构建会自动下载对应的Gradle版本这个过程受网络环境影响可能很慢甚至失败。常见做法是把下载链接复制到浏览器手动下载然后放进用户目录下的.gradle/wrapper/dists对应文件夹中重新构建就好。3.3 第一次构建APK和真机启动预期什么、看什么日志构建成功只是第一步离“跑通”还差真机验证。连接一台华为手机或者已升级HMS Core的荣耀手机开启USB调试把APK装上去。注意华为手机默认会拦截“未知来源应用”的安装安装时会弹窗确认这是正常现象。启动应用后先在Logcat里过滤HMS相关日志命令是adb logcat -s HMS* Unity* AndroidRuntime:E这条命令的-s参数用来指定日志tag过滤器HMS*匹配华为SDK的日志输出Unity*匹配Unity引擎日志AndroidRuntime:E只显示Java层崩溃错误。启动应用后如果看到“HMS Core is not available”或者“service is unavailable”这类的日志大概率是设备上的华为移动服务版本过旧去应用市场更新HMS Core即可。还有一种情况是日志里出现“Debug mode not opened”或“not allow to call api”。这是因为应用还没有上架AGC后台默认不允许未上架的应用调用线上接口。解决办法是去AppGallery Connect后台在应用信息页打开“调试模式”并把当前华为账号添加到测试用户列表里之后重新构建并安装就能正常走接口了。这一步做完demo的程序流程才算真正完整走通。4. 在demo里接第一个服务账号登录和推送的最小可运行代码demo跑通之后下一步是在示例代码的基础上接自己的业务。账号登录和推送是绝大多数App会用到的两个基础服务而且它们的接入模式可以复用到你后面接IAP、GameService等更多服务上。4.1 账号服务初始化、静默登录与拉起华为登录页华为账号登录的SDK放出来之后第一步是构造授权参数。授权参数决定你向用户申请哪些权限比如只登录拿昵称头像就只需要ID Token和Profile权限不要申请手机号否则审核时会多很多麻烦。这里用官方封装好的AccountAuthParamsHelper来串参数最小可运行的初始化加静默登录代码如下using Huawei.Hms.Account; using Huawei.Hms.Common; using UnityEngine; public class HuaweiAccountDemo : MonoBehaviour { private void Start() { // 构造授权参数申请ID Token和Profile权限用于获取用户标识和公开资料 var helper new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM) .SetIdToken() .SetProfile(); AccountAuthParams authParams helper.CreateParams(); // 用授权参数创建账号认证服务 var service new AccountAuthService(authParams); // 优先静默登录如果用户之前授权过华为会返回缓存的账号信息 service.SilentSignIn() .AddOnSuccessListener(account { Debug.Log(静默登录成功 account.DisplayName); }) .AddOnFailureListener(e { Debug.Log(静默登录失败准备拉起登录页 e.Message); StartAuthCodeFlow(service); }); } private void StartAuthCodeFlow(AccountAuthService service) { // 拉起华为账号授权页用户完成操作后结果回调到Activity service.StartSignIn(/* 当前Activity上下文 */); } }这段代码里有几个点值得说明。DEFAULT_AUTH_REQUEST_PARAM是SDK预置的默认授权范围合集能覆盖大部分游戏和应用的登录需求SetIdToken()会在登录成功后返回一个JWT格式的ID Token用来在后端服务器验证用户身份SetProfile()允许读取用户昵称和头像。拿到AuthAccount对象后除了DisplayName还能取AvatarUriString、OpenId等字段这些在界面上展示用户信息时直接可用。静默登录失败时会进入StartAuthCodeFlow这里调StartSignIn拉起华为账号登录页。注意这个方法需要传入一个Android Activity上下文在纯Unity环境下通常是通过AndroidJavaObject获取当前的Activity或者借助demo工程里封装好的HMSAgent类来简化这步。用户名密码的输入、授权确认都在华为账号页完成你的App无需再写一套账号密码界面。4.2 推送服务token获取与收到消息的两种调试方式推送服务相比账号登录要简单得多核心就是一件事拿到设备推送token。token上送给你的服务器之后服务端通过华为推送接口向这个token下发消息。最小代码就一段using Huawei.Hms.Push; using UnityEngine; public class PushTokenDemo : MonoBehaviour { private void Start() { // 获取当前设备的推送token通常在上送成功前需要缓存到本地 HmsMessaging.GetInstance() .GetToken() .AddOnSuccessListener(token { Debug.Log(推送token token); }) .AddOnFailureListener(e { Debug.Log(获取token失败 e.Message); }); } }HmsMessaging.GetInstance()是HMS推送服务的入口单例GetToken()发起异步请求成功后会返回一串长字符串。这个token每个设备、每个应用都是唯一的卸载重装可能会变化所以客户端每次启动都重新获取并上送是比较稳的实践。token拿到之后怎么验证推送链路通不通我一般用两种方式。第一种是直接上AGConnect后台的消息通知页面创建一个测试通知目标选“按设备token”填入刚打印出来的token发送之后看手机通知栏有没有消息这种方式能验证整条服务端到客户端链路。第二种方式是在本地调试阶段用命令行模拟一个本地通知快速验证消息处理回调不用走后台。两种方式配合能快速区分问题出在服务端还是客户端。4.3 主线程调度回调不触发的第一个嫌疑点很多人在接HMS的时候遇到一个玄学问题代码照着demo抄的接口调用成功但回调里的Debug.Log始终不打印。第一反应是SDK没用对实际上问题出在线程。HMS的回调可能不在Unity主线程上执行而Unity的API比如Debug.Log、GameObject.SetActive只能在主线程调用跨线程调用轻则日志丢失重则直接崩溃。遇到这种情况标准姿势是把回调内容通过线程调度器切回主线程代码如下using Huawei.Hms.Common; using UnityEngine; void OnSuccess(AuthAccount account) { // HMS回调线程可能不是Unity主线程统一切到主线程再操作Unity API Huawei.Hms.Common.ThreadManager.RunOnMainThread(() { Debug.Log(主线程执行安全更新UI account.DisplayName); }); }ThreadManager.RunOnMainThread是HMS Unity SDK提供的线程调度工具接受一个Action把里面的逻辑投递到Unity主线程执行。所有涉及Unity对象操作的代码都放进这个Lambda里就不会再出现“日志偶尔打不出来”或“随机闪退”这类的诡异现象。这条经验能帮你解决掉接入过程中至少三分之一的问题。5. Unity接入华为SDK的5个高频坑从构建失败到回调丢失这一章是整篇文章里最值钱的部分。下面这5个坑前前后后坑过我很多时间也经常在社区里看到别人反复踩。每一条我都按“现象 → 原因 → 解决”的顺序写方便你直接对号入座。5.1 坑一Gradle构建失败报错指向SDK版本冲突现象Unity导出APK时Gradle构建跑到一半报错提示duplicate class或Conflict with dependency。原因华为SDK的Android原生层依赖于特定版本的AndroidX库或HMS Core基础包你项目里其他插件比如友盟、极光也依赖了不同版本的同名库Gradle解析依赖时无法统一。解决在Unity的Assets/Plugins/Android/mainTemplate.gradle里显式声明依赖版本强制所有模块使用同一个版本号。常见做法是把冲突的依赖force掉或者用exclude把重复传递的依赖剔除。5.2 坑二真机启动闪退Logcat里提示证书指纹或app_id错误现象APK装到手机上一启动就崩溃Logcat日志里有app_id not match、fingerprint关键字。原因AGC后台的App ID或SHA-256指纹与本地签名不匹配。绝大多数情况是你用debug签名打的包而后台填的是release签名的指纹或者干脆没填。解决核对Unity导出设置里的Keystore指纹用keytool -list -v -keystore xxx.keystore查SHA-256然后去AGC后台把对应的指纹填上。debug和release各填一个避免之后切换构建模式时再次闪退这算是提前给自己留后悔药。5.3 坑三C#调用成功但回调不回来子线程操作Unity API被忽略现象接口调用进去了日志里也能看到HMS侧的调用记录但自己的AddOnSuccessListener里没有输出。原因回调执行在线程池线程Debug.Log跨线程调用有时被Unity静默吞掉看起来就像回调没触发。解决把回调逻辑包进ThreadManager.RunOnMainThread统一主线程分发这个问题在第四章节已经演示过。遇到回调不回来先检查线程再检查回调参数类型别急着怀疑SDK坏掉了。5.4 坑四打包到手机画面拉伸、UI变形机型适配问题现象demo跑得好好的换一台华为全面屏手机UI被拉伸按钮跑到屏幕外面画面变形。原因Unity的默认画面适配没有针对全面屏和挖孔屏做处理华为设备在刘海屏、挖孔屏下的显示区域比普通屏幕特殊。解决在启动场景里显式设置屏幕方向并针对SafeArea做自适应。用ScreenAdaptation脚本获取Screen.safeArea把根布局的内边距设置成安全区范围同时检查分辨率的match设置。接入华为SDK做上架测试时一定要准备一台全面屏和一台带挖孔的机器不然发上去之后线上反馈会很难看。5.5 坑五demo能跑自己工程接入却报错AndroidManifest合并冲突现象demo构建没问题同样的SDK导入自己工程后构建报Manifest merger failed提示某些属性重复定义或权限缺失。原因demo工程里已经帮你配置好了AndroidManifest.xml里的华为相关Activity、权限和meta-data而你的工程里也有自己的manifest两边的同名标签合并时冲突。解决打开Assets/Plugins/Android/AndroidManifest.xml检查把华为SDK要求的HuaweiIdAuthActivity、PushActivity等组件手动合入主manifest同时确认Fingerprint等meta-data已声明。每次构建失败时Unity都会生成一份合并后的manifest文件通常位于Temp/StagingArea/AndroidManifest.xml用diff工具对比一下就能找到冲突点这个文件是个好东西能省很多时间。6. 离开demo前把配置固化进自己的发布流程demo跑通了SDK也接上了最后一步是把自己从“照着demo敲代码”的状态拔出来让这套配置成为可复用的发布基建。我这里的做法是给Unity工程增加一个华为渠道的构建标记用条件编译把HMS初始化代码和普通逻辑隔离这样同一份代码既可以出华为渠道包也可以出普通安卓包。核心代码如下#if HUAWEI_CHANNEL // 只在华为渠道包中初始化HMS相关服务 InitHuaweiSdk(); #endif这个宏定义通过Unity的Scripting Define Symbols设置在Build Settings的Player Settings里给Android平台加一个HUAWEI_CHANNEL即可。建议写一个编辑器的构建脚本构建前自动判断平台并设置对应的符号顺手把包名后缀和签名文件也统一处理好。这样每次发版不是靠手改配置而是执行一条构建命令配置漂移的问题就从根本上消除了。上架前再把几项关键内容过一遍我每次发包前都会照着这个表核对检查项预期结果应用包名与AGC后台完全一致SHA-256指纹debug和release各填写一次测试用户已添加当前真机测试账号推送token打印成功且非空账号登录静默登录后能拿到用户昵称60帧/卡顿验证接入SDK后主线程无明显掉帧这套流程走下来最大的收获其实是心态上的转变刚接华为SDK时总想着代码怎么抄后来发现真正容易出问题的都不是C#部分而是包名、签名、后台配置和线程调度这些“环境性”的东西。建议你在自己的工程里也建立一份渠道接入清单把每次踩坑的日志片段和解决方式都记进去。我自己的清单已经存了几十条后来再接小米、OPPO的SDK很多坑都是同一类型的照着老经验能避开大部分雷区这大概就是所谓的“血泪经验”。希望这篇笔记能帮你在接华为SDK时少走一段弯路把时间省下来放在自己的业务上。本文还有配套的精品资源点击获取
返回列表