Skip to main content

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

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

马丁·多纳迪厄

马丁·多纳迪厄

内容营销人员

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

处理用户数据在 Capacitor 应用程序需要安全存储、清晰的保留政策和遵守数据保护法规,如 GDPRCCPA. This guide explains how to minimize data collection, secure sensitive information, and manage permissions effectively. Here’s a quick overview:

  • 数据最小化: 只收集必要的数据来支持特定应用功能。
  • 安全存储: 使用工具,如 @capacitor/secure-storage 插件
  • 数据保留: 根据定义的时间限制自动删除。
  • 用户权利: 允许用户访问、删除或导出他们的数据。
  • 权限管理: 在特定上下文中请求权限,并为拒绝请求提供替代方案。
  • OTA Updates使用 Capgo.

如何使用Ionic Capacitor 安全存储

Capacitor 框架文档网站

减少数据收集

遵守隐私法规的关键是采取结构化的方法来审查、规划和管理数据收集。通过利用Capacitor内置的工具来减少数据收集,您可以采取实际步骤来改善您的应用程序的数据实践。

数据收集审查

首先,绘制出数据在应用程序中的流动图。使用数据线性可视化器来找出可能不必要收集的数据区域。隐私影响评估(PIA)软件可以指导您评估每个数据块是否真正需要。以下是需要关注的区域:

数据类型 审查焦点 行动项
用户输入 表单字段和验证 移除不需要的字段
API 调用 请求/响应负载 过滤额外的数据字段
存储 缓存和持久数据 优化存储使用
{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["Analytics","Usage tracking","Keep only essential metrics","Data Collection Goals","Be clear about why you’re collecting each piece of data. Every data point should serve a specific purpose. For example:","If your app has a weather feature, it might only require a zip __CAPGO_KEEP_0__ rather than a full address. This approach ensures you’re gathering only the information necessary for core app functions","Data Input Controls","Use validation tools to limit the amount of data collected through forms and __CAPGO_KEEP_0__ calls. Combine client-side validation with server-side verification to enforce these limits effectively.","Incorporate __CAPGO_KEEP_0__’s security features to enhance these controls:","Use dropdown menus instead of free-text fields where possible.","Set character limits for text input fields.","Schedule quarterly audits with automated discovery tools to ensure your data collection practices remain efficient and aligned with your app’s intended functionality."]} "数据分析","使用跟踪","只保留关键指标","数据收集目标","要清楚地说明为什么要收集每个数据点。每个数据点都应该有一个特定的目的。例如:","如果您的应用程序具有天气功能,则可能只需要一个邮政编码__CAPGO_KEEP_0__而不是完整的地址。这一方法确保您只收集必要的信息以支持核心应用程序功能","数据输入控制","使用验证工具来限制通过表单和__CAPGO_KEEP_0__调用收集的数据量。将客户端验证与服务器端验证结合起来,以有效地强制这些限制","在这些控制中增强__CAPGO_KEEP_0__的安全功能:","在可能的情况下使用下拉菜单代替自由文本字段","为文本输入字段设置字符限制","使用自动发现工具定期进行审计,以确保您的数据收集实践与应用程序的预期功能保持一致。"]} Simplified Chinese

]}

Simplified Chinese

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

If your app has a weather feature, it might only require a zip code rather than a full address. This approach ensures you’re gathering only the information necessary for core app functions[1][5].

Simplified Chinese

Use validation tools to limit the amount of data collected through forms and API calls. Combine client-side validation with server-side verification to enforce these limits effectively.

Incorporate Capacitor’s security features to enhance these controls:

  • ]}
  • Simplified Chinese

]}

数据安全和存储

一旦您定义了数据收集边界,保护用户信息并遵守数据最小化原则就变得至关重要了。

设置安全存储

@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].

比较存储选项

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

功能 安全存储 本地存储
安全级别 高(加密) 基础
适合 令牌、密码 非敏感设置
性能 由于加密而较慢 更快的访问

API Secure Storage 是一种适合存储关键信息如身份令牌和个人用户数据的坚实选择 [1][4]. 其 加密功能 也符合保留政策,允许在指定时间范围内控制对数据的访问 [2].

sbb-itb-f9944d2

__CAPGO_KEEP_0__

数据存储时间限制

设置明确的数据保留政策有助于与数据最小化原则保持一致,确保信息不会被保留得比必要的时间长。

存储时间规则 Capacitor apps:

应用程序类型 保留期限 理由
账户数据 直到账户删除或 2 年的不活跃 用于账户相关操作
交易记录 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的后台抓取功能是此目的的有用工具:

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应用开发者,并应指导您的数据保留策略。

App 权限控制

Handling app permissions carefully is key to safeguarding user data while ensuring your app functions as intended. By managing permissions properly, you can limit access to only the device features your app truly needs. Capacitor’s Permissions API offers a unified approach to managing permissions on both iOS and 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 更新安全

为了确保数据完整性 app updates, 使用安全的 OTA (Over-The-Air) 更新过程至关重要。这些更新有助于防止未经授权的 app code 变更,否则可能绕过数据收集的限制。

Update Package Signing

签名更新包是保护免受未经授权 code 变更的关键步骤。以下是安全 OTA 更新的关键措施:

Security Measure 如何实现
内容保护 AES 加密
交付安全 HTTPS 证书固定
更新完整性 哈希验证
版本安全 签名版本号
失败恢复 即时回滚能力

Capgo 更新系统

Capgo 实时更新控制台界面

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 内置了与这些努力一致的安全工具:

  • 端到端加密 以安全更新包
  • 实时监控 快速解决潜在的安全威胁

从 How to Handle User Data in Capacitor Apps 中继续

如果您正在使用 How to Handle User Data in Capacitor Apps 来规划安全性和合规性,连接它 加密 加密 合规性 关于 Compliance 的实现细节 Capgo 安全扫描器 关于 Capgo 安全扫描器 的产品工作流程 Capgo 安全 关于 Capgo 安全 的产品工作流程 Capgo 信任中心 关于 Capgo 信任中心 的产品工作流程

Capacitor 应用实时更新

当有 web 层 bug 时,通过 Capgo 直接将修复推送给用户,而不是等待几天的 app store 审批。用户在后台接收更新,而原生变化仍然在正常的审批路径中。

立即开始

最新博客文章

Capgo 为您提供创建真正专业的移动应用所需的最佳见解。