文档管理中心
我的
|

AGC App Linking

HarmonyOS 5

App Linking

# App Linking解锁炫酷链接新玩法活动 # 历史地图

场景概述

中国古代史学家历来秉持“左图右史”的治学传统,即通过图文互证的方式深入探究历史脉络。这一理念强调,史书典籍的解读离不开对历史地理空间维度的把握——地图以其直观性弥补了纯文字描述在空间关系呈现上的局限,使抽象的历史事件得以具象化呈现。

正如费尔南·布罗代尔所言:“没有地理,就没有历史”,地理环境实为历史进程不可剥离的时空坐标。

历史地图APP正是基于这一“史地不分家”的核心思想设计开发。以数字化手段重构传统治学方法,将历史文献与地理空间深度融合,用户可动态切换公元前7000年至公元1948年间的历史场景,实现跨时空的沉浸式探索。通过精准还原不同时期的疆域变迁、战争路线、文明分布等地理要素,不仅延续了“索象于图,索理于书”的学术传统,更以交互技术赋予历史研究全新的时空体验维度:

然而,历史地图APP的核心特性——时空信息的动态性与精确性——也带来了一个独特的挑战:跨场景分享困难。这在历史研究者或爱好者群体中尤为突出。当需要引用特定时代、特定位置的历史地图来佐证观点时,若双方身处同一空间,直接展示手机屏幕即可高效讨论。但异地交流时,现有分享方式均存在显著局限:

1、文字描述:难以精确传达复杂的时空坐标与地理关系,信息失真风险高。

2、静态截图:虽然直观,却丧失了地图的核心交互性(如缩放、图层切换、时间轴拖动),无法满足深度探讨需求。

3、坐标数据分享:虽能精确定位,但操作流程相对繁琐,且接收方需手动输入,体验割裂,破坏了交流的流畅性。

相较之下,“App Linking”技术为此场景提供了近乎完美的解决方案。它允许用户生成一个携带完整时空参数(时代、位置、视图状态)的动态链接,接收方点击即可无缝跳转至APP内完全一致的地图视图,瞬间实现“所见即所得”的精准信息同步,彻底解决了异地历史地图分享的痛点。

技术实现

如何判断应用是否适合集成 App Linking? 可参考以下核心标准进行评估:

    a) 内容可分享性与发现难度: 应用内是否存在用户希望分享给他人,但通过常规应用导航难以快速定位的内容?例如,在历史地图应用中,特定时间点、特定位置的地图视图就属于此类“深藏”内容。

    b) 内容可描述性与机器可识别性: 分享的核心信息能否被精炼为一段简单的文本描述?这决定了程序能否据此精准定位目标内容。关键在于,这段描述对机器易于解析,但对人类用户可能不够直观(如地图的经纬度坐标、年代、缩放级别)。

    c) 应用内跳转支持能力: 应用能否基于接收到的内容描述(如上述文本参数),准确解析并跳转至对应的界面,完整展示该内容?

若以上问题答案均为“是”,则可参照官方 App Linking 集成指南 完成集成。核心流程可归纳为以下四个关键步骤:

1、服务开通与配置: 在控制台开通 App Linking 服务并完成基础配置(如域名配置、关联网址等)。此步骤建议严格参照官方控制台示意图操作。

cke_581231.png

2、分享入口与 URL 构造: 在应用内提供用户分享入口(如分享按钮)。用户触发分享后,程序需根据目标内容生成符合规范的 App Linking URL(通常包含用于定位内容的参数,像是坐标、年代信息等),这里要注意的是,对于分享参数通过 encodeURIComponent 进行编码,以防止特殊字符破坏链接:

收起
自动换行
深色代码主题
复制
  private async share(mapLocInfo: MapLocInfo) {
    const contextFaker: Context = getContext(this);
    const resourceMgr: resourceManager.ResourceManager = contextFaker.resourceManager;
    const shareImage: Uint8Array = await resourceMgr.getMediaContent($r('app.media.app_icon'));
    const appName: string = contextFaker.resourceManager.getStringByNameSync('EntryAbility_label');

    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: utd.UniformDataType.HYPERLINK,
      content: `https://xxx.xxx.xxx.xxx/share.html?year=${encodeURIComponent(mapLocInfo.year.toString())}&lng=${encodeURIComponent(mapLocInfo.lng.toString())}&lat=${encodeURIComponent(mapLocInfo.lat.toString())}&zoom=${encodeURIComponent(mapLocInfo.zoom.toString())}`,
      title: `「${appName}」`,
      description: '分享内容',
      thumbnail: shareImage,
    });

    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
    let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    }).then(() => {
      hilog.debug(0xFF00, HistoryMapView.TAG, 'ShareController show success.');
    }).catch((error: BusinessError) => {
      hilog.debug(0xFF00, HistoryMapView.TAG, "ShareController show error. code: %{public}s, message: %{public}s,",
        error.code, error.message);
    });
  }

3、链接接收与参数解析: 在应用的 EntryAbility(应用入口模块)中,实现对新启动意图(want)的监听。从接收到的 App Linking URL 中解析出关键参数(如上一步构造的 year,lng,lat,zoom):

收起
自动换行
深色代码主题
复制
export default class EntryAbility extends UIAbility {
  
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    
    let uri = want?.uri
    if (uri) {
      let urlObject = url.URL.parseURL(uri);

      const shareData = {
         data: {
           year: urlObject.params.get('year'),
           lng: urlObject.params.get('lng'),
           lat: urlObject.params.get('lat'),
           zoom: urlObject.params.get('zoom'),
        } as ExploreData
      } as ShareData;
        AppStorage.setOrCreate<ShareData>('SHAREDATA', shareData);
    }
  }

    // 其他处理逻辑
  }

}

4、内容跳转与展示: 基于解析出的参数,通过应用的路由机制跳转到目标页面,加载并展示对应的具体内容(如特定时间点的历史地图视图)。

测试注意事项:

在测试 App Linking 功能时,切勿直接将第二步生成的链接粘贴到系统浏览器地址栏并回车。这是因为系统会将此行为识别为用户主动请求访问该 URL 对应的网页,从而优先尝试在浏览器中加载,而非触发应用跳转。
cke_866255.png

推荐测试方法:

1、备忘录点击法: 将完整的 App Linking URL 粘贴到手机自带的备忘录或任何文本编辑应用中。保存后,直接点击该链接。系统会将其识别为来自其他应用的链接请求,从而正确触发 App Linking 跳转逻辑。   

2、跨应用分享法: 将链接通过其他应用(如微信)发送给自己,然后在接收端点击该链接进行测试。需特别注意:若在微信环境中打开,需在分享页面添加环境检测逻辑(如判断User-Agent),当识别为微信内置浏览器时,应主动提示用户使用系统浏览器打开链接。可参考以下示例实现:

效果收益

综合上述集成流程,若APP已具备原生页面路由能力,则App Linking的集成成本相对较低。但对于缺乏此类直达能力的应用,需评估是否值得投入开发资源进行架构改造——该决策可能因APP类型(如工具类、内容类等)而异。为便于量化评估,分享一下集成前后的关键指标数据供参考。

于7月初完成App Linking集成并上线后,在后续迭代版本中逐步扩展了碰一碰、延迟链接、跨设备接力等能力。从下载增长数据观察,虽未带来爆发式增长,但增长曲线斜率已呈现显著上扬趋势:

cke_44156.png

从活跃设备维度观察,效果表现更为显著,活跃设备的规模实现量级跃升(或许是因为地图分享方便了,激发了大家的交流欲?)

cke_780065.png

最后分享一个有点意思的数据,在应用跨端接续功能上线后,鸿蒙PC设备占比出现显著提升。当前设备占比TOP5榜单中,华为MateBook系列已占据三席:

cke_1008625.png

点赞
2
收藏
2
回复
1
分享
举报
浏览302 编辑于2025-08-27 13:29广东
全部评论
最多点赞
最新发布
最早发布
感谢分享!
1楼回复于2025-08-26 03:37 来自广东
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。