首页 > 其他分享 >【鸿蒙开发教程】HarmonyOS NEXT对于游戏类App的基础支持

【鸿蒙开发教程】HarmonyOS NEXT对于游戏类App的基础支持

时间:2024-06-18 22:00:23浏览次数:23  
标签:stringify 登录 App 游戏类 NEXT JSON let 玩家 ID

前言

根据研究机构Counterpoint Research发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。

这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统

随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的增长。这对于想要换赛道的程序员来说是一个非常好的消息,话说大家最近有想法转型鸿蒙开发吗?

游戏应用作为App中特殊的一类,需要从系统获取信息,也需要借助系统API实现游戏特有的一些功能,例如登录、支付、防沉迷、实名认证等。

HarmonyOS专门为游戏类应用提供了Game Service Kit(基础游戏服务),用于提供游戏相关的基础能力。

基于Game Service Kit,我们可以实现华为登录、获取玩家信息、获取玩家角色、保存玩家角色等功能。
【开发环境】

●版本规则号:HarmonyOS NEXT
●版本类型:Developer Preview2
●OpenHarmony API Version:11 Release
●compileSdkVersion:4.1.0(11)
●IDE:DevEco Studio 4.1.3.700(Mac)

1. 登录

登录功能需要要使用华为帐号应用统一认证服务(Account Kit)。
首先,需要导入authentication:

import { authentication } from '@kit.AccountKit';

再创建登录请求:

// 创建登录请求,并设置参数
    let loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
    // 当用户未登录华为帐号时,是否强制拉起华为帐号登录界面
    loginRequest.forceLogin = true;
    loginRequest.state = util.generateRandomUUID();

最后,执行登录请求,即可在回调中获取登录信息:

// 执行登录请求
    try {
      let controller = new authentication.AuthenticationController(getContext(this) as common.UIAbilityContext);
      controller.executeRequest(loginRequest, (err, data) => {
        if (err) {
          this.logText = "login failed:" +  JSON.stringify(err);
          hilog.error(0x0000, 'testTag', 'login fail, error: %{public}s', JSON.stringify(err));
          return;
        }
        let loginWithHuaweiIDResponse = data as authentication.LoginWithHuaweiIDResponse;
        let state = loginWithHuaweiIDResponse.state;
        if (state != undefined && loginRequest.state != state) {
          this.logText = "login failed:" + JSON.stringify(loginWithHuaweiIDResponse)
          hilog.error(0x0000, 'testTag', 'login fail,The state is different: %{public}s', JSON.stringify(loginWithHuaweiIDResponse));
          return;
        }
        this.logText = "login success:" + JSON.stringify(loginWithHuaweiIDResponse)
        hilog.debug(0x0000, 'testTag', 'login success, %{public}s', JSON.stringify(loginWithHuaweiIDResponse));

        let loginWithHuaweiIDCredential = loginWithHuaweiIDResponse.data!;
        let tokenCode = loginWithHuaweiIDCredential.authorizationCode; // 登录token
        let idToken = loginWithHuaweiIDCredential.idToken; // JWT
        let openId = loginWithHuaweiIDCredential.openID; // Open ID, 跟随App
        let unionId = loginWithHuaweiIDCredential.unionID; // Union ID,跟随华为ID

        hilog.info(0x0000, 'gameService', '【华为登录返回】\n登录token: %{public}s, JWT令牌%{public}s, Open ID: %{public}s, Union ID: %{public}s', tokenCode, idToken, openId, unionId);
        
        // 开发者处理code, idToken, openID, unionID
      });
    } catch (e) {
      this.logText = "login failed:" + JSON.stringify(e)
      hilog.error(0x0000, 'testTag', 'login failed: %{public}s', JSON.stringify(e));
    }

这里使用try-catch捕获异常,在登录请求的回调中,我们获取loginWithHuaweiIDResponse.data用于创建账号或执行游戏平台登录。

其中loginWithHuaweiIDResponse.data的类型是LoginWithHuaweiIDCredential,其属性参数包括:

●authorizationCode: 登录token,用于登录验证。
●idToken: JSON Web令牌(JWT),确保将用户信息安全传输到应用程序。
●openID: 唯一ID,与华为ID关联,随用户使用的应用程序而异。
●unionID: 保持不变的唯一ID,与华为帐号关联,用户同一账号下的所有App的unionID不变。

获取玩家信息

这一能力的使用需要导入gamePlayer:

import { gamePlayer } from '@kit.GameServiceKit';

在init()中通过上下文初始化gamePlayer:

init(){
    let context = getContext(this) as common.UIAbilityContext;
    gamePlayer.init(context, () => {
      this.logText = "init success."
      console.log('init success.');
    });
  }

通过common.UIAbilityContext可以获取gamePlayer信息:

 getPlayer(){
    let context = getContext(this) as common.UIAbilityContext;
    gamePlayer.getLocalPlayer(context, (error, result) => {
    if (error) {
        this.logText = 'getLocalPlayer failed:' + JSON.stringify(error)
        console.error('getLocalPlayer failed:' + JSON.stringify(error));
        return;
      }
      this.logText = 'getLocalPlayer success:' + JSON.stringify(result)
      console.log('getLocalPlayer success:' + JSON.stringify(result))


      let gamePlayerId = result.gamePlayerId; // 玩家ID
      let teamPlayerId = result.teamPlayerId; // 与开发者账号关联的玩家ID
      let idCompatibleType = result.idCompatibleType; // ID关联类型:0-不兼容 1-与playerId关联 2-与OpenId关联 3-与gamePlayerId关联
      let level = result.level; // GameCenter中的玩家消费权限级别。
      let playableTime = result.playableTime; // 玩家这次的可玩时长(单位:分钟)
      
    });
  }

保存玩家角色

gamePlayer支持创建请求,保存玩家角色信息到游戏服务器。角色信息包含roleId、roleName、serverId、serverName、gamePlayerId、teamPlayerId等.

saveRole(){
    let context = getContext(this) as common.UIAbilityContext;
    let request: gamePlayer.GSKPlayerRole = {
      roleId: '890765478',   //玩家角色ID,务必不要传""和null。如游戏没有角色系统,请传入“0”。
      roleName: '爱吃竹子的小胖达', //玩家角色名,务必不要传""和null。如游戏没有角色系统,请传入“default”。
      serverId: '98765789',
      serverName: 'huazhong-1',
      gamePlayerId: '9817678392',
      teamPlayerId: '6718976541'
    };
    gamePlayer.savePlayerRole(context, request, () => {
      this.logText = "savePlayerRole success."
      console.log('savePlayerRole success.');
    });
  }

这里的游戏服务器是指华为游戏服务器,Game Service Kit同时支持REST API获取玩家标识,可以通过Server to Server API对已经获得的Access Token进行鉴权。

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。随着鸿蒙的不断发展以及国家的大力支持,未来鸿蒙职位肯定会迎来一个大的爆发,只有积极应对变化,不断学习和提升自己,我们才能在这个变革的时代中立于不败之地。在这里插入图片描述

标签:stringify,登录,App,游戏类,NEXT,JSON,let,玩家,ID
From: https://blog.csdn.net/HarmonyOS_001/article/details/139755142

相关文章

  • 【鸿蒙教程】华为HarmonyOS NEXT 应用开发 实现日常提醒应用
    前言根据研究机构CounterpointResearch发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统。随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式......
  • 基于SpringBoot+Vue+uniapp的高校实验室信息化综合管理平台建设的详细设计和实现(源码
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的电商购物网站的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的酒店预订管理系统的详细设计和实现(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Mybatis的Mapper中方法入参什么时候加@Param
    参数情况:一个基本类型--不需要多个基本类型--需要一个对象 --不需要多个对象  --不需要一个集合  --不需要 单个基本类型不用加@ParamMapper接口方法:voiddeleteUserById(LonguserId);XML中的SQL语句:<deleteid="deleteUserById"parameterType=......
  • 学习记录APP
    1、用户注册:用户注册信息包括用户ID(学号)、用户名(姓名),手机号码,用户单位(班级),用户班级四项基本信息,用户第一次注册后,用户姓名不用每次输入。2、设定每周学习目标:每周一设置学习目标。例如:本周完成数据库连接等等具体任务目标。3、每日学习记录:内容包括:开始时间、结束时间,每日学习......
  • Hexo博客Next主题更换cdn加速访问
    有时候访问我的博客时,总是会出现cdn.jsdelivr.net无法访问或者访问速度过慢的情况。我的博客园使用的是BNDong/Cnblogs-Theme-SimpleMemory主题,也遇到的这样的情况。经过我的一番折腾之后,将js文件转移到了我自己的OSS中,并且又经过了我的一番折腾之后,设置好了跨域资源共享(CORS)策略,......
  • 数字藏品平台主要功能开发NFT数字藏品系统APP开发
    数据资产正式纳入会计处理范畴,开启了数据资产入表的大幕。数据资产入表可为拥有高价值数据的企业提供数据资源合理变现的机会,企业可在优质数据资源的基础上形成数据产品和服务,通过合规流通和合理定价交易,拓展收入和获得融资。董新刚指出,数据资产入表将为企业提供更为精准的价值......
  • 自动化脚本同步单个平台所有小程序(本质跨平台uniapp但是业务紧急,按需使用)
    点击查看代码#!/bin/bash#设置你要cherry-pick的commithashcommit_hash="a5bdefa5d8cccc7cb73b85a84355c6d977a918fb"#获取所有本地分支的名字,排除远程跟踪分支branches=$(gitbranch--format'%(refname:short)')#遍历每一个分支并执行gitcherry-pickforbranch......
  • 深度解析盲盒小程序APP开发过程——从设计到上线
    一、引言在上一篇文章中,我们为大家介绍了如何入门开发盲盒小程序APP。本文将更加深入地解析盲盒小程序APP的开发过程,从设计到上线全方位解析。二、设计阶段UI设计:根据目标用户群体和品牌定位,设计符合用户喜好和品牌风格的UI界面。注意色彩搭配、字体选择、图标设计等方面。......