跳转至正文

如何在 Capacitor 应用中处理用户数据

学习在移动应用中处理用户数据的有效策略,重点关注安全性、合规性和数据管理最佳实践。

如何在 Capacitor 应用中处理用户数据 Capgo 博客插图

在 Capacitor 应用中处理用户数据需要安全存储、清晰的保留策略,并遵守 GDPR、 以及 CCPA. 本指南介绍如何最小化数据收集、保护敏感信息并高效管理权限。以下是快速概览:

  • 数据最小化:只收集特定应用功能所必需的数据。
  • 安全存储:使用诸如 @capacitor/secure-storage 插件进行加密。
  • 数据保留:按设定的时间限制自动删除。
  • 用户权利:允许用户访问、删除或导出其数据。
  • 权限管理:根据场景请求权限,并为被拒绝的请求提供替代方案。
  • OTA 更新:使用以下工具确保 OTA 更新安全 Capgo.

如何使用 Ionic Capacitor 安全存储

Capacitor 框架文档网站

减少数据收集

采取结构化的方法进行数据收集的审查、规划和管理,是遵守隐私法规的关键。通过利用 Capacitor 提供的内置工具来最小化数据收集,您可以采取实际措施来优化应用的数据处理实践。

数据收集审查

首先,梳理数据在应用中的流向。使用数据血缘可视化工具来发现可能收集了不必要数据的环节。隐私影响评估 (PIA) 软件可以指导您评估每项数据是否确实必要。以下是需要重点关注的领域:

数据类型 审查重点 待办事项
用户输入 表单字段与校验 移除不必要的字段
API 调用 请求/响应 Payload 过滤多余的数据字段
存储空间 缓存与持久化数据 优化存储使用
数据分析 使用情况跟踪 仅保留关键指标

数据收集目标

明确收集每项数据的原因。每个数据点都应有特定用途。例如:

// Purpose-driven data collection example
const userPreferences = {
  location: "Used for local weather updates",
  notification: "Needed for sending alerts"
};

如果你的应用有天气功能,可能只需要邮编 code,而不是完整地址。这种方法确保你只收集核心应用功能所需的信息[1][5].

数据输入控件

使用验证工具来限制通过表单和 API 调用收集的数据量。结合客户端验证和服务器端验证,以有效执行这些限制。

结合 Capacitor 的安全功能来增强这些控件:

  • 尽可能使用下拉菜单,而不是自由文本字段。
  • 为文本输入字段设置字符限制。

安排季度审计,并使用自动发现工具,以确保你的数据收集实践保持高效,并与应用的预期功能保持一致。

数据安全与存储

一旦你定义了数据收集边界,实施措施以保护用户信息并遵守数据最小化原则至关重要。

设置安全存储

本指南中介绍的 @capacitor/secure-storage 插件使用内置安全功能,如 iOS Keychain 和 Android Keystore,来保护敏感数据 [1]。对于较大的结构化数据集, @capgo/capacitor-data-storage-sqlite 提供加密的 SQLite 存储,而 @capgo/capacitor-persistent-account 可以在重新安装后保留账户状态。 @capgo/capacitor-privacy-screen 在应用切换器和最近应用预览中隐藏敏感 UI。

import { SecureStorage } from '@capacitor/secure-storage';

// Store sensitive data
await SecureStorage.set({
  key: 'authToken',
  value: 'user-specific-token'
});

// Retrieve stored data
const { value } = await SecureStorage.get({ key: 'authToken' });

数据加密方法

添加客户端加密是另一层保护。像 CryptoJS 这样的库可以帮助加密敏感信息:

// Basic encryption/decryption implementation
const encryptData = (data: string, key: string): string => {
  return CryptoJS.AES.encrypt(data, key).toString();
};

定期轮换加密密钥是提高安全性的明智做法。这确保即使一个密钥泄露,其余数据依然安全 [2].

存储方案对比

选择合适的存储方案取决于数据的敏感程度。以下是快速对比:

功能 安全存储 本地存储
安全等级 高(已加密) 基础版
最佳适用场景 令牌、密码 非敏感设置
性能 较慢(由于加密) 访问速度更快

Secure Storage API 是存储认证令牌和个人用户数据等关键信息的可靠选择 [1][4]。其 加密功能 也符合数据保留策略,允许在指定时间范围内受控地访问数据 [2].

sbb-itb-f9944d2

数据存储时限

制定明确的数据保留策略有助于遵循数据最小化原则,确保信息不会保留超过必要时间。

存储时间规则

不同类型的用户数据应根据其用途和敏感级别设定明确的保留期限。以下是管理数据保留的建议框架,适用于 Capacitor 应用:

数据类型 保留期限 处理依据
账户数据 直至账户删除或两年未活动 用于账户相关操作
交易记录 7 年 符合金融法规要求
分析数据 90 天(匿名化),1 年(删除) 支持功能改进
营销偏好 直至选择退出或删除账号 符合同意要求

以下示例展示如何通过代码存储带过期时间的数据:

async function storeDataWithExpiration(key: string, value: any, retentionDays: number) {
  const item = {
    value: value,
    expiration: Date.now() + (retentionDays * 24 * 60 * 60 * 1000)
  };
  await Preferences.set({ key, value: JSON.stringify(item) });
}

数据自动删除

自动清理数据有助于保持合规并减少人工干预。Capacitor 的 background fetch 功能很适合做这件事:

import { BackgroundFetch } from '@capacitor/background-fetch';

BackgroundFetch.registerTask({
  taskId: 'data-cleanup',
  delay: 3600000,
  periodic: true,
  requiresNetworkConnectivity: false
}, async () => {
  await cleanExpiredData();
  return BackgroundFetch.Result.NewData;
});

如果你在使用 SQLite 用于存储,你可以设置触发器以自动删除过期记录:

CREATE TRIGGER remove_expired_data
AFTER INSERT ON user_data
BEGIN
  DELETE FROM user_data 
  WHERE expiration_date < CURRENT_TIMESTAMP;
END;

用户数据删除选项

为用户提供管理数据的工具至关重要。以下是你可以实现的两个关键功能:

  • 删除特定数据:允许用户删除与其账户关联的特定类型数据。
async function deleteSpecificData(userId: string, dataType: string) {
  await Preferences.remove({ key: `${userId}_${dataType}` });

  if (db) {
    await db.run(
      'DELETE FROM user_data WHERE user_id = ? AND data_type = ?',
      [userId, dataType]
    );
  }
}
  • 导出用户数据:让用户以结构化格式下载其存储的数据。
async function exportUserData(userId: string) {
  // Gathers all user data for export
  const userData = await collectUserData(userId);
  return JSON.stringify(userData);
}

法国数据保护机构 CNIL 强调保留期限必须与应用程序的核心功能保持一致 [3]。这一原则对于 Capacitor 应用开发者尤为重要,应指导您的数据保留策略。

应用权限控制

谨慎处理应用权限,是保护用户数据并确保应用按预期运行的关键。妥善管理权限,可以将访问范围限制在应用真正需要的设备功能上。Capacitor 的 Permissions API 为 iOS 和 Android 上的权限管理提供了统一方案。

权限请求步骤

请确保请求的权限与应用的数据收集目标一致。以下是在 Capacitor 应用中处理权限请求的示例实现:

import { Permissions } from '@capacitor/core';

const permissionHandler = async (permissionType: string) => {
  const status = await Permissions.query({ name: permissionType });

  if (status.state === 'granted') {
    return true;
  }

  const shouldProceed = await showExplanationDialog(
    `We need ${permissionType} access to provide core functionality`
  );

  if (shouldProceed) {
    const result = await Permissions.request({ name: permissionType });
    return result.state === 'granted';
  }

  return false;
};

处理被拒绝的权限

如果用户拒绝了权限请求,请提供清晰的替代方案和指引。示例如下:

const handleDeniedPermission = async (permissionType: string) => {
  const status = await Permissions.query({ name: permissionType });

  if (status.state === 'denied') {
    const alternatives = {
      camera: 'manual photo upload',
      location: 'manual address entry',
      notifications: 'in-app message center'
    };

    showAlternativeFeature(alternatives[permissionType]);

    if (status.canOpenSettings) {
      offerSettingsRedirect();
    }
  }
};

权限请求的时机

请求权限的时机很关键。策略性地选择时机能显著提高用户接受率。以下是几种时机策略的简要说明:

时机策略 最佳使用场景
即时请求 在需要时针对特定功能请求
上下文 适用于非关键功能
首次启动 适用于前置核心功能
延迟 用于用户旅程后期的可选功能

例如,仅在用户执行拍照等操作时,才请求相机访问权限:

const captureImage = async () => {
  const userStartedCapture = true;

  if (userStartedCapture) {
    const granted = await permissionHandler('camera');

    if (granted) {
      await startCamera();
    } else {
      showUploadOption();
    }
  }
};

与预先请求相比,此类情境化请求可将接受率提高 50% [2]。为确保流畅体验,请维护一个权限状态跟踪器,以跨会话保存用户决策。

处理完权限后,您可以将重点转向更新安全,尤其是空中下载(OTA)部署。

OTA 更新安全

为确保在 应用更新期间的数据完整性,使用安全的 OTA(空中下载)更新流程至关重要。这些更新有助于防止对应用 code 的未授权更改,从而避免绕过数据收集限制。

更新包签名

对更新包进行签名是防止未授权 code 更改的关键步骤。以下是保护 OTA 更新的一些关键措施:

安全措施 实现方式
内容保护 AES 加密
传输安全 带证书绑定的 HTTPS
更新完整性 哈希校验
版本安全性 已签名的版本号
故障恢复 即时回滚能力

Capgo 更新系统

Capgo Live Update Dashboard 界面

Capgo 通过提供自动化安全功能,简化了 Capacitor 应用的安全 OTA 更新。以下是在应用中使用 Capgo 更新系统的示例:

import { CapacitorUpdater } from '@capgo/capacitor-updater';

const secureUpdate = async () => {
  try {
    const update = await CapacitorUpdater.download({
      version: 'latest',
      validateSignature: true
    });
    if (update.status === 'success') {
      await CapacitorUpdater.set(update);
    }
  } catch (error) {
    await CapacitorUpdater.rollback();
  }
};

这种方法可确保更新经过验证且安全,并在发生故障时提供回滚选项。

应用商店政策合规

OTA 更新必须遵守应用商店指南[1][6][7]。每个平台都有特定要求,以确保更新符合其数据保留和安全政策:

平台 合规性要求
iOS 仅限 JavaScript 或资源更新
Android 必须获得用户同意
两者都是 安全检查与完善的文档记录

以下是符合应用商店合规要求的更新实现示例:

const compliantUpdate = async () => {
  const userConsent = await requestUpdateConsent();
  if (userConsent) {
    await CapacitorUpdater.setUpdateConfig({
      type: 'assets-only',
      scope: 'ui-updates' // Updates limited to UI components
    });
  }
};

const preventDowngrade = async (newVersion, currentVersion) => {
  const versions = await CapacitorUpdater.getVersions();
  if (versions.current.buildNumber > newVersion.buildNumber) {
    throw new Error('Downgrade attempt detected');
  }
};

总结

核心要点

有效处理用户数据需要结合以下核心策略:

  • 仅收集必要的数据。
  • 使用平台原生加密来保护数据。
  • 自动化数据保留期限。
  • 设置详细的权限控制。

这些步骤协同工作,确保从数据收集到自动删除的整个流程都符合合规要求。

实现步骤

要落实这些策略:

  • 使用第 2 节介绍的方法审计数据流。
  • 按照第 3 节的说明加强存储安全。
  • 基于第 4 节设置自动化删除流程。
  • 建立并执行第 5 节详述的权限控制。

借助 Capgo

对于管理 OTA 更新的团队,Capgo 提供了与这些工作相契合的内置安全工具:

  • 端到端加密 用于保护更新包。
  • 实时监控 用于快速应对潜在的安全威胁。

继续阅读:如何在 Capacitor 应用中处理用户数据

如果你正在使用 如何在 Capacitor 应用中处理用户数据 来规划安全与合规,请结合 加密 了解 Encryption 的实现细节, 合规性 了解合规部分的实现细节, Capgo 安全扫描器 了解 Capgo Security Scanner 的产品工作流, Capgo 安全 用于 Capgo 安全的产品工作流,以及 Capgo 信任中心 用于 Capgo 信任中心的产品工作流。

为 Capacitor 应用提供 Live Updates

当 Web 层出现线上 Bug 时,通过 Capgo 发布修复,而不用等 App Store 审核好几天。用户会在后台收到更新,原生变更则仍走正常审核流程。

博客最新动态

Capgo 为你提供打造真正专业的移动应用所需的最有价值的洞察。