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 ```