You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API或PHP函数删除Back4App中Installation类过期设备令牌

解决Back4App中Installation类过期设备令牌清理问题

针对你遇到的推送无法触达全量用户、Installation类存在大量过期令牌的问题,以下是几个可行的解决方案:

方法1:通过Cloud Code批量清理过期记录

Back4App的Cloud Code支持使用主密钥操作Installation类,这是最安全高效的批量清理方式。

编写并部署云函数

在Back4App控制台进入「Cloud Code」>「Web Hosting & Cloud Functions」,创建一个云函数:

Parse.Cloud.define("cleanExpiredInstallations", async (request) => {
  // 设置过期阈值,比如清理90天未更新的Installation
  const expiryDate = new Date();
  expiryDate.setDate(expiryDate.getDate() - 90);

  const query = new Parse.Query(Parse.Installation);
  query.lessThan("updatedAt", expiryDate);
  
  // 批量删除,单次最多处理1000条(Parse API限制)
  let deletedCount = 0;
  let hasMoreRecords = true;

  while (hasMoreRecords) {
    const installations = await query.limit(1000).find({ useMasterKey: true });
    if (installations.length === 0) {
      hasMoreRecords = false;
      break;
    }
    await Parse.Object.destroyAll(installations, { useMasterKey: true });
    deletedCount += installations.length;
    console.log(`已删除 ${deletedCount} 条过期记录`);
  }
  return `清理完成,共删除 ${deletedCount} 条过期Installation记录`;
});

执行云函数

可以通过Back4App的「API Console」直接调用该函数,也可在可信后端环境(不要在客户端暴露主密钥)通过代码调用:

// Flutter后端调用示例(仅用于可信服务端)
final result = await ParseCloud.callFunction("cleanExpiredInstallations", parameters: {});
print(result);

方法2:导出-本地清理-重新导入

如果Cloud Code操作有门槛,可手动批量处理:

  • 登录Back4App控制台,进入「Data Browser」找到Installation类,点击「Export Data」导出为CSV/JSON
  • 本地用Excel或Python脚本筛选有效记录(保留近期更新、设备令牌有效的条目)
  • 备份原始数据后,清空Installation类的所有记录
  • 将清理后的有效记录导入回Installation类

方法3:实时清理推送失败的令牌

通过监听推送失败事件,实时标记并清理无效令牌:

  1. 在Back4App控制台配置推送状态回调,将推送失败的deviceToken存储到自定义类(如FailedPushTokens)
  2. 定期执行云函数,删除Installation类中与FailedPushTokens匹配的记录:
Parse.Cloud.define("cleanFailedPushTokens", async (request) => {
  const failedQuery = new Parse.Query("FailedPushTokens");
  const failedTokens = await failedQuery.find({ useMasterKey: true });
  const tokenList = failedTokens.map(item => item.get("deviceToken"));

  const installationQuery = new Parse.Query(Parse.Installation);
  installationQuery.containedIn("deviceToken", tokenList);
  
  const installations = await installationQuery.find({ useMasterKey: true });
  await Parse.Object.destroyAll(installations, { useMasterKey: true });
  
  // 清理完成后可清空FailedPushTokens类
  await failedQuery.find({ useMasterKey: true }).then(items => Parse.Object.destroyAll(items, { useMasterKey: true }));
  return `清理了 ${installations.length} 条推送失败的令牌记录`;
});

注意事项

  • 所有操作必须使用主密钥,禁止在客户端执行清理逻辑
  • 清理前务必备份Installation类数据,避免误删有效记录
  • 先小范围测试(比如删除10条过期记录)验证效果后再批量操作

内容的提问来源于stack exchange,提问作者Kaushik Godhani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:30:24