如何在调用 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 发送推送证书?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 APNS Dev iOS 证书向其他设备发送推送通知吗?

我应该为 APNS HTTP2 API 使用不同的证书吗?

如何测试 sns APNS 推送通知到单个设备

我需要 APNS 证书和 VOIP 证书吗?

iOS:从 AWS SNS 向 APNS 发送推送通知

无法通过 APNS 向设备发送 MDM 推送通知。