一、前言

在鸿蒙OS开发过程中,随着应用规模的扩大,登录状态管理逐渐成为系统设计中的一个挑战。一个清晰、高效的登录状态管理系统不仅可以简化开发流程,还能提升用户体验。本文将分享一种优雅的登录状态管理设计方案,帮助开发者轻松应对复杂系统中的登录状态控制。

二、认证事件与认证代码设计

认证事件是应用全局事件的核心,它触发登录或退出操作,并可在整个项目中进行广播。我们定义了三种基本的认证事件:启动认证、登录认证和退出认证。

认证事件代码示例:

export class AuthenticationEvent {
  static readonly AppStart = "$AppStart$";
  static readonly LogIn = "$LogIn$";
  static readonly LogOut = "$LogOut$";
}

三、认证状态

用户认证状态是系统判断用户是否登录的关键。我们定义了两种状态:认证成功和未认证。

认证状态代码示例:


export const AUTHENTICATION_STATE:string = "$AuthenticationState$"

// 认证状态 
export class AuthenticationState {}

// - authenticated - 认证成功
export class AuthenticationAuthenticated extends AuthenticationState {}

// - unauthenticated - 未认证
export class AuthenticationUnauthenticated extends AuthenticationState {}

四、认证接口模板

认证接口是登录状态管理的具体实现,包括token的检查、保存和删除,以及认证成功和未认证时的页面跳转。

认证接口代码示例:

const TOKEN = "token";

export abstract class IUserAuthentication {
  libPreferencesSync: LibPreferencesSync;

  hasToken(): boolean {
    return this.libPreferencesSync.getValue(TOKEN).toString().length > 0;
  }

  saveToken(token: string) {
    this.libPreferencesSync.saveKeyValue(TOKEN, token);
  }

  deleteToken() {
    this.libPreferencesSync.deleteData(TOKEN);
  }

  abstract authPage(): void;
  abstract unAuthPage(): void;
}

五、管理登录状态的页面

通过事件中心(eventHub),我们可以在整个应用中进行全局状态通知。登录状态管理器根据用户发送的事件来改变认证状态。

登录状态管理器代码示例:


export class Authentication{
  // 私有静态变量,用于保存单例对象
  private static _instance :Authentication;

  // 私有构造函数,防止外部直接实例化
  private constructor() {
    // 构造函数内容
  }

  // 静态方法,用于获取单例对象
  public static getInstance() {
    if (!Authentication._instance) {
      Authentication._instance = new Authentication();
    }
    return Authentication._instance;
  }

  startApp(){
    Application.getInstance().applicationContext.eventHub.emit(AuthenticationEvent.AppStart)
  }

  logIn(token:string){
    Application.getInstance().applicationContext.eventHub.emit(AuthenticationEvent.LogIn,token)
  }

  logOut(){
    Application.getInstance().applicationContext.eventHub.emit(AuthenticationEvent.LogOut)
  }

  init(iuserAuthentciation : IUserAuthentication){
    Application.getInstance().applicationContext.eventHub.on(AuthenticationEvent.AppStart,()=>{
      if(iuserAuthentciation.hasToken()){
        AppStorage.setOrCreate(AUTHENTICATION_STATE,new AuthenticationAuthenticated())
        iuserAuthentciation.authPage();
      }else{
        AppStorage.setOrCreate(AUTHENTICATION_STATE,new AuthenticationUnauthenticated())
        iuserAuthentciation.unAuthPage();
      }
    })
    Application.getInstance().applicationContext.eventHub.on(AuthenticationEvent.LogIn,(token:string)=>{
      iuserAuthentciation.saveToken(token)
      AppStorage.set(AUTHENTICATION_STATE,new AuthenticationAuthenticated())
      iuserAuthentciation.authPage();
    })
    Application.getInstance().applicationContext.eventHub.on(AuthenticationEvent.LogOut,()=>{
      iuserAuthentciation.deleteToken()
      AppStorage.set(AUTHENTICATION_STATE,new AuthenticationUnauthenticated())
      iuserAuthentciation.unAuthPage();
    })
  }
}

六、项目中的使用

在项目中,我们通过初始化登录状态管理器,并在页面中根据认证状态改变页面样式或行为。

项目使用代码示例:

class Auth extends IUserAuthentication {
  // ... 实现具体的登录和未登录页面跳转逻辑
}

// 初始化
Authentication.getInstance().init(new Auth());

// 页面中使用
aboutToAppear(): void {
  this.authentication();
}

authentication() {
  if (this.authetication instanceof AuthenticationAuthenticated) {
    //获取用户数据
  } else if (this.authetication instanceof AuthenticationUnauthenticated) {
    //删除用户数据
  }
}

七、总结

通过本文的分享,我们学习了如何在鸿蒙OS中设计和实现一个优雅的登录状态管理系统。从认证事件的设计到认证状态的管理,再到具体的认证接口实现,每一步都是为了简化开发流程,提高系统的健壮性和可维护性。希望本文能够为鸿蒙OS的开发者提供实用的参考和启发。