ios 来自无服务器MongoDB应用服务后端的Apple推送通知

qxgroojn  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(158)

我一直在为一个iOS应用程序设置苹果推送通知,使用JSON Web令牌而不是证书。
我可以生成一个JWT,并从应用程序中发出所需的POST请求(使用Swift-JWT包),然后通知就会被发送。
我使用的是MongoDB Realm,它有无服务器函数(在JavaScript中,有一个节点环境),可以从iOS应用程序调用。
但是,尽管尝试了几个节点模块来发出POST请求,但总是出现错误(如“BadDeviceToken”或“InvalidProviderToken”)。
我终于使用node-apn包让它工作了!但是,我有两个关于在这个无服务器函数上下文中使用它的查询:
1.它试图保持一个与Apple服务器的连接,这很好,除非它可能意味着每次调用该函数时都会打开一个新的连接。调用Provider.shutdown()似乎不会停止连接。我不认为我可以让一个长时间运行的进程在无服务器的上下文中接收未来的请求。

  1. Apple建议刷新JWT的频率不要超过20分钟。node-apn为您管理JWT,但在无服务器环境中,每次调用函数时都会生成一个新令牌吗?每次我在开发模式下测试它时(到Apple沙箱端点),似乎都会发送通知。
    如果能澄清这些问题,以及node-apn是否适合在无服务器函数中使用,我将不胜感激。

更新

Provider.shutdown()不工作似乎是一个公认的问题。
我可以使用以下解决方法关闭系统:
Provider.client.endpointManager._endpoints.forEach(endpoint => endpoint.destroy());
我仍然想知道在无服务器函数中使用这个是否合理。我担心JWT会随着每个请求而刷新,这可能是苹果不喜欢的!

unftdfkk

unftdfkk1#

我已经浏览了苹果关于这方面的文档,并对你关于在无服务器环境中刷新令牌的问题进行了思考。
您可以设想以下方法,以确保根据Apple文档,每20分钟刷新令牌不超过一次,每小时至少刷新一次:
1.生成用于发送单个通知请求的令牌
1.发送通知,然后在后台将该令牌保存到MongoDB内部的某个集合(例如apn_tokens)中(可选地与createdAt时间戳字段一起)

  • 在下一次请求发送推送通知时,从服务器获取存储的JWT标记。
  • 如果令牌的createdAt日期(或JWT本身的iat字段)小于一小时(或在小于该小时的某个阈值内,例如50分钟),则在发送推送通知请求时重用该令牌
  • 否则,从步骤1重新开始该过程!

此过程的注意事项:它要求您的数据库(或apn_tokens集合)只能从受信任的源访问(即您的云应用程序/功能本身)。客户端不应以任何方式访问此表。您可以想象为您的无服务器环境设置Collection-Level Access Control。作为额外的安全层,您可以想象在步骤1中重新生成令牌后删除“过期”令牌,使得在任何时间表中只存在一个令牌,以防止潜在的活动令牌在数据库中闲置而不使用。
我希望这对你有帮助!

相关问题