鸿蒙学习实战之路-Share Kit系列(13/17)-配置目标应用名单(企业应用)

鸿蒙学习实战之路-Share Kit系列(13/17)-配置目标应用名单(企业应用)

最近好多朋友问我:"西兰花啊,我想让我的应用只分享到指定的企业应用,但不知道代码怎么写?" 害,这问题可问对人了!

今天这篇,我就手把手带你实现配置目标应用名单功能,从零到一,全程不超过 5 分钟(不含调试时间)~


目标应用名单是啥?

目标应用名单就是指定哪些应用可以接收分享。比如:

  • 企业内部应用,只允许分享到企业内部的其他应用
  • 特定场景的应用,只允许分享到指定的应用

这就像前端的白名单功能,只不过 Share Kit 是系统级别的服务,体验更统一。


企业应用专属功能

配置目标应用名单是企业应用专属功能,需要满足以下条件:

  1. 应用必须是企业应用:需要在华为开发者联盟注册为企业应用
  2. 需要申请权限 :需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限
  3. 需要配置目标应用名单 :在 module.json5 中配置目标应用名单

🥦 西兰花警告

我有个朋友忘记申请权限,结果目标应用名单配置不生效,debug 了两小时才发现是权限问题!血泪教训啊朋友们!


完整实现步骤

实现配置目标应用名单,就两步:

  1. 申请权限 :在 module.json5 中声明权限
  2. 配置目标应用名单 :在 module.json5 中配置目标应用名单

步骤 1:申请权限

module.json5 中声明 ohos.permission.DISTRIBUTED_DATASYNC 权限。

json 复制代码
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
      }
    ]
  }
}

步骤 2:配置目标应用名单

module.json5 中配置目标应用名单。

json 复制代码
{
  "module": {
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "startWindowIcon": "$media:launcher",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "linkFeature": "FileOpen",
                "type": "org.openxmlformats.wordprocessingml.document",
                "maxFileSupported": 1
              }
            ],
            "domainVerify": true
          }
        ]
      }
    ]
  }
}

🥦 西兰花小贴士

目标应用名单需要在华为开发者联盟后台配置,配置后才能生效。配置时需要填写目标应用的包名和签名指纹。


在实际项目中怎么用?

上面的代码是基础实现,但在实际项目中,你可能会这样用:

示例:企业内部应用分享

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct EnterpriseSharePage {
  // 分享文本
  shareText: string = '这是一段企业内部分享文本';

  // 分享文本(企业内部应用)
  onShareTextToEnterprise() {
    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '企业内部分享',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('企业内部应用分享示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(企业内部应用)')
        .onClick(() => {
          this.onShareTextToEnterprise();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

示例:特定场景应用分享

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct SpecificSceneSharePage {
  // 分享文本
  shareText: string = '这是一段特定场景分享文本';

  // 分享文本(特定场景应用)
  onShareTextToSpecificScene() {
    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '特定场景分享',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('特定场景应用分享示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(特定场景应用)')
        .onClick(() => {
          this.onShareTextToSpecificScene();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

常见问题

Q1:目标应用名单不生效怎么办?

检查以下几点:

  1. 是否申请了权限

    • 确认是否在 module.json5 中声明了 ohos.permission.DISTRIBUTED_DATASYNC 权限
    • 确认是否在华为开发者联盟后台配置了目标应用名单
  2. 是否正确配置了目标应用名单

    • 确认是否在华为开发者联盟后台正确配置了目标应用的包名和签名指纹
    • 确认目标应用是否已安装

Q2:如何添加多个目标应用?

在华为开发者联盟后台配置目标应用名单时,可以添加多个目标应用,每个目标应用需要填写包名和签名指纹。

Q3:如何删除目标应用?

在华为开发者联盟后台配置目标应用名单时,可以删除目标应用,删除后该应用将不再接收分享。


下一步学什么?

看完这篇,你应该已经能配置目标应用名单了。接下来可以深入学习:

  1. 手机间碰一碰分享:碰一碰分享的实现
  2. 手机与PC/2in1设备间分享:跨设备分享的实现
  3. 隔空传送与可信任设备:隔空传送的实现
  4. 常见问题:分享失败、数据类型不支持等问题的解决方案

推荐资料

📚 官方文档


我是盐焗西兰花,

不教理论,只给你能跑的代码和避坑指南。

下期见!🥦

相关推荐
stm32 菜鸟17 分钟前
nucleo-f411re学习记录-9,双轴XY摇杆传感器
学习
南子北游18 分钟前
Python学习(基础语法1)
开发语言·python·学习
Atri厨2 小时前
X86存储器的段描述符学习随笔
学习
三声三视2 小时前
ArkTS Navigation 路由实战:从 Router 迁移到 NavPathStack,打造企业级路由体系
华为·harmonyos·鸿蒙
星幻元宇VR2 小时前
VR航空航天科普设备助力航天知识普及
人工智能·科技·学习·安全·vr·虚拟现实
d111111111d2 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
寒秋花开曾相惜2 小时前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.1 逻辑门&4.2.2 组合电路和HCL布尔表达式)
linux·网络·数据结构·笔记·学习·fpga开发
叶子野格3 小时前
《C语言学习:指针》12
c语言·开发语言·c++·学习·visual studio
光影少年3 小时前
前端线上屏幕出现卡顿如何排查?
开发语言·前端·javascript·学习·前端框架·node.js
Swift社区4 小时前
System + AI:下一代 鸿蒙App 架构
人工智能·架构·harmonyos