我一直在为一个iOS应用程序设置苹果推送通知,使用JSON Web令牌而不是证书。
我可以生成一个JWT,并从应用程序中发出所需的POST请求(使用Swift-JWT包),然后通知就会被发送。
我使用的是MongoDB Realm,它有无服务器函数(在JavaScript中,有一个节点环境),可以从iOS应用程序调用。
但是,尽管尝试了几个节点模块来发出POST请求,但总是出现错误(如“BadDeviceToken”或“InvalidProviderToken”)。
我终于使用node-apn包让它工作了!但是,我有两个关于在这个无服务器函数上下文中使用它的查询:
1.它试图保持一个与Apple服务器的连接,这很好,除非它可能意味着每次调用该函数时都会打开一个新的连接。调用Provider.shutdown()
似乎不会停止连接。我不认为我可以让一个长时间运行的进程在无服务器的上下文中接收未来的请求。
- Apple建议刷新JWT的频率不要超过20分钟。
node-apn
为您管理JWT,但在无服务器环境中,每次调用函数时都会生成一个新令牌吗?每次我在开发模式下测试它时(到Apple沙箱端点),似乎都会发送通知。
如果能澄清这些问题,以及node-apn
是否适合在无服务器函数中使用,我将不胜感激。
更新
Provider.shutdown()
不工作似乎是一个公认的问题。
我可以使用以下解决方法关闭系统:Provider.client.endpointManager._endpoints.forEach(endpoint => endpoint.destroy());
我仍然想知道在无服务器函数中使用这个是否合理。我担心JWT会随着每个请求而刷新,这可能是苹果不喜欢的!
1条答案
按热度按时间unftdfkk1#
我已经浏览了苹果关于这方面的文档,并对你关于在无服务器环境中刷新令牌的问题进行了思考。
您可以设想以下方法,以确保根据Apple文档,每20分钟刷新令牌不超过一次,每小时至少刷新一次:
1.生成用于发送单个通知请求的令牌
1.发送通知,然后在后台将该令牌保存到MongoDB内部的某个集合(例如
apn_tokens
)中(可选地与createdAt
时间戳字段一起)createdAt
日期(或JWT本身的iat
字段)小于一小时(或在小于该小时的某个阈值内,例如50分钟),则在发送推送通知请求时重用该令牌此过程的注意事项:它要求您的数据库(或
apn_tokens
集合)只能从受信任的源访问(即您的云应用程序/功能本身)。客户端不应以任何方式访问此表。您可以想象为您的无服务器环境设置Collection-Level Access Control。作为额外的安全层,您可以想象在步骤1中重新生成令牌后删除“过期”令牌,使得在任何时间表中只存在一个令牌,以防止潜在的活动令牌在数据库中闲置而不使用。我希望这对你有帮助!