我目前正在从我们的后端服务器到我们的应用程序(macOS Catalina 和iOS -相同的代码库)实现push notifications,使用Apple Push Notifications和基于令牌的身份验证方式(从keyId生成JWT,teamId等)。&使用在Apple开发者控制台中生成的私钥对其进行签名)以将推送发送到APN服务。
我面临的问题是,我能否成功发送“警报”通知(状态200,标头apns-push-type: alert
)并在我的iOS和MacOS设备上接收它们(推送通知在生产和沙盒模式下成功出现)但由于某种原因,“静默”推送(头为apns-push-type: background
)仅在我的iOS设备(iPhone)上接收,但在我的Mac上不接收(AppDelegate
中的didReceiveRemoteNotification(...)
从未被调用)。
到目前为止我所做的:
- 已确保APN请求标头已正确配置为静默推送:
apns-push-type: background
- 确保具有正确的APN主题标题:
apns-topic: my.bundle.id
(这与沙盒/生产不同) - 添加了“半必需”优先级头:
apns-priority: 5
(仅在后台推送时) - 已验证创建的JWT是否有效并用于APN auth标头:
authorization: mytoken
(必须如此,否则APN服务不会以状态200响应) - 确认我的应用程序具有Xcode中定义的正确权利和功能(我的理由是:必须是这种情况,否则“警报”推送通知也将不起作用)
- 再次检查是否允许/启用Mac应用程序的推送通知(已检查系统设置)
- 确保正在发送推送的设备令牌实际上来自旨在接收推送的设备(例如,我的MacBook)
- 检查了我用来签署JWT的私钥是否具有APN功能
- 在Mac应用程序正在运行但未处于焦点时进行测试&在处于焦点时也进行测试
我正在执行的发送推送的APN请求是:
- 沙盒:POST https://api.sandbox.push.apple.com/3/device/ {deviceToken}
- 生产:POST https://api.push.apple.com/3/device/ {deviceToken}
我在请求正文中发送给APN服务的有效负载(JSON)如下所示:
{
"aps": {
"content-available": 1 # defines push as "silent"
},
"data": { #some key-value pairs here }
}
在任何情况下(包括生产和沙盒,都使用iOS和macOS的设备令牌),我对APN的请求返回状态码200。我的MacBook正在运行 Catalina 10.15.3。我在这里可能做错了什么,或者是Catalyst应用程序根本不支持的东西?
1条答案
按热度按时间3okqufwl1#
哇哦,问得好。我对APN头痛相当熟悉,但从latest docs中突然出现了一些东西:
此外,通知的POST请求应包含值为background的apns-push-type头字段和值为5的apns-priority字段。APNs服务器在向Apple Watch发送推送通知时需要apns-push-type字段,并建议在所有平台上使用该字段。有关详细信息,请参阅创建并向APN发送POST请求。
第5章有区别吗?
另外,我通常尝试修复这些问题是在归档中测试,而不是Xcode构建。AFAIK prod push服务器只能发送到App Store,ad-hoc,企业或testflight构建,所以如果你只是从Xcode构建,我不认为你会得到任何生产apns的推送通知。