首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >苹果推送来自无服务器MongoDB应用服务后端的通知

苹果推送来自无服务器MongoDB应用服务后端的通知
EN

Stack Overflow用户
提问于 2022-11-03 11:34:11
回答 1查看 70关注 0票数 0

我一直在为一个iOS应用程序设置苹果推送通知,使用的是JSON令牌而不是证书。

我可以生成一个JWT,并在应用程序中(使用Swift包)发出所需的POST请求,并发送通知。

我使用的是MongoDB领域,它具有从iOS应用程序调用的无服务器函数(在JavaScript中有一个Node环境)。一个计划好的触发器更新我的JWT,正如苹果建议的那样,每小时更新一次。

然而,尽管尝试了几个节点模块来发出POST请求,但始终存在错误(如“BadDeviceToken”或“InvalidProviderToken”)。

我终于让它使用节点-apn包工作了!但是,对于在这个无服务器的函数上下文中使用它,我有两个疑问:

  1. 它尝试将连接打开到Apple服务器,这将很好,但这可能意味着每次调用该函数时都会打开一个新连接。调用Provider.shutdown()似乎并不会停止连接。我不认为我可以有一个长期运行的过程来接收未来的请求在一个无服务器的情况下。
  2. 苹果建议不要每隔20分钟刷新一次JWT。node-apn为您管理JWT,但是在一个无服务器的上下文中,它会在每次调用函数时生成一个新的令牌吗?每次我在开发模式下测试它(到Apple端点)时,都会发送通知。

对于这些问题,以及node-apn是否适合在无服务器函数中使用,我将不胜感激。

更新

Provider.shutdown()不起作用似乎是一个公认的问题。

我可以通过这个解决办法关闭:

Provider.client.endpointManager._endpoints.forEach(endpoint => endpoint.destroy());

我仍然想知道,在无服务器的函数中使用这种方法是否合理。我担心JWT会被每一个请求刷新,而苹果可能不喜欢它!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 06:35:45

我已经浏览了苹果的相关文档,并对你关于在无服务器环境下刷新令牌的问题进行了一些思考。

根据Apple的文档,您可以想象以下确保刷新令牌不超过每20分钟一次、每小时至少刷新一次的方法:

  1. 生成发送单个通知请求的令牌。
  2. 发送通知,然后在后台将该令牌保存到MongoDB内部的某个集合(例如MongoDB)(可选地与createdAt时间戳字段一起使用)
  3. 在下一个发送推送通知的请求中,从服务器获取存储的JWT令牌。
    • 如果令牌的createdAt日期(或JWT本身上的iat字段)小于一个小时(或者在低于小时(例如50分钟)的阈值内),则在发送推送通知请求时重用令牌
    • 否则,从步骤1重新启动进程!

请注意:如果数据库(或apn_tokens集合)尚未访问,则只需要从受信任的源(即仅从云应用程序/函数)访问。客户端不应该以任何方式访问此表。您可以想象为您的无服务器环境设置集合级访问控制。作为额外的安全层,您可以想象在步骤1中重新生成后删除“过期”令牌,这样在任何时候表中只有一个令牌,以防止潜在的活动令牌在数据库中不使用而放置。

我希望这能帮到你!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74302405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档