鴻蒙動態路由實現方案

背景

隨著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.routersfor (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 booleanif (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 objectlet routMapArray = jsonObj['routerMap'] as Array<object>if (!strUtils.isBlank(urlStr)) {try {let tempURL = Url.URL.parseURL(urlStr)let tempUrlStr = tempURL.protocol + '//' + tempURL.host + tempURL.pathnamelet found = falsefor (let value of routMapArray){let name = value['name'] as stringif (name === tempUrlStr) {found = truebreak}}return found}catch (err){}}return false}

至此,基本路由跳轉方案均已經實現,另外可以通過判斷路由是否注冊,來提示用戶。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66238.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡 (42)遠程終端協議TELNET

前言 Telnet&#xff08;Telecommunication Network Protocol&#xff09;是一種網絡協議&#xff0c;屬于TCP/IP協議族&#xff0c;主要用于提供遠程登錄服務。 一、概述 Telnet協議是一種遠程終端協議&#xff0c;它允許用戶通過終端仿真器連接到遠程主機&#xff0c;并在遠程…

汽車網絡信息安全-ISO/SAE 21434解析(上)

目錄 概述 第四章-概述 1. 研究對象和范圍 2. 風險管理 第五章-組織級網絡安全管理 1. 網絡安全治理&#xff08;cybersecurity governance&#xff09; 2. 網絡安全文化&#xff08;cybersecurity culture) 3. 信息共享&#xff08;Information Sharing) 4. 管理體系…

【0393】Postgres內核 checkpointer process ③ 構建 WAL records 工作緩存區

1. 初始化 ThisTimeLineID、RedoRecPtr 函數 InitXLOGAccess() 內部會初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局變量。 下面是這四個變量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…

cursor+deepseek構建自己的AI編程助手

文章目錄 準備工作在Cursor中添加deepseek 準備工作 下載安裝Cursor &#xff08;默認安裝在C盤&#xff09; 注冊deepseek獲取API key 在Cursor中添加deepseek 1、打開cursor&#xff0c;選擇設置 選擇Model&#xff0c;添加deepseek-chat 注意這里去掉其他的勾選項&…

微調神經機器翻譯模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下載 mBART 是一個基于序列到序列的去噪自編碼器&#xff0c;使用 BART 目標在多種語言的大規模單語語料庫上進行預訓練。mBART 是首批通過去噪完整文本在多種語言上預訓練序列到序列模型的方…

潯川社團官方文章被 Devpress 社區收錄!

潯川社團官方文章被 Devpress 社區收錄&#xff01; 親愛的潯川社團成員們以及關注我們的朋友們&#xff1a; 在這個充滿活力與機遇的社團發展歷程中&#xff0c;我們迎來了一則令人振奮的喜訊&#xff01;潯川社團精心創作的官方文章&#xff0c;成功被 Devpress 社區收錄啦&a…

STM32網絡通訊之CubeMX實現LWIP項目設計(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目錄 前言 一、軟件設計 二、CubeMX實現 1.配置前準備 2.CubeMX配置 1.ETH模塊配置 2.時鐘模塊配置 3.中斷模塊配置 4.RCC及SYS配置 5.LWIP模塊配置 3.生成代碼 1.main文件 2.用戶層源文件 3.…

簡單組合邏輯

多路選擇器 在多路數據傳輸過程中&#xff0c;能夠將任意一路選出來的電路叫做數據選擇器&#xff0c;也稱多路選擇器。對于一個具有2^n個輸入和一個輸出的多路選擇器&#xff0c;有n個選擇變量&#xff0c;多路選擇器也是FPGA內部的一個基本資源&#xff0c;主要用于內部信號的…

【Unity-Game4Automation PRO 插件】

Game4Automation PRO 插件 是一個用于 Unity 引擎 的工業自動化仿真工具&#xff0c;它提供了對工業自動化領域的仿真和虛擬調試支持&#xff0c;特別是在與工業機器人、生產線、PLC 系統的集成方面。該插件旨在將工業自動化的實時仿真與游戲開發的高質量 3D 可視化能力結合起來…

【安卓開發】【Android】總結:安卓技能樹

【持續更新】 對筆者在安卓開發的實踐中認為必要的知識點和遇到的問題進行總結。 一、基礎知識部分 1、Android Studio軟件使用 軟件界面 最新的版本是瓢蟲&#xff08;Ladybug&#xff09;&#xff0c;bug的確挺多。筆者更習慣使用電鰻&#xff08;Electric Eel&#xff0…

鴻蒙打包發布

HarmonyOS應用/元服務發布&#xff08;打包發布&#xff09; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密鑰&#xff1a;包含非對稱加密中使用的公鑰和私鑰&#xff0c;存儲在密鑰庫文件中&#xff0c;格式…

Spring Boot 下的Swagger 3.0 與 Swagger 2.0 的詳細對比

先說結論&#xff1a; Swgger 3.0 與Swagger 2.0 區別很大&#xff0c;Swagger3.0用了最新的注釋實現更強大的功能&#xff0c;同時使得代碼更優雅。 就個人而言&#xff0c;如果新項目推薦使用Swgger 3.0&#xff0c;對于工具而言新的一定比舊的好&#xff1b;對接于舊項目原…

神經網絡基礎-價格分類案例

文章目錄 1. 需求分析2. 導入所需工具包3. 構建數據集4. 構建分類網絡模型5. 訓練模型6. 模型訓練7. 評估模型8. 模型優化 學習目標&#xff1a; 掌握構建分類模型流程動手實踐整個過程 1. 需求分析 小明創辦了一家手機公司&#xff0c;他不知道如何估算手機產品的價格。為了…

SAP 固定資產常用的數據表有哪些,他們是怎么記錄數據的?

在SAP系統中&#xff0c;固定資產管理&#xff08;FI-AA&#xff09;涉及多個核心數據表&#xff0c;用于記錄資產主數據、折舊、交易等。以下是常用的數據表及其記錄數據的邏輯&#xff1a; 1. ANKT - 資產主數據表 功能&#xff1a;存儲資產主數據的文本描述。 字段&#x…

光伏儲能電解水制氫仿真模型Matlab/Simulink

今天更新的內容為光伏儲能制氫技術&#xff0c;這個方向我之前在21年就系統研究并發表過相關文章&#xff0c;經過這幾年的發展&#xff0c;綠色制氫技術也受到更多高校的注意&#xff0c;本篇博客也是在原先文章的基礎上進行更新。 首先讓大家熟悉一下綠氫制取技術這個概念&a…

Redis 3.2.1在Win10系統上的安裝教程

諸神緘默不語-個人CSDN博文目錄 這個文件可以跟我要&#xff0c;也可以從官網下載&#xff1a;https://github.com/MicrosoftArchive/redis/releases 這個是微軟以前維護的Windows版Redis安裝包&#xff0c;如果想要比較新的版本可以從別人維護的項目里下&#xff08;https://…

基于springboot+vue.js+uniapp技術開發的一套大型企業MES生產管理系統源碼,支持多端管理

企業級智能制造MES系統源碼&#xff0c;技術架構&#xff1a;springboot vue-element-plus-admin 企業級云MES全套源碼&#xff0c;支持app、小程序、H5、臺后管理端 MES指的是制造企業生產過程執行系統&#xff0c;是一套面向制造企業車間執行層的生產信息化管理系統。MES系…

【Redis】Redis事務和Lua腳本的區別

Redis事務 概念 事務&#xff1a;Redis事務是一組命令的集合&#xff0c;這些命令會被序列化地執行&#xff0c;中間不會被其他命令插入。 MULTI/EXEC&#xff1a;Redis事務通過MULTI命令開始&#xff0c;通過EXEC命令執行所有已入隊的命令。 特點 原子性&#xff1a; 事務…

frameworks 之 AMS與ActivityThread交互

frameworks 之 AMS與ActivityThread交互 1. 類關系2. 流程2.1 AMS流程2.1 ActivityThread流程 3. 堆棧 講解AMS 如何和 ActivityThread 生命周期調用流程 涉及到的類如下 frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.javaframeworks/base/cor…

Jmeter 簡單使用、生成測試報告(一)

一、下載Jmter 去官網下載&#xff0c;我下載的是apache-jmeter-5.6.3.zip&#xff0c;解壓后就能用。 二、安裝java環境 JMeter是基于Java開發的&#xff0c;運行JMeter需要Java環境。 1.下載JDK、安裝Jdk 2.配置java環境變量 3.驗證安裝是否成功&#xff08;java -versio…