1# 基于FenceExtensionAbility的云侧地理围栏开发指导
2
3## 概述
4[FenceExtensionAbility](../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)是一个地理围栏类型的ExtensionAbility,开发者可以使用该Ability来快速便捷的实现地理围栏拓展能力,协助用户完成快捷交互,提升用户体验。
5
6## 使用场景
7
81. 通过位置服务的[geoLocationManager.on('gnssFenceStatusChange')](../reference/apis-location-kit/js-apis-geoLocationManager.md#geolocationmanagerongnssfencestatuschange)接口进行地理围栏的注册和事件订阅,并在want参数中传入实现的FenceExtensionAbility相关参数信息;
92. 系统会在注册的地理围栏触发后,通过onFenceStatusChange接口上报围栏事件和数据,APP可以在接收到事件后进行相应的业务处理,例如发送一个通知。
10
11## 接口介绍
12接口详情参见[FenceExtensionAbility](../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)。
13| 接口 | 描述 |
14| ---- | ---- |
15| onFenceStatusChange(transition: geoLocationManager.GeofenceTransition, additions: Record<string, string>): void  | 接收系统通知的地理围栏事件,根据围栏事件类型和数据进行相应处理。 |
16| onDestroy(): void | 接收FenceExtensionAbility的销毁事件并处理,会在FenceExtensionAbility销毁前回调。 |
17
18## 开发步骤
19
20### 实现一个地理围栏扩展服务
21
22首先需要实现[FenceExtensionAbility](../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)提供方的能力。
23
24需要在DevEco Studio工程中手动新建一个FenceExtensionAbility,具体步骤如下。
25
261. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为fenceextensionability;
272. 在fenceextensionability目录,右键选择“New > File”,新建一个.ets文件并命名为MyFenceExtensionAbility.ets;
283. 打开MyFenceExtensionAbility.ets,导入FenceExtensionAbility的依赖包,自定义类继承FenceExtensionAbility并实现onFenceStatusChange和onDestroy接口;
29
30示例代码如下:
31
32```ts
33import { notificationManager } from '@kit.NotificationKit';
34import { wantAgent } from '@kit.AbilityKit';
35import { FenceExtensionAbility, geoLocationManager } from '@kit.LocationKit';
36
37export default class MyFenceExtensionAbility extends FenceExtensionAbility {
38  async onFenceStatusChange(transition: geoLocationManager.GeofenceTransition,
39    additions: Record<string, string>): Promise<void> {
40    // 接受围栏状态变化事件,处理业务逻辑
41    console.log(`on geofence transition,id:${transition.geofenceId},event:${transition.transitionEvent},additions:${JSON.stringify(additions)}`);
42
43    // 可以发送围栏业务通知
44    let wantAgentInfo: wantAgent.WantAgentInfo = {
45      wants: [
46        {
47          bundleName: 'com.example.myapplication',
48          abilityName: 'EntryAbility',
49          parameters:
50          {
51            "geofenceId": transition?.geofenceId,
52            "transitionEvent": transition?.transitionEvent,
53          }
54        } as Want
55      ],
56      actionType: wantAgent.OperationType.START_ABILITY,
57      requestCode: 100
58    };
59    let wantAgentMy = await wantAgent.getWantAgent(wantAgentInfo);
60    let notificationRequest: notificationManager.NotificationRequest = {
61      id: 1,
62      content: {
63        notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
64        normal: {
65          title: `围栏通知`,
66          text: `on geofence transition,id:${transition.geofenceId},event:${transition.transitionEvent},additions:${JSON.stringify(additions)}`,
67        }
68      },
69      notificationSlotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
70      wantAgent: wantAgentMy
71    };
72    notificationManager.publish(notificationRequest);
73  }
74
75  onDestroy(): void {
76    // 处理ability销毁事件
77    console.log(`on ability destroy`);
78  }
79}
80export default MyFenceExtensionAbility;
81```
82
834. 在工程Module对应的[module.json5配置文件](../quick-start/module-configuration-file.md)中注册FenceExtensionAbility,type标签需要设置为fence,srcEntry标签表示当前FenceExtensionAbility组件所对应的代码路径。
84
85    ```json
86    {
87      "module": {
88        "extensionAbilities": [
89          {
90            "name": "MyFenceExtensionAbility",
91            "srcEntry": "./ets/fenceExtensionability/MyFenceExtensionAbility.ets",
92            "description": "MyFenceExtensionAbility",
93            "type": "fence",
94            "exported": true
95          },
96        ]
97      }
98    }
99    ```