华为浏览器拉起应用类型错误
=============

#### 问题现象

华为浏览器拉起特定类型应用时，弹窗推荐列表中出现非目标类型应用（如非支付类应用和非导航类应用），导致用户误选，影响使用体验。

#### 背景知识

*   [使用Deep Linking实现应用间跳转](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/deep-linking-startup)：采用Deep Linking进行跳转时，系统会根据接口中传入的uri信息，在本地已安装的应用中寻找到符合条件的应用并进行拉起。当匹配到多个应用时，会拉起应用选择框。
*   [uris标签说明](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-uri-config#uris标签说明)：
    *   scheme：协议名称。常见的取值有http、https、file、ftp等，也可以自定义。
    *   host：域名或IP地址。例如域名developer.huawei.com或IP地址127.0.0.1。
    *   port：端口号。例如developer.huawei.com:80后面的80即为端口号。
*   [URL的基本格式](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-uri-config#url的基本格式)：按照配置的字段不同，uris可以拼接为不同的URL表达式。其中，scheme为必选字段，其他字段仅当scheme存在时才有意义。
    *   只配置scheme：scheme://。
    *   只配置scheme和host：scheme://host。
    *   只配置scheme、host和port：scheme://host:port。
*   如果被拉起应用有多个应用的uri配置相同，则主应用跳转时就会匹配到同多个应用，就会拉起应用选择框。为了更好的用户体验，开发者可以通过链接的path字段去区分同一域名下的不同应用。

#### 问题定位

1.  通过如下日志multiple abilities support this deeplink可以确认：华为浏览器网页中跳转三方应用使用的是Deep Linking的方式。
    
    C01120/com.huawei.example.app/BMS  com.huawei.example.app  I     QueryAbilityInfosComplete before return
    A06666/com.huawei.example.app/xxx  com.huawei.example.app  I     queryAbilityInfo success
    A06666/com.huawei.example.app/xxx  com.huawei.example.app  I     multiple abilities support this deeplink
    A06666/com.huawei.example.app/xxx  com.huawei.example.app  I     queryAbilityInfo reason 0
    A06666/com.huawei.example.app/xxx  com.huawei.example.app  I     startApp result consumedClickEvent true
    
2.  排查被拉起应用配置的scheme，是否配置了和自身不匹配的uris。
3.  场景一（弹窗推荐列表中出现非支付类型应用）：查看除了支付类应用以外，其他两个应用在module.json5配置文件里skills标签的uri配置，查到的配置如下：
    
    {
      "module": {
       _ // ..._
        "abilities": \[
          {
           _ // ..._
            "skills": \[
              {
                "entities": \[
                  "entity.system.browsable"
                \],
                "actions": \[
                  "ohos.want.action.viewData"
                \],
                "uris": \[
                  {
                    "scheme": "xxxpay"
                  }
                \]
              }
            \]
          }
        \]
      }
    }
    
    场景二（弹窗推荐列表中出现非导航类型应用）：查看其他两个非导航类型应用在module.json5配置文件里skills标签的uri配置，查到的配置如下：
    
    {
      "module": {
      _  // ..._
        "abilities": \[
          {
           _ // ..._
            "skills": \[
              {
                "entities": \[
                  "entity.system.browsable"
                \],
                "actions": \[
                  "ohos.want.action.viewData"
                \],
                "uris": \[
                  {
                    "scheme": "\*\*\*map"
                  }
                \]
              }
            \]
          }
        \]
      }
    }
    

#### 分析结论

#### \[h2\]场景一

支付类应用误匹配（Deep Linking scheme冲突）

由于非支付类应用错误配置了与支付类应用相同的 scheme（如 xxxpay://），当用户在华为浏览器中访问支付相关链接并点击打开支付类应用时，系统通过Deep Linking匹配所有注册了xxxpay:// 的应用，导致弹窗中出现支付类应用和其他非支付类应用多个选项，造成用户混淆与误操作。

#### \[h2\]场景二

导航类应用误匹配（Deep Linking scheme冲突）

类似地，非导航类应用错误注册了与主流导航应用相同的 scheme（如 \*\*\*map:// 或 \*\*\*map://），当用户在华为浏览器中点击导航链接（如“导航到此位置”）时，系统会匹配所有注册了该 scheme 的应用。因此，弹窗中不仅出现主流导航应用，还混入了其他非导航类应用。

#### 修改建议

#### \[h2\]场景一

对于非支付类应用，删除在module.json5配置文件里skills标签的uri配置的"xxxpay"等scheme配置。

#### \[h2\]场景二

对于非导航类应用，删除在module.json5配置文件里skills标签的uri配置的"\*\*\*map"等scheme配置。