使用Vapor 3支持推送通知

TLDR; 在Swift中执行cURL命令

几周前,我决定学习Vapor 3框架。 我希望能够为将来的项目开发后端API,而不必依赖我的goto Parse Server。 这是一个快速的入门指南,向您展示它的可能! 所有代码都在底部链接的GitHub存储库中提供。

为了获得有关该框架的经验并查看一些用例,我从Ray Wenderlich的网站购买了“带有Vapor的Server Side Swift”电子书。 我通读了这本书,以学习基础知识。 下一步是开始尝试将以前使用Parse Server的功能移植到Vapor 3应用程序。 当实现推送通知时,我遇到了一个障碍。

Apple的APN要求使用HTTP / 2建立连接,但是SwiftNIO(Vapor 3的核心网络依存关系)尚不支持HTTP / 2协议。 我以为我可能必须使用某些第三方解决方案,但由于我不想要这种依赖关系。 我决定仔细阅读Apple的开发人员文档(APNs-Apple Developer),以了解使用cURL连接APN所需的条件。

首先,您需要一个付费的Apple Developer帐户和一个为其配置了推送通知的演示应用程序。 您将需要运行演示应用程序并获取设备令牌,该令牌将在以后发送以测试APN。

HTTP / 2 cURL请求将需要证书。 第一步是从Apple开发人员帐户生成所需的证书。 由于已经有数个教程,因此我将不介绍如何执行此操作。 .cer文件和.p12文件将需要合并。 为此,请遵循以下bash脚本:

  #!/ bin / bash 

#将.cer文件转换为.pem文件:
openssl x509 -in aps_development.cer-通知der -out cert.pem

#将私钥的.p12文件转换为.pem文件:
openssl pkcs12 -nocerts -in aps_development.p12 -out key.pem

#最后,将证书和密钥合并到一个.pem文件中
cat cert.pem key.pem> aps_development.pem

使用新的公共/私人组合证书,我们现在可以尝试使用cURL与APN通信。

  curl -d  -H“ apns-topic: -H” apns-expiration:1“ -H” apns-priority:10“ -http2-prior-knowledge -cert aps_development.pem: https ://api.development.push.apple.com/3/device/  

成功! 我能够在之前创建的演示应用程序上收到通知。 最后一步是提供一个方便的服务,我可以将其注入到Vapor 3应用程序中,该应用程序将在后台启动cURL请求。 你可以在这里找到它:

https://github.com/nathantannar4/the.phoenix.project/blob/master/Sources/App/Services/Shell.swift

该服务可以执行带有提供的论据的bash命令。 这些参数是我们先前在测试中使用的参数。 只需从Vapor 3请求

 let shell = try req.make(Shell.self)let参数= [“ -d”,jsonAPNSPayloadString,“-H”,“ apns-topic:\(bundleId)”,“-H”,“ apns-expiration:1 ”,“-H”,“ apns优先级:10”,“ — — http2-prior-knowledge”,“ — cert”,“ \(certPath):\(password)”,apnsURL +令牌] try shell.execute( commandName:“ curl”,参数:arguments) 

请记住,在您的API中,您可能希望记录每个用户的安装,以便您的数据库可以存储其设备令牌!


这只是一个简短的摘要,希望您能入门! 随着时间的推移,SwiftNIO将支持HTTP / 2,而当它们支持时,Vapor 3将支持。在社区中已经存在一个很好的仓库(https://github.com/vapor-community/apns)。 我在应用程序中使用它来简化APNs请求的编码/解码。

如果您想查看我用于使用Vapor 3应用程序进行推送通知的完整源代码,请结帐并在下面列出的存储库中加星号!

nathantannar4 / the.phoenix.project

the.phoenix.project –已部署就绪的Vapor 3 API模板,支持身份验证,实时聊天,推送…

github.com