本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前 API12)在開發多語言電商平臺方面的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。
在當今數字化時代,使用者隱私和資料安全備受關注,鴻蒙 Next 系統憑藉其創新的安全訪問機制,為使用者提供了更安全、便捷的操作體驗。今天,我們將深入探討鴻蒙 Next 的安全訪問機制,重點解析系統 Picker 和安全控制元件如何實現精準化許可權管控。
一、鴻蒙 Next 安全訪問機制概述
鴻蒙 Next 的安全訪問機制旨在改變傳統應用獲取使用者資料的方式,從粗放式管理轉變為精細化控制,確保使用者隱私得到充分保護。系統透過引入系統 Picker 和安全控制元件等機制,讓使用者能夠更加精準地掌控應用對敏感資料的訪問許可權,實現按需授權,使資料與應用之間的互動處於受控狀態。這就好比為使用者資料設定了一道道智慧關卡,只有在使用者明確授權的情況下,應用才能獲取相應的資料資源。
二、系統 Picker:便捷的資源選擇與許可權隔離
(一)系統 Picker 的概念與功能
系統 Picker 是鴻蒙 Next 提供的一種系統級元件,由獨立程序實現,其功能類似於一個智慧的資源選擇器。它允許應用在不直接獲取相關許可權的情況下,透過使用者互動的方式選擇特定的資源,如檔案、照片、聯絡人等。當應用需要訪問這些資源時,只需拉起系統 Picker,由使用者在 Picker 介面上進行選擇操作,應用即可獲取使用者選擇的資源結果,而無需申請讀取整個資源庫的許可權。這就像是在一個大型圖書館中,應用不需要獲取所有書籍的借閱許可權,只需透過圖書管理員(系統 Picker)幫助使用者挑選出所需的書籍(資源)即可。
(二)使用系統 Picker 選擇不同資源的方法
- 選擇使用者檔案(FilePicker)
當應用需要獲取使用者檔案時,可以使用 FilePicker。例如,一款文件編輯應用需要開啟使用者指定的文件進行編輯,它可以透過以下方式使用 FilePicker:
// 假設已經匯入了相關的 Picker 模組
import { filePicker } from '@kit.SomeFilePickerKit';
async function openUserFile() {
try {
const fileUri = await filePicker.showOpenDialog({
// 可以設定檔案型別過濾器等引數,這裡僅為示例
filters: [
{
name: 'Documents',
extensions: ['txt', 'pdf', 'docx']
}
]
});
if (fileUri) {
// 使用者選擇了檔案,應用可以根據 fileUri 進行後續操作,如讀取檔案內容等
console.log('使用者選擇的檔案路徑:', fileUri);
}
} catch (error) {
console.error('開啟檔案選擇器失敗:', error);
}
}
在上述程式碼中,透過呼叫filePicker.showOpenDialog()
方法,彈出檔案選擇器對話方塊,使用者可以在對話方塊中選擇符合指定過濾器的檔案,應用獲取到使用者選擇的檔案路徑(fileUri
)後,即可進行後續的檔案操作。
- 選擇照片(PhotoViewPicker)
對於需要獲取使用者照片的應用,如圖片編輯應用或社交分享應用,可以使用 PhotoViewPicker。以下是一個簡單的示例:
import { photoViewPicker } from '@kit.SomePhotoPickerKit';
async function selectUserPhoto() {
try {
const photoUri = await photoViewPicker.showPhotoPicker();
if (photoUri) {
// 使用者選擇了照片,應用可以根據 photoUri 進行顯示、編輯或分享等操作
console.log('使用者選擇的照片路徑:', photoUri);
}
} catch (error) {
console.error('開啟照片選擇器失敗:', error);
}
}
透過呼叫photoViewPicker.showPhotoPicker()
方法,應用可以拉起照片選擇器,使用者選擇照片後,應用獲取照片的路徑(photoUri
)用於後續處理。
- 選擇聯絡人(聯絡人 Picker)
當應用需要獲取聯絡人資訊時,例如通訊類應用新增聯絡人或傳送訊息時選擇收件人,可以使用聯絡人 Picker。示例程式碼如下:
import { contactPicker } from '@kit.SomeContactPickerKit';
async function selectContact() {
try {
const contact = await contactPicker.showContactPicker();
if (contact) {
// 使用者選擇了聯絡人,應用可以獲取聯絡人的相關資訊,如姓名、電話號碼等
console.log('使用者選擇的聯絡人:', contact);
}
} catch (error) {
console.error('開啟聯絡人選擇器失敗:', error);
}
}
呼叫contactPicker.showContactPicker()
方法後,使用者可以在聯絡人選擇器中選擇所需聯絡人,應用獲取聯絡人物件(contact
)並進行相應操作。
三、安全控制元件:臨時授權的得力助手
(一)安全控制元件的概念與種類
安全控制元件是鴻蒙 Next 提供的一組特殊的 ArkUI 元件,它們以一種直觀、便捷的方式融入應用介面,實現使用者點選即許可的授權模式。目前,鴻蒙 Next 提供了三種主要的安全控制元件:貼上控制元件(PasteButton)、儲存控制元件(SaveButton)和位置控制元件(LocationButton)。這些安全控制元件為使用者提供了更精細的許可權控制,使應用在獲取特定許可權時更加靈活和安全。
(二)三種安全控制元件的功能與使用場景
- 貼上控制元件(PasteButton)
- 功能:貼上控制元件用於簡化應用讀取剪貼簿資料的操作。當應用整合貼上控制元件後,使用者點選該控制元件,應用可以在無彈窗提示的情況下讀取剪貼簿資料,提供了更加流暢的使用者體驗。
- 使用場景:適用於各種需要讀取剪貼簿資料的場景,如在輸入框中快速貼上複製的文字內容。例如,在登入介面,使用者可以方便地貼上賬號或密碼,而無需繁瑣的長按輸入框等操作。
- 儲存控制元件(SaveButton)
- 功能:儲存控制元件允許使用者透過點選按鈕臨時獲取儲存許可權,將檔案儲存到媒體庫。與傳統的儲存方式不同,它無需使用者手動選擇儲存路徑,直接將檔案儲存到指定媒體庫路徑,操作更加快捷。
- 使用場景:常用於需要儲存檔案到媒體庫的場景,如儲存圖片、影片等。例如,在拍照應用中,使用者拍攝照片後,點選儲存控制元件即可將照片快速儲存到相簿中。
- 位置控制元件(LocationButton)
- 功能:位置控制元件使使用者能夠明確知曉應用獲取位置資訊的意圖。當使用者點選該控制元件時,無論應用是否已申請精準定位許可權,都能在本次前臺期間獲得精準定位授權,呼叫位置服務獲取位置資訊。
- 使用場景:適用於非強位置關聯應用在部分前臺場景需要使用位置資訊的情況,如定位城市、打卡、分享位置等。例如,在旅遊類應用中,使用者可以點選位置控制元件分享當前所在位置給朋友。
(三)安全控制元件使用場景表格展示
安全控制元件 | 功能 | 使用場景 |
---|---|---|
貼上控制元件(PasteButton) | 無彈窗讀取剪貼簿資料 | 快速貼上文字,如登入介面貼上賬號密碼等 |
儲存控制元件(SaveButton) | 臨時獲取儲存許可權儲存檔案到媒體庫 | 儲存圖片、影片,如拍照應用儲存照片等 |
位置控制元件(LocationButton) | 點選獲取臨時精準定位授權 | 定位城市、打卡、分享位置,如旅遊應用分享位置等 |
(四)示例程式碼:使用儲存控制元件儲存照片到媒體庫
以下是一個使用儲存控制元件儲存照片到媒體庫的示例程式碼:
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
// 儲存照片到媒體庫的函式
async function savePhotoToGallery(context: common.UIAbilityContext) {
let helper = photoAccessHelper.getPhotoAccessHelper(context);
try {
// 建立圖片檔案,這裡使用預設的圖片型別和格式,實際應用中可根據需求調整
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
// 開啟檔案,準備寫入內容
let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 假設這裡有一個圖片資源,實際應用中應替換為真實的圖片資源
context.resourceManager.getMediaContent($r('app.media.startIcon').id, 0)
.then(async value => {
let media = value.buffer;
// 將圖片資料寫入媒體庫檔案
await fileIo.write(file.fd, media);
await fileIo.close(file.fd);
promptAction.showToast({ message: '已儲存至相簿!' });
});
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to save photo. Code is ${err.code}, message is ${err.message}`);
}
}
@Entry
@Component
struct Index {
build() {
Row() {
Column({ space: 10 }) {
// 這裡假設已經有一個圖片元件,用於顯示要儲存的圖片,實際應用中應替換為真實的圖片元件
Image($r('app.media.startIcon'))
.height(400)
.width('100%')
SaveButton()
.padding({ top: 12, bottom: 12, left: 24, right: 24 })
.onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) => {
if (result === SaveButtonOnClickResult.SUCCESS) {
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
// 點選儲存控制元件時,呼叫儲存照片到媒體庫的函式
await savePhotoToGallery(context);
} else {
promptAction.showToast({ message: '設定許可權失敗!' });
}
})
}
.width('100%')
}
.height('100%')
.backgroundColor(0xF1F3F5)
}
}
在上述程式碼中,首先透過photoAccessHelper
建立了一個圖片檔案的資源路徑(uri
),然後使用fileIo
開啟檔案並準備寫入資料。接著獲取了一個圖片資源(這裡假設為$r('app.media.startIcon')
,實際應用中應替換為真實圖片),並將其寫入到媒體庫檔案中。最後,在SaveButton
的onClick
事件處理函式中,當使用者點選儲存控制元件且授權成功時,呼叫savePhotoToGallery()
函式將照片儲存到媒體庫,並根據儲存結果顯示相應的提示資訊。
總之,鴻蒙 Next 的安全訪問機制透過系統 Picker 和安全控制元件為應用提供了更加安全、便捷的資源訪問方式。我們可以根據應用的實際需求,合理運用這些機制,實現精準化許可權管控,提升使用者體驗的同時保護使用者隱私。希望本文能夠幫助各位同仁更好地理解和運用鴻蒙 Next 的安全訪問機制,為使用者打造更加安全可靠的應用。