如何在调用 API 时向 APNS 发送推送证书?
Posted
技术标签:
【中文标题】如何在调用 API 时向 APNS 发送推送证书?【英文标题】:How to send push certificate to APNS while calling their APIs? 【发布时间】:2020-03-10 14:49:08 【问题描述】:使用我的服务器应用程序(Spring Boot 应用程序)中的 apns 推送证书发送推送通知时被卡住了。 Apple 讨论了here,概述了我们如何发送带证书的推送,但没有关于 TLS 通信的技术细节(特别是关于如何将我的推送证书发送到 APNS 并继续 API 调用)。
任何人有任何参考或文章?
【问题讨论】:
我需要在不使用任何外部库的情况下使用证书向 APNS 发送推送 你试过了吗?\gist.github.com/greencoder/16d1f8d7b0fed5b49cf64312ce2b72cc @arturdev--cert <certificate file>
中证书的文件格式是什么? .p12
、.cert
或 .pem
?
它可以是组合的 .pam 或组合的 .p12。您可以使用certifire.io 轻松为您的应用生成它们
@arturdev 我可以使用 curl 发送推送,但我需要从 Spring Boot 应用程序发送。我该怎么做?
【参考方案1】:
既然您提到了您在 Spring Boot 应用程序上的工作,我假设您正在使用 Java 和 Maven。
我们的后端也是用 Java 编写的,我最近通过实现 Pushy 更新了我们的推送通知代码。使用经过实战测试并定期更新的库比编写自己的库要容易得多。我使用 pushy 在一个相当弱的服务器上每天发送大约 10 万个推送通知,并且从来没有遇到过任何问题。
实现起来相当简单。他们的 README 非常有用,但总结是在您的 pom.xml
文件中添加 pushy 作为依赖项:
<dependency>
<groupId>com.eatthepath</groupId>
<artifactId>pushy</artifactId>
<version>0.13.11</version>
</dependency>
这是一个使用README 中被盗代码的简单示例,但我确实添加了评论:
// Add these lines as class properties
// This creates the object that handles the sending of the push notifications.
// Use ApnsClientBuilder.PRODUCTION_APNS_HOST to send pushes to App Store apps
final ApnsClient apnsClient = new ApnsClientBuilder()
.setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST)
.setClientCredentials(new File("/path/to/certificate.p12"), "p12-file-password")
.build();
// The push notification
final SimpleApnsPushNotification pushNotification;
// In some method:
// Creating the object that builds the APNs payload
final ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder();
// setting the text of the push
payloadBuilder.setAlertBody("Example!");
// Builds the anps payload for the push notification
final String payload = payloadBuilder.build();
// The push token of the device you're sending the push to
final String token = TokenUtil.sanitizeTokenString("<efc7492 bdbd8209>");
// Creating the push notification object using the push token, your app's bundle ID, and the APNs payload
pushNotification = new SimpleApnsPushNotification(token, "com.example.myApp", payload);
try
// Asking the APNs client to send the notification
// and creating the future that will return the status
// of the push after it's sent.
// (It's a long line, sorry)
final PushNotificationFuture<SimpleApnsPushNotification, PushNotificationResponse<SimpleApnsPushNotification>> sendNotificationFuture = apnsClient.sendNotification(pushNotification);
// getting the response from APNs
final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse = sendNotificationFuture.get();
if (pushNotificationResponse.isAccepted())
System.out.println("Push notification accepted by APNs gateway.");
else
System.out.println("Notification rejected by the APNs gateway: " +
pushNotificationResponse.getRejectionReason());
if (pushNotificationResponse.getTokenInvalidationTimestamp() != null)
System.out.println("\t…and the token is invalid as of " +
pushNotificationResponse.getTokenInvalidationTimestamp());
catch (final ExecutionException e)
System.err.println("Failed to send push notification.");
e.printStackTrace();
【讨论】:
虽然不想使用任何库。你知道 Pushy 在后面是如何处理的,他们是否打开套接字并进行 TLS 握手等等?或者他们使用不同的方法? 我不太确定他们是如何做到的,但是如果您查看他们的ApnsClientBuilder
课程,您可以阅读他们为 TLS 设置凭据的一些代码。该库也有很好的文档记录,那里应该有一些线索。如果我有更多空闲时间,我会搜索并弄清楚,但不幸的是我没有。以上是关于如何在调用 API 时向 APNS 发送推送证书?的主要内容,如果未能解决你的问题,请参考以下文章