跨应用启动UIAbility

news/2025/3/6 14:56:38/文章来源:https://www.cnblogs.com/baiyuas/p/18742708

跨应用启动UIAbility

上篇介绍了应用内启动UIAbility,这篇介绍下应用间的启动方式

应用间UIAbility跳转使用openLink()与startAbility()两个接口均可以实现,应用间跳转主要基于应用链接进行实现(应用内界面跳转页可以通过URI的方式打开),应用链接格式scheme://host[:port]/path

HarmonyOS中根据scheme的不同又将跳转分为Deep LinkingApp Linking两种实现方式。

官方推荐首选使用App Linking的方式,因为使用App Linking其限定了scheme必须为https,同时通过增加域名校验机制,直达受信的目标应用,可以说更为安全。另外一个优点就是系统会根据接口传入的uri信息(HTTPS链接)将用户引导至目标应用中的特定内容,无论应用是否已安装,用户都可以访问到链接对应的内容,跳转体验相比Deep Linking方式更加顺畅。

两种跳转方式都是基于uri来实现应用的定位,所以先看下如何配置uri。在应用工程的module.json5中skills标签创建新的skill对象。

...
"abilities": [{"name": "EntryAbility",..."exported": true,"skills": [{ // 这个默认的不可以删除或修改"entities": ["entity.system.home"],"actions": ["action.system.home"]},{ // 定义应用链接URI需要创建新的skill对象"actions": [// actions不能为空,actions为空会造成目标方匹配失败。"ohos.want.action.viewData"],"uris": [{"scheme": 'example',"host": 'www.byrain.me'}]}]},

Deep Linking

首先在被调用的应用里的module.json5中配置skill对象

{ "actions": [// actions不能为空,actions为空会造成目标方匹配失败。"example.want.action.entry"],"uris": [{"scheme": 'example',"host": 'www.byrain.me'}]
}

配置了应用链接就可以被其他应用调用,如需要处理调用方传入的参数,则在需要拉起的UIAbility的onCreate()或者onNewWant()生命周期回调中,获取、解析拉起方传入的应用链接。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {let uri = want?.uri;if (uri) {// 从链接中解析query参数,拿到参数后,开发者可根据自己的业务需求进行后续的处理。let urlObject = url.URL.parseURL(want?.uri);let action = urlObject.params.get('action');// 如果我们在skill中配置了多个action,可以根据action类型做不用的业务逻辑处理if (action === "byrain.want.action.entry") {}}}
}

调用方可以通过openLink()与startAbility()方法指定应用链接example://www.byrain.me打开我们的示例应用。

 let context = getContext(this) as common.UIAbilityContextlet want: Want = {action: 'example.want.action.entry',uri: 'example://www.byrain.me'
}
context.startAbility(want).then(() => {hilog.info(0x0000, 'testTag', '跳转成功');}).catch((err: BusinessError) => {hilog.error(0x0000, 'testTag', `跳转失败 failed, code is ${err.code}, message is ${err.message}`);});
// 下面是openLink方式打开
// let option: OpenLinkOptions = {
//   appLinkingOnly: false,
//   parameters: {
//
//   }
// }
// context.openLink('example://www.byrain.me', option, (error, result) => {
//     if (error) {
//       // 调用失败
//     }
//     result.resultCode // 目标页面返回code 
//     result.want // 目标页面返回参数
// })

如果我们想指定参数只需要在Want中配置即可或者通过uri后追加,例如example://www.byrain.me?a=1&b=c

要想获取返回结果,可以通过startAbilityForResult接口,参看上面应用内跳转页面获取结果部分实现方式是一样的,对于openLink接口通过回调参数即可。

App Linking

App Linking使用的scheme必须是https,被调用方应用侧的配置和Deek Linking类似,当用户在HarmonOS手机上打开一个链接后,系统就会根据链接来跳转到指定的应用里,如没安装则跳转链接指定的内容。App Linking是依赖与鸿蒙系统和华为平台,鸿蒙系统会根据应用链接到华为后台校验绑定的应用的是否有效,如果指定的应用链接有绑定相应的应用则在系统中打开指定应用。因此需要现在华为平台进行应用链接的绑定操作,下面说下具体步骤:

登录华为平台(https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/myProject),我们主要使用证书我的项目两个模块

配置签名证书

由于AppLinking 不允许DevEco Studio的自动签名功能,必须使用手动签名,否则无法拉起应用。所以需要我们配置手动的签名。手动签名是应用在多设备或者离线下开发调试应用。

  1. 在DevEcoStudio中创建密钥库和证书请求文件

DevEco Studio中的工具栏Build->GenrateKeyAndCSR

  1. 新建KeyStore,在弹出的窗口指定保存路径(这里不是选择keystore文件而是保存,一开始我就理解错了),输入密码(字母数字+特殊字符)

  1. 指定keyalian后点击下一步指定证书请求文件保存路径,在点击完成即可,在我们指定的目录下即可看到生成的密钥文件和证书请求文件

  1. 申请调试证书

在华为后台证书、APP ID和Profile模块中选择证书,然后新增证书,输入相关信息,选择上面生成的证书文件后则会创建一个调试证书,下载后保存到本地后面工程配置签名。

  1. 申请调试Profile

在华为后台证书、APP ID和Profile模块中选择Profile,然后右侧点击添加按钮。

我们选择创建的应用,设置Profile名称,类型选择调试即可,证书选择上面创建的证书。

设备这里需要说下如果在设备里没有我们要调试的设备,可以在左侧设备中添加。添加的时候需要UDID,我这里使用的模拟器,可以通过如下命令获取到设备的UDID

hdc shell bm get --udid

如果是多个设备需要指定设备

hdc -t 127.0.0.1:5555 shell bm get -u

填写好后点击右侧添加按钮就会生成一条Profile信息。点击下载保存到本地后面工程配置签名时候会用到。

  1. 给工程配置签名

通过上面配置我们已经获取到华为调试的证书和Profile,下面将下载的调试证书和调试Profile配置到工程中。在DevEcoStudio中选择File->Project Structure

Signing Configs窗口中,取消Automatically generate signature,p12选择我们步骤2中生成的密钥库,.p7b则选择步骤5中生成的调试Profile,.cer选择步骤4中生成的调试证书。

配置成功后,会在工程文件build-profile.json5中生成签名信息

创建AppID

在APPID项中,我们新建一个应用,创建成功后会生成一条记录,这里的APPID会在后面配置中使用

开通AppLinking

  1. 创建项目

登录华为平台(https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/myProject),新建项目

  1. 开通App Linking服务

打开新建的项目,在左侧栏中找到AppLinking并开通,开通后如下图

  1. 在开发者网站关联应用ID

这一步需要有一个可以访问的域名和服务器。例如:https://example.com。如果你没有也想验证可以下载个cpolar[https://www.cpolar.com]做个内网穿透支持https,这样可以临时测试使用。

登录自己的服务器,在域名的根目录下创建./well-known文件夹,在该文件夹下创建applinking.json,内容如下(建议使用官网文件中的修改appid后直接复制粘贴避免格式错误,https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/app-linking-startup-V14#section6903241628):

{"applinking": {"apps": [{"appIdentifier": "122435" // 替换成上面创建的应用的appid}]}
}

然后要确保可以通过https://example.com/.well-known/applinking.json可以访问到json文件,这一点非常重要。

  1. 在项目中的Applinking模块右侧选择创建,然后填入自己域名地址,然后发布。

发布后如果服务器https://example.com/.well-known/applinking.json下的json文件配置正确并且可以访问则会发布成功。如果显示发布中则可以手机端还尚未完成域名的校验。

验证

以上准备工作完成后就可以通过域名链接在鸿蒙系统上拉起应用。在我们项目的工程文件中要配置skill

我们安装应用后可以通过hdc shell hidumper -s AppDomainVerifyManager来验证创建的Applinking域名是否校验成功,如果显示如下则表示验证成功

com.byrain.example_001:appIdentifier:12345678  // 上面你创建应用的appiddomain verify status:https://example.com:success

至此完成了开发,我们可以通过另外一个应用通过openLink打开链接来验证是否可以拉起我们开发的应用

let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
let link: string = "https://cl.hebeixykj.com/index?abc=123";
// 仅以App Linking的方式打开应用
context.openLink(link, { appLinkingOnly: false }).then(() => {hilog.info(DOMAIN, 'testTag', 'openlink success.');}).catch((error: BusinessError) => {hilog.error(DOMAIN, 'testTag', `openlink failed. error:${JSON.stringify(error)}`);});

在我们应用中被拉起的UIAbilitiy的onCraate或者onNewWant中通过want.uri参数即可获取到传递的链接,通过解析链接也可以获取相关的参数,如果只想针对域名下指定的路径进行拉起应用,可以在skill/uri中指定path

···
"skills": [
{
"entities": [
'entity.system.browsable'
],
"actions": [
'ohos.want.action.viewData'
],
"uris": [
{
"scheme": 'https',
"host": 'example.com'
"path": "index" // 配置index后,只有https://example.com/index的链接才可以拉起应用
}
],
"domainVerify": true
}

···

至此,完成了Applinking的配置和使用,这个Applinking在实际应用场景中很有用。比如我们经常需要在网页中、短信中、扫码等场景下拉起应用,在Android中实现起来就比较繁琐而且还需要兼容很多版本的系统差异,鸿蒙就很好的解决了这个问题而且还保证了安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

virtualbox下载安装配置

virtualbox下载安装配置 下载 https://www.virtualbox.org/ 官网 https://www.virtualbox.org/wiki/Downloads 官网下载页 https://www.filehorse.com/download-virtualbox/old-versions/ 历史版本推荐使用第三个网址即可,我这里是安装的6.1.26版本 安装 右键安…

奶龙验证app

主要加密逻辑和密文 先encrypt加密 然后进行AES/GCM/NoPadding加密 再使用base64加密 对密文解密为乱码,所以将其转换为hexAES-GCM模式 解密时需要的tag是在加密的过程中产生的 为密文的后2,4,8或16位解密 “{”的ASCII码为123encrypt加密在so层为魔改base64大概可以这么理解…

又一中国团队惊艳全球!Manus开启AI智能新篇章

大家好啊,我是仙生。 本来今天还是分享一些有意思的网站,但是早上醒来看到卡神@数字生命卡兹克又熬夜紧跟AI时事写了一篇文章,好家伙我知道这会AI圈又要爆了。 而果不其然的是,一个上午过去,AI概念股又是狂涨,DeepSeek概念股猛猛涨。 那到底咋回事呢? AI领域又现惊人突破…

使用 CloudDM 和企业微信流程化管理数据库变更审批

CloudDM 是一个专为团队协同工作打造的数据库数据管控平台。在管控数据库安全变更的过程中,为提高效率,方便用户使用,CloudDM 接入了主流 OA 协同办公系统(包括钉钉、飞书、企业微信),支持实时通知与移动办公,满足广大企业用户的实际需求。 本文将介绍如何使用 CloudDM …

从中国到全球:头部HR SaaS厂商易路助力奥佳华全球布局增强国际竞争力

作为中国人力资源SaaS领军企业,易路人力资源科技成立于2004年,20年来坚持面向全球中大型企业,以科技赋能人力资源。易路People+是为中大型企业打造的以薪酬为核心的一站式人力资源软件平台,将全球800万用户的先进管理理念与实践总结融合至标准化的SaaS平台,覆盖企业人力资…

〖大系统 观数智〗: 油气大模型部署应用策略讨论

概述:根据业务层级和专业角色部署规模适当的模型。从基础模型到行业/领域模型,再到各层级和专业模型,按照大系统观全息思维,采取逐级知识蒸馏的策略保持系统的结构完整性、一致性和协作能力,逐级缩小模型规模,同时按需分布式自组织部署,配合本地知识库等,建设全息有机系…

数字钥匙系统BLE/UWB

数字钥匙方案采用蓝牙或BLE+UWB技术实现,简称BLE/UWB。BLE即蓝牙低能耗也称低功耗蓝牙。超宽带技术是一种无线载波通信技术,它是利用纳秒级的非正弦波窄脉冲传输数据。数字钥匙是一项创新的汽车钥匙,可以通过蓝牙/UWB定位算法确认钥匙所在区域。UWB技术也可实现脚踢开行李箱…

2027年100%国产替代真的能实现吗?从金融行业看5大关键突破点

在当今数字化浪潮汹涌澎湃的时代,信息技术应用创新(信创)已成为推动我国经济社会发展的重要引擎。金融行业作为国家经济的核心,其信息化建设对于保障国家金融安全和促进经济发展具有重要意义。2027 年,随着信创产业的深入推进,金融行业有望在国产替代方面取得重大突破。今…

在 Mac 上解决 LM Studio 无法下载模型的问题(国内镜像替换教程)

如果你在使用 LM Studio 时遇到类似 There was an error fetching results from Hugging Face 或 Model details error: fetch failed 的报错,大概率是因为国内网络无法稳定连接 Hugging Face 服务器。配置代理可能也无效,但通过替换 LM Studio 内置的 Hugging Face 域名为其…

向新向智向未来,且看天翼云!

护民生“烟火气”,筑幸福“根基石” 多元的民生需求,化作发展引擎的 “燃料仓” 驱动产业创新求变,开启经济繁荣新篇!产业发展是民生福祉的经济基础 为响应“以科技创新为引领,统筹推进 传统产业升级、新兴产业壮大 未来产业培育”要求 作为云服务国家队 天翼云不断提升科…

当AI开始打工:中国团队研发的Manus让我惊掉下巴

昨天夜里,深夜惊雷。一个新团队突然发了一个首款通用行的项目:Manus。 它就是 Monica.im 研发的全球首款 AI Agent 产品「Manus」。据团队介绍,「Manus」是一个真正自主的 AI 代理,能够解决各类复杂多变的任务。与传统 AI 助手不同,Manus 不仅能提供建议或答案,还能直接交…

压测结丹-分布式压测

1、 通过多机负载扩展支持海量压力 HttpRunner v4.2 起,hrp 可支持 master (负载控制器) 与 worker (压力生成器) 模式下启动,基于「一主多从」的负载加压模式实现海量并发。 功能特性 支持使用 auto-start / http-api 控制压测流程 支持任务自动下发(e.g. 参数化、自定义函…