概述

短信拉端是一种通过短信直达服务的技术解决方案,目标应用通过短信向用户推送包含链接的信息,用户点击后可直接在浏览器或跳转打开目标应用完成业务闭环。这种技术广泛应用于话费查询、缴费提醒、优惠推广等场景,旨在提供便捷的服务体验。

在日常生活中,用户经常会收到各类服务短信,例如:

  • 📱手机话费余额不足提醒
  • 💡水电气费用缴纳通知
  • 💳信用卡账单提醒
  • 📦快递派送状态更新
  • 🏥医疗挂号预约提醒

这些短信中通常包含跳转链接,用户点击后期望能够:

  • 直达相关业务办理页面
  • 完成支付、查询等操作
  • 获得流畅的服务体验

在短信拉端场景中,用户点击短信链接跳转到Web页面后,可能会遇到以下几类问题:Web页面加载异常、Web页面跳转跨应用页面异常、以及Web页面跳转应用异常。本文将从用户问题现象出发,逐步分析问题原因,并提供对应的解决方案。

 

实现原理

短信拉端流程如下图所示。

  1. 目标应用发出短信,携带链接地址服务商通过短信平台向用户发送包含链接的服务短信。
  2. 用户点击链接后跳转到浏览器页面用户点击短信中的链接,页面会在浏览器中打开。
  3. 完成业务闭环:

短信拉端异常分析:

  • Web页面加载异常

问题现象

短信中的链接点击后,打开的Web页面显示空白、无法正常交互,或页面加载异常。

可能原因1Web页面的User-Agent(后续简称为UA)标识未适配HarmonyOS NEXT设备或浏览器环境,导致兼容性问题。

解决措施适配UA标识。确保Web页面适配了HarmonyOS NEXT设备和配套浏览器的UA标识,以正确识别设备并跳转到对应页面或平台。详细请参见Web页面HarmonyOS NEXT设备UA适配

可能原因2对应的Web页面可能未完全开发或存在错误(如资源加载失败、后端服务异常等)。

解决措施检查页面开发完整性。确认页面资源是否正常加载,后端接口是否返回正确数据。

可能原因3短信链接地址错误,导致无法正确加载目标页面。

解决措施验证链接地址。确保短信中推送的链接地址正确无误。

  • Web页面跳转跨应用页面异常

问题现象

用户点击短信链接进入Web页面后,尝试从该应用的Web A页面跳转到跨应用的Web B页面时发生异常(例如A应用的宽带充值页面跳转B应用的支付页面,在B应用的支付页面使用时发生异常)。

  • 页面跳转失败,停留在当前页面。
  • 跳转后页面加载错误或显示空白。

可能原因1目标Web B页面的UA标识未适配HarmonyOS NEXT设备或浏览器环境,导致兼容性问题。

解决措施适配UA标识。确保Web B页面适配了HarmonyOS NEXT设备和配套浏览器的UA标识,以正确识别设备并跳转到对应页面或平台。详细请参见Web页面HarmonyOS NEXT设备UA适配

可能原因2目标Web B页面资源加载失败。

解决措施检查Web B页面的资源加载情况。

  • Web页面跳转应用异常

问题现象

用户从短信链接跳转到Web页面后,尝试通过页面操作跳转应用时发生异常,例如:

  1. 点击“打开应用”按钮后无反应。
  2. 点击“下载应用”按钮后跳转到错误平台,或提示直接下载APK包。

可能原因1点击“打开应用”按钮无反应,可能是因为目标应用未正确配置拉端逻辑(例如Deep Linking或App Linking),或者配置过程中存在错误。

解决措施检查拉端逻辑。确保Web页面跳转的目标应用正确配置了Deep Linking或App Linking。详细请参见使用Deep Linking实现应用间跳转使用App Linking实现应用间跳转

可能原因2点击“打开应用”按钮无反应,Web页面使用链接不正确。

解决措施检查Web页面“打开应用”跳转地址的正确性。使用正确的Deep Linking或App Linking跳转地址。

可能原因3目标应用未安装,点击“下载应用”按钮,触发应用下载逻辑跳转到应用下载的Web页面,但如果Web页面未正确适配HarmonyOS NEXT设备的UA标识,导致跳转到错误平台,或提示直接下载APK包。

解决措施适配UA标识。确保Web页面适配了HarmonyOS NEXT设备和配套浏览器的UA标识,以正确识别设备并跳转到对应页面或平台。详细请参见Web页面HarmonyOS NEXT设备UA适配

 

Web页面拉端适配--解决方案

场景描述

通过点击页面内的“打开应用”按钮,检查是否能正确打开目标应用:

  • 若无法打开应用,检查Deep Linking或App Linking链接是否正确。
  • 若链接正确但仍无法打开应用,需确认应用是否已适配相关技术。

开发步骤

采用App Linking或Deep Linking进行Web页面拉端适配,Web页面拉端实现方案常见的有以下几种:

Web页面拉端的实现方式包括以下几种:

  • 使用a标签的href属性。将href属性设置为拉端的链接地址。
  • 使用window.location.href。设置window.location.href=拉端的链接地址。
  • window.open()。将拉端的链接地址作为window.open()参数,即window.open('拉端的链接地址')。

本章节以a标签打开为例进行举例说明。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .web_page_demo {
            width: 100vw;
            height: 100vh;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            align-items: center;
        }
        .title {
            width: calc(100% - 48px);
            color: rgba(23, 9, 9, 0.9);
            font-family: 鸿蒙黑体;
            font-size: 30px;
            font-weight: 700;
            line-height: 40px;
            letter-spacing: 0px;
            text-align: left;
            margin-top: 64px;
        }
        ul {
            width: calc(100% - 48px);
            display: flex;
            flex-direction: column;
            margin-bottom: 16px;
            list-style: none;
        }
        ul li {
            width: 100%;
            height: 40px;
            border-radius: 20px;
            background: rgb(10, 89, 247);
            margin-bottom: 12px;
            text-align: center;
        }
        .function_item {
            width: 100%;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
            color: rgb(255, 255, 255);
            text-decoration: none;
            font-family: "鸿蒙黑体";
            font-size: 16px;
            font-weight: 500;
            line-height: 22px;
            letter-spacing: 0px;
        }
        ul li:last-child {
            margin-bottom: 0px;
        }
    </style>
</head>

<body>
<div class="web_page_demo">
    <div class="title">Web拉端示例</div>
    <ul>
        <li>
            <!-- Deep Linking跳转 -->
            <a class="function_item" href="应用的Deep Linking地址">打开应用(Deep Linking)</a>
        </li>
        <li>
            <!-- App Linking跳转 -->
            <a class="function_item" href="应用的App Linking地址">打开应用(App Linking)</a>
        </li>
        <li>
            <!-- // 跳转到应用市场详情页 -->
            <a class="function_item"
               href="https://appgallery.huawei.com/app/detail?id=com.huawei.hmos.vmall">去应用市场下载</a>
        </li>
    </ul>
</div>
</body>

</html>
<script></script>

效果示意如下图所示。

其他实现方式核心参考代码如下所示。

// 使用window.location.href方式跳转
// Deep Linking
window.location.href = "应用的Deep Linking地址"; 
// App Linking 
window.location.href = "应用的App Linking地址"; 

// 使用window.open()方式跳转
// Deep Linking
window.open('应用的Deep Linking地址'); 
// App Linking
window.open('应用的App Linking地址'); 

该方案需要应用已经适配了Deep Linking或App Linking,若还未适配,请参见使用Deep Linking实现应用间跳转使用App Linking实现应用间跳转进行适配。

 

说明:

当Web页面嵌入的拉起链接使用App Linking技术时,确保App Linking链接的域名与当前访问Web页面的域名不同,即Host部分不能完全相同。例如,https://www.huawei.com/https://www.huawei.com/cn/的Host部分均为huawei.com,这将导致系统认为用户希望继续在Web页面中浏览,从而阻止应用拉起。

Web页面HarmonyOS NEXT设备UA适配

场景描述

User-Agent(UA)是HTTP请求头中的一部分,用于标识终端设备的操作系统、浏览器版本、硬件平台等特征信息。

Web页面适配时,UA信息常被用来区分不同平台或类型的终端设备,以提供针对性的功能和界面。

详细指导请参见User-Agent开发指导如何通过User-Agent识别HarmonyOS设备

在HarmonyOS NEXT设备中,使用特定的UA标识(如OpenHarmony)进行设备标识。如果未正确适配UA标识,可能会导致以下问题:

  • 页面无法正确检测设备类型。
  • 跳转至错误的平台页面。
  • 错误的文件提供(如直接提供APK下载而非对应平台软件)。

因此,适配HarmonyOS NEXT设备的重要步骤是正确识别UA,从而确保应用或平台页面拥有响应式操作体验。

开发者可以根据实际需求,在客户端(Web页面)或服务端实施UA标识的适配:

  • 客户端适配(Web页面适配)通过浏览器navigator.userAgent获取当前设备的UA。动态调整页面内容或资源加载。
  • 服务端适配在请求到达应用服务器之前进行UA判断和重定向等 。

开发步骤

本章节以客户端适配(Web页面适配)为例,UA的配置需要先获取当前用户设备的UA信息,通过在页面代码中解析UA标识来适配HarmonyOS NEXT设备。

  1. 确认UA格式

    确保HarmonyOS NEXT设备的UA包含关键字OpenHarmony。

  2. 添加适配逻辑

    在Web页面中,通过解析navigator.userAgent获取用户UA,并基于关键字进行逻辑判断。

  3. 引导用户跳转

    根据UA判断结果,执行相应跳转操作(如指向正确的下载地址或提供兼容的页面内容)。

/**
 * 判断是否为HarmonyOS NEXT设备
 */
function isHarmonyOSNEXTDevice(): boolean {
  const userAgent = navigator.userAgent; // 获取设备的UA字符串
  const matches = userAgent.match(/OpenHarmony (\d+\.?\d*)/); // 匹配OpenHarmony
  return /OpenHarmony/i.test(userAgent);
}

示例代码

以下提供完整的兼容多平台的客户端适配(Web网页)方案供参考。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>应用打开方式演示</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
            line-height: 1.6;
            max-width: 800px;
            margin: 20px auto;
            padding: 0 20px;
        }
        .container {
            background-color: #f8f9fa;
            border-radius: 10px;
            padding: 30px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #2c3e50;
            margin-bottom: 25px;
        }
        p {
            color: #34495e;
            margin-bottom: 30px;
        }
        .ua-info {
            color: #7f8c8d;
            font-size: 0.9em;
            margin: 15px 0;
            padding: 10px;
            background-color: #f0f3f4;
            border-radius: 5px;
            word-break: break-all;
        }
        .button-group {
            display: flex;
            flex-direction: column;
            gap: 15px;
        }
        button {
            padding: 12px 24px;
            border: none;
            border-radius: 6px;
            cursor: pointer;
            font-size: 16px;
            transition: opacity 0.3s;
            width: 100%;
            max-width: 300px;
            margin: 0 auto;
        }
        button:hover {
            opacity: 0.9;
        }
        #deepLinkBtn {
            background-color: #3498db;
            color: white;
        }
        #appLinkBtn {
            background-color: #2ecc71;
            color: white;
        }
        #downloadBtn {
            background-color: #e74c3c;
            color: white;
        }
    </style>
</head>

<body>
<div class="container">
    <h1>应用打开方式演示</h1>
    <p>
        本页面演示不同方式打开移动应用程序:</br>
        1. Deep Linking 直接通过协议打开应用</br>
        2. App Linking 通过通用链接打开应用</br>
        3. 直接下载应用程序</br>
    </p>
    <div id="uaDisplay" class="ua-info"></div>
    <div class="button-group">
        <button id="deepLinkBtn" onclick="handleDeepLinking()">使用 Deep Linking 打开</button>
        <button id="appLinkBtn" onclick="handleAppLinking()">使用 App Linking 打开</button>
        <button id="downloadBtn" onclick="handleDownload()">下载应用</button>
    </div>
</div>

<script>
    // 在页面加载时获取并存储 UA
    let userAgent = '';
    let platform = null;
    function detectPlatform() {
        const matches = navigator.userAgent.match(/OpenHarmony (\d+\.?\d*)/); // 获取设备版本
        const ua = userAgent;
        return {
            isHarmonyOSNEXT: /OpenHarmony/i.test(navigator.userAgent) && matches?.length && Number(matches[1]) >= 5, // 匹配HarmonyOS NEXT设备
            // 匹配其他平台
        }
    }
    window.addEventListener('DOMContentLoaded', () => {
        userAgent = navigator.userAgent;
        // 新增UA显示逻辑 
        const uaElement = document.getElementById('uaDisplay');
        uaElement.textContent = `当前UA标识: ${userAgent}`;
        console.log('UA标识已获取并显示');
        // 执行平台检测 
        platform = detectPlatform();
        console.log('检测结果:', platform); // 调试输出
    });
    // Deep Linking处理函数
    function handleDeepLinking() {
        if (!platform) {
            alert('平台检测未完成,请稍后重试');
            return;
        }
        if (platform.isHarmonyOSNEXT) {
            // 打开HarmonyOS应用
            window.location.href = "应用的Deep Linking地址"; // 替换为应用自身的Deep Linking地址
        } else {
            // 打开其他平台应用
        }
    }
    // App Linking处理函数
    function handleAppLinking() {
        if (!platform) {
            alert('平台检测未完成,请稍后重试');
            return;
        }
        if (platform.isHarmonyOSNEXT) {
            // 打开HarmonyOS应用
            window.location.href = "应用的App Linking地址"; // 替换为应用自身的App Linking地址
        } else {
            // 打开其他平台应用
        }
    }
    // 下载处理函数
    function handleDownload() {
        if (!platform) {
            alert('平台检测未完成,请稍后重试');
            return;
        }
        if (platform.isHarmonyOS) {
            // 下载HarmonyOS应用
            window.location.href = "https://appgallery.huawei.com/app/detail?id=com.huawei.hmos.vmall"; // 替换为应用自身的详情页地址
        } else {
            // 其他平台下载方案
        }
    }
</script>
</body>
</html>

效果图如下图所示。

更多参考

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐