应使用哪个证书在应用服务器上使用Pushkit和APNS唤醒iOS应用? [英] Which certificate should be used on app Server for waking iOS app using Pushkit and APNS?

查看:128
本文介绍了应使用哪个证书在应用服务器上使用Pushkit和APNS唤醒iOS应用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的iOS应用中使用Websocket进行数据传输.但是,由于有时当应用程序在后台挂起时,套接字会中断.在这种情况下,我会使用Voip push to iOS应用程序唤醒应用程序.

I am using Websocket in my iOS app for data transfer. But, since sometimes when the app is suspended in the background, the socket breaks. In that case, I use Voip push to iOS app to wake app up.

//called on appDidFinishLaunching
//register for voip notifications

PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];

voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
voipRegistry.delegate = self;


//delegate methods for `PushKit`
#pragma mark - PushKit Delegate Methods

    - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType)type {
        self.myDeviceToken = [[[[pushCredentials token] description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
        NSLog(@"voip token: %@", self.myDeviceToken);
    }

    - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type {

        if (![self socketIsConnected]) {
            [self reconnectSocket];
        }
    }

我将我的Login API请求中从didUpdatePushCredentials收到的令牌发送到我的应用服务器.

I send the token received from didUpdatePushCredentials in my Login API request to my app server.

我心中有以下疑问,并为他们寻求答案.

I have the following doubts in my mind and seeking answers for them.

  1. PushKit是否同时需要APNS证书和Voip证书?或只是其中之一,为什么是其中一个?
  2. 如果同时需要两个证书,我是否需要将两个证书都保留在应用服务器上,才能将成功推送发送到我的应用?
  3. 服务器端应使用哪个证书来推送通知,该通知将从服务器端调用"didReceiveIncomingPushWithPayload"?
  1. Does PushKit require both the APNS certificate and Voip certificate? or just one of them and which one and why?
  2. If it requires both the certificates, do I need to keep both the certificates on the app server for sending success pushes to my app?
  3. Which certificate should be used on the server side to push notification which would invoke "didReceiveIncomingPushWithPayload" from server side?

请在服务器端代码下方找到

Please find below the code on server side :

private ApnsService getService(String appId) {

    synchronized (APP_ID_2_SERVICE_MAP) {

        ApnsService service = APP_ID_2_SERVICE_MAP.get(appId);

        if (service == null) {

            InputStream certificate = getCertificateInputStream(appId);

            if (certificate == null) {

                String errorMessage = "APNS appId unsupported: " + appId;

                LOGGER.error(errorMessage);

                throw new ATRuntimeException(errorMessage);

            }

            boolean useProd = useAPNSProductionDestination();

            if (useProd) {

                LOGGER.info("Using APNS production environment for app " + appId);

                service = APNS.newService().withCert(certificate, CERTIFICATE_PASSWORD).withProductionDestination()

                        .build();

            } else {

                LOGGER.info("Using APNS sandbox environment for app " + appId);

                service = APNS.newService().withCert(certificate, CERTIFICATE_PASSWORD).withSandboxDestination()

                        .build();

            }

            APP_ID_2_SERVICE_MAP.put(appId, service);

        }

        return service;

    }

}

我做了以下实现,但失败了: 1.创建了APNS SSL服务证书沙箱+生产. 2.将在didUpdatePushCredentials中收到的令牌发送到服务器. 3.服务器使用APNS证书发送推送. 但是失败了,因为它找不到任何相应的证书.

I did following implementation and it failed : 1. Created APNS SSL Service Certificate Sandbox + Production. 2. Sent token received in didUpdatePushCredentials to server. 3. Server used APNS Certificate to send the push. But failed since it could not find any corresponding certificate.

因此,我无法将要发送到服务器的令牌和将用于服务器上用于发送推送的证书相结合.

So I am failing at the combination of token to be sent to server and the certificate that would be used on the server to send the push.

推荐答案

您似乎对APNSPushKit

您需要先参考下图.

.

在通知服务器和 Apple 之间建立连接 推送通知服务沙箱和生产环境 向您的应用传递远程通知.使用HTTP/2时, 同一证书可用于传递应用程序通知,更新 ClockKit并发症数据,以及警告传入的后台VoIP应用 活动.您为每个应用程序都需要单独的证书 分发.

Establish connectivity between your notification server, the Apple Push Notification service sandbox, and production environments to deliver remote notifications to your app. When utilizing HTTP/2, the same certificate can be used to deliver app notifications, update ClockKit complication data, and alert background VoIP apps of incoming activity. A separate certificate is required for each app you distribute.

这意味着单个证书同时适用于两者.

That's means single certificate worked for both.

问题:1

PushKit是否同时需要APNS证书和VOIP证书?还是其中之一,为什么?

Does PushKit require both the APNS certificate and VOIP certificate? or just one of them and which one and why?

  • 通用证书对两者都有效.

问题:2

如果同时需要两个证书,我是否需要将两个证书都保留在应用服务器上,才能将成功推送发送到我的应用?

  • 现在,这个问题没有意义了.

似乎是与证书路径有关的问题.保留现在的状态,您可以在下面的php script使用触发触发通知

It seems like an issue related to the certificate path. Leave it as of now, You can use below php script use to trigger notification

<?php

// Put your device token here (without spaces):


$deviceToken = '1234567890123456789';
//


// Put your private key's passphrase here:
$passphrase = 'ProjectName';

// Put your alert message here:
$message = 'My first silent push notification!';



$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'PemFileName.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
//  'ssl://gateway.push.apple.com:2195', $err,
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body

$body['aps'] = array(
'content-available'=> 1,
'alert' => $message,
'sound' => 'default',
'badge' => 0,
);



// Encode the payload as JSON

$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

您可以使用php push.php命令触发推送

You can trigger push by using php push.php command

这篇关于应使用哪个证书在应用服务器上使用Pushkit和APNS唤醒iOS应用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆