鸿蒙动态路由实现方案

news2025/1/20 4:03:01

背景

随着CSDN 鸿蒙APP 业务功能的增加,以及为了与iOS、Android 端统一页面跳转路由,以及动态下发路由链接,路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。

实现方案

鸿蒙版本动态路由的实现原理,类似于 iOS与Android的实现原理,具体理论可以查看 iOS 动态路由实现 这篇博文,这边不在赘述,这边只阐述实现逻辑。

1、路由地址与页面绑定

为了让鸿蒙中的每个页面都有一个固定的URL地址,我们这边借助了三方框架 HMRouter,具体HMRouter的实现方案,可以查看文档

@HMRouter({ pageUrl: 'app://app.com/blog/detail' })
@Component
export struct BlogDetailPage {
}

2、动态路由注册与跳转

我们实现了一个Router类,该类来实现我们动态路由表存储以及跳转的所有逻辑。routers 中存放了所有已经注册的URL。

 class Router {
  /**
  *  保存了所有已注册的 URL
  *  结构类似 {"blog": {":blogId": {"_":callback}}}
  */
  private  routers:Map<string,CommonAllType>
 }

通过下面方法实现注册动态路由表routers

 /*
   * 添加路由到路由表
   * */
  private addURL(urlStr:string):Map<string,CommonAllType>{
    let pathComponents = this.pathComponentsFromURL(urlStr)
    let subRoutes = this.routers
    for (let pathComponent of pathComponents){
      if (!subRoutes.get(pathComponent)) {
        subRoutes.set(pathComponent,new Map())
      }
      subRoutes = subRoutes.get(pathComponent) as Map<string,CommonAllType>
    }
    return subRoutes
  }

例如注册如下路由:

 Router.registerURLPattern('https://blog.csdn.net/:us' ,(params)=> {
        
 })

注册到本地路由表routers中应该是如下所示

{
    "https": {
        "blog.csdn.net": {
            ":us": {
                "_": function ( {...} )
            }
        }
    }
}

在这里插入图片描述
所有注册的路由,都是以这种方式存储在routers中,跳转时就会从路由表中查询匹配到的路由,来跳转。
当有路由跳转时,调用以下方法:

Router.openUrl('https://blog.csdn.net/weixin_36162680/article/details/124127748', {'isLogin':true})

跳转时,匹配到路由有,那么也会生成相应的路由参数,如下:

{
    "un": "weixin_36162680",
    "id": "124127748"
}

3、动态路由重定向实现及远端路由表格式

路由重定向

对于移动端的路由重定向,实际上就是将一个路由转换为另一个路由,例如:
https://blog.csdn.net/:us
转换为:
app://app.com/blog/detail?us=xxx

远端路由表格式

一条路由规则,分为一个 Key 和对应的 Value,Key 为需要注册的路由(匹配规则),Value 中包含重定向的路由地址,或者需要拦截的参数等。
这里面的Key 必须是与鸿蒙中页面所绑定的路由地址。

{
    "app://app.csdn.net/blog/detail": {
        "needLogin": true
    },
    "https://blog.csdn.net/:un": {
        "redirectUrl": "csdnapp://app.csdn.net/blog/detail"
    }
}

跳转时重定向逻辑

Router.registerURLPattern('https://blog.csdn.net/:us' ,(params)=> {
      //判断是否需要登录
      if (!UserTool.isLogin() && params.has(Router.routerNeedLogin)) {
        let needLogin = params.get(Router.routerNeedLogin) as boolean
        if (needLogin) {
          Router.login()
          return
        }
      }
      //判断是否需要重定向
      .....
    })
HMRouter 路由是否注册

在使用的时候,还有情况需要判断页面是否绑定了HMRouter

/*
   * hm_router是否注册
   * */
  static isRegisterHMRouter(urlStr: string) : boolean {
    let mapJsonValue = getContext().resourceManager.getRawFileContentSync('hm_router_map.json')
    let jsonStr: string = strUtils.uint8ArrayToStr(mapJsonValue)
    let jsonObj = JSON.parse(jsonStr) as object
    let routMapArray = jsonObj['routerMap'] as Array<object>
    if (!strUtils.isBlank(urlStr)) {
      try {
        let tempURL = Url.URL.parseURL(urlStr)
        let tempUrlStr = tempURL.protocol + '//' + tempURL.host + tempURL.pathname
        let found = false
        for (let value of routMapArray){
          let name = value['name'] as string
          if (name === tempUrlStr) {
            found = true
            break
          }
        }
        return found
      }
      catch (err){

      }
    }
    return false
  }

至此,基本路由跳转方案均已经实现,另外可以通过判断路由是否注册,来提示用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道&#xff0c;可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道&#xff0c;每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知&#xff0c;而传统相机的传感器通常只…

论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24

论文地址&#xff1a;https://arxiv.org/abs/2403.01744 bib引用&#xff1a; misc{zhang2024notellmretrievablelargelanguage,title{NoteLLM: A Retrievable Large Language Model for Note Recommendation}, author{Chao Zhang and Shiwei Wu and Haoxin Zhang and Tong Xu…

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

Day 9 卡玛笔记

这是基于代码随想录的每日打卡 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 **…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

数据结构——队列和栈的面试题分析

之前我们写过了有效括号的分析了&#xff0c;接下来&#xff0c;我们继续来学习一下&#xff0c;有关栈和队列之间的相关转换的题目吧。 栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 这里我们使用c语言的形式来写&#xff0c;所以我们先自己模拟一…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

Web前端------表单标签

一.表单标签介绍 1.认识表单 表单---类似于日常生活中的申请单 都是去填写一些信息去申请某个功能&#xff0c;例如&#xff1a;账号密码昵称&#xff0c;登陆网站 2.常见标签 常见的标签 <form></form> 表单标签&#xff0c;所有表单信息都包含在这个标签内…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法&#xff1a; img_path "./data/yndx"1.1 使用 …

下定决心不去读研了。。。

大家好&#xff0c;我是苍何。 之前发表过一篇文章&#xff0c;表达了自己读研的困惑和纠结&#xff0c;得到了大家很多的建议&#xff0c;也引起了很多人的共鸣&#xff0c;在留言区分享了自己的故事&#xff0c;看着这些故事&#xff0c;我觉得都够苍何写一部小说了。 可惜苍…

单链表的新建、查找

10.3 头插法新建链表实战 10.3.1 流程图 10.3.1.1 整体的流程图 10.3.1.2 循环的流程图 10.3.2 代码 !!!头指针始终指向头结点&#xff01;&#xff01;&#xff01;头插法&#xff1a;实则就是不断地插元素插在头结点的后面最初要先给头结点的指针域赋值为NULL #include &…

【unity进阶篇】向量插值运算Vector3.Lerp和Vector3.Slerp

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

CSS 的基础知识及应用

前言 CSS&#xff08;层叠样式表&#xff09;是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现&#xff0c;使页面不仅实现功能&#xff0c;还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…

怎么投稿各大媒体网站?如何快速辨别一家媒体是否适合自己?

在做软文营销时&#xff0c;除去在官号和子账号上投稿外&#xff0c;怎么投稿各大媒体网站是困扰中小企业主的一大难题。没有多余账号、运营成本太高&#xff0c;让不少想做全平台推广的朋友止步于此。为了解决这些问题&#xff0c;今天就让小编来分享一下&#xff0c;怎么在各…

dl学习笔记:(4)简单神经网络

&#xff08;1&#xff09;单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…