1# 接入安全隐私框架 2 3安全隐私接入框架允许两种接入方式:ExtensionAbility和UIAbility方式接入。 4 5应用接入后,将按照bundleName的字母顺序在隐私中心展示。 6 7业务接入方需在本应用模块下的module.json5配置文件中配置相应的action和metadata,供安全隐私中心菜单接入框架扫描、解析。 8 9开发者可参考以下步骤,完成对安全隐私框架的接入。 10 11## 新增元数据资源配置文件 12 13业务接入方需要新增一个元数据资源配置json文件,用于承载接入安全隐私框架的方式、跳转的Ability等内容,具体字段说明如表所示: 14 15| key值(属性名称) | value值 | 是否必填 | 说明 | 16| ----------------- | ------------------------------------------------------------ | -------- | ------------------------------------------------- | 17| displayedMode | - list:代表列表方式接入。<br />- card:代表卡片方式接入,当前版本暂不支持。 | 是 | 目前仅支持列表展示,输入card/list均按照列表展示。 | 18| mainTitleResource | 入口菜单显示的主标题字串的资源名 | 是 | - | 19| dstAbilityMode | - 0: 表示被拉起的ability为UIAbility。<br />- 1: 表示被拉起的ability为UIExtensionAbility。 | 是 | - | 20| dstAbilityName | 跳转的目标Ability。<br />- 当dstAbilityMode为0时,该ability为UIAbility。<br />- 当dstAbilityMode为1时,该ability需继承自UIExtensionAbility,接入方在此ability中加载自身页面。 | 是 | - | 21| dstBundleName | 跳转的目的bundle名称。 | 是 | - | 22| displayUserConfig | - ONLY_PRIMARY_USER:仅主用户展示。<br />- ONLY_SUB_USER:仅子用户展示。 | 否 | 如果不填,默认为向所有用户展示。 | 23 24本文档中以新建一个security_privacy.json文件为例,来指导业务接入方完成配置,实际的json文件的名称可由开发者自定义。 25 26此文件需放置在对应模块的`"resource/rawfile/xxx.json"`中。 27 28```json 29{ 30 "displayedMode": "list", 31 "mainTitleResource": "$string:main_title", 32 "dstAbilityMode": 0, 33 "dstAbilityName": "EntryAbility", 34 "dstBundleName": "com.example.test" 35} 36``` 37 38## 修改应用配置文件 39 40各模块的module.json5配置文件中,承载了该模块UIAbility组件和ExtensionAbility组件的描述信息、应用运行过程中所需的权限等信息。接入安全隐私框架需将一下相关字段配置到module.json5中。 41 42### 配置action 43 44在module.json5文件的“ skill ”标签中,配置隐私中心的action值`"action.access.privacy.center"`。 45 46```typescript 47"skills": [ 48 { 49 "actions": [ 50 "action.access.privacy.center" 51 ] 52 } 53] 54``` 55 56### 配置metadata 57 58在module.json5文件的“ metadata ”标签中,新增“ name ”为“ metadata.access.privacy.center ”、“ value ”为元数据json文件名称的条目。 59 60元数据json文件即为上一步新增的`"resource/rawfile/xxx.json"`。 61 62> **说明:** 63> 64> 开发者需要根据dstAbilityMode来选择action、metadata的配置。 65> 66> - 如果被拉起的页面是UIAbility,则需配置到“ abilities ”中, 67> 68> - 如果是UIExtensionAbility,则需配置到“ extensionAbilities ” 中。 69> 70> **在配置extensionAbilities时,其中type类型需配置成"sys/commonUI"。** 71 72当前示例仅提供接入安全隐私框架涉及的标签用法,module.json5中的其余标签字段,需要开发者根据实际情况填写。 73 74```typescript 75// UIAbility方式接入 76"abilities": [ 77 { 78 "skills": [ 79 { 80 "actions": [ 81 "action.access.privacy.center" 82 ] 83 } 84 ], 85 "metadata": [ 86 { 87 "name": 'metadata.access.privacy.center', 88 "value": 'security_privacy.json' 89 } 90 ] 91 } 92] 93``` 94 95```typescript 96// ExtensionAbility方式接入 97"extensionAbilities": [ 98 { 99 "type": "sys/commonUI", 100 "skills": [ 101 { 102 "actions": [ 103 "action.access.privacy.center" 104 ] 105 } 106 ], 107 "metadata": [ 108 { 109 "name": 'metadata.access.privacy.center', 110 "value": 'security_privacy.json' 111 } 112 ] 113 } 114 ] 115``` 116 117### 配置权限 118 119业务接入方需申请权限[ohos.permission.ACCESS_SECURITY_PRIVACY_CENTER](../AccessToken/permissions-for-system-apps.md#ohospermissionaccess_security_privacy_center),来确保应用可以接入框架菜单。 120 121申请方式请参考[访问控制开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/determine-application-mode.md)。 122 123## 配置Ability页面(以UIAbility方式接入) 124 125如果为UIAbility方式接入,则不需要单独做相关的配置,直接使用默认生成的方式。 126 127示例: 128 129```typescript 130import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 131import hilog from '@ohos.hilog'; 132import UIAbility from '@ohos.app.ability.UIAbility'; 133import Want from '@ohos.app.ability.Want'; 134import window from '@ohos.window'; 135 136export default class EntryAbility extends UIAbility { 137 onWindowStageCreate(windowStage: window.WindowStage): void { 138 // Main window is created, set main page for this ability 139 hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); 140 windowStage.loadContent('pages/Index', (err, data) => { 141 if (err.code) { 142 hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); 143 return; 144 } 145 hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); 146 }); 147 } 148} 149``` 150 151## 配置Ability页面(以ExtensionAbility方式接入) 152 153如果为ExtensionAbility方式接入,Ability页面需继承自ExtensionAbility,并且需修改相应配置,使用session的方式来拉起接入应用的主页面。 154 155示例: 156 157```typescript 158import hilog from '@ohos.hilog'; 159import Want from '@ohos.app.ability.Want'; 160import ExtensionAbility from '@ohos.app.ability.ExtensionAbility'; 161import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; 162 163export default class EntryAbility extends ExtensionAbility { 164 onSessionCreate(want: Want, session: UIExtensionContentSession) { 165 hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onSessionCreate'); 166 let param: Record<string, Object> = { 167 'session': session 168 } 169 let storage: LocalStorage = new LocalStorage(param) 170 session.loadContent('pages/Index', storage) 171 } 172} 173``` 174 175## 接入页面退出(以UIAbility方式接入) 176 177如果是UIAbility的方式接入,接入方需主动退出时,例如页面有返回按钮,想要销毁应用的页面时,可以直接调用router.back()或者terminateSelf()来销毁当前页面。 178 179示例: 180 181```typescript 182import router from '@ohos.router'; 183 184@Entry() 185@Component 186struct Index { 187 188 build() { 189 Row() { 190 Column() { 191 Button("click to back") 192 .onClick(() => { 193 router.back() 194 }) 195 } 196 .width('100%') 197 } 198 .height('100%') 199 } 200} 201``` 202 203## 接入页面退出(以ExtensionAbility方式接入) 204 205如果是UIExtensionAbility的方式接入,接入方需主动退出时,例如页面有返回按钮,想要销毁应用的页面时,可以通过UIExtensionContentSession的sendData向使用方发送数据 `{“action”: "exit"}`,使用方接收到消息之后将退出拉起的页面。 206 207示例: 208 209```typescript 210import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession' 211 212let storage = LocalStorage.getShared() 213 214@Entry(storage) 215@Component 216struct Index { 217 private session: UIExtensionContentSession = storage.get<UIExtensionContentSession>('session') as UIExtensionContentSession 218 build() { 219 Row() { 220 Column() { 221 Button("click to back") 222 .onClick(() => { 223 this.session.sendData({ 'action': "exit" }) 224 }) 225 } 226 .width('100%') 227 } 228 .height('100%') 229 } 230} 231``` 232