Какой сертификат следует использовать на Сервере приложений для пробуждения приложения iOS с помощью Pushkit и APNS? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую Websocket в своем приложении iOS для передачи данных. Но, поскольку иногда, когда приложение приостановлено в фоновом режиме, сокет ломается. В этом случае я использую приложение Voip pu sh to iOS, чтобы разбудить приложение.

//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];
        }
    }

Я отправляю токен, полученный от didUpdatePushCredentials в моем запросе API входа на сервер приложений.

У меня возникают следующие сомнения и я ищу ответы на них:

  1. Требует ли PushKit и APNS-сертификат, и VoIP-сертификат? или только один из них и какой именно и почему?
  2. Если для этого требуются оба сертификата, нужно ли хранить оба сертификата на сервере приложений для отправки успешных отправок в мое приложение?
  3. Какой сертификат следует использовать на стороне сервера для уведомления pu sh, которое будет вызывать «didReceiveIncomingPushWithPayload» со стороны сервера?

Ниже приведен код на стороне сервера:

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 Certificate для отправки pu sh. Но произошел сбой, поскольку не удалось найти соответствующий сертификат.

Так что мне не удается комбинировать токен, который будет отправлен на сервер, и сертификат, который будет использоваться на сервере для отправки пу sh.

1 Ответ

0 голосов
/ 15 апреля 2020

Похоже, вы запутались в APNS и PushKit

Сначала вам нужно сослаться на изображение ниже.

enter image description here.

В нем четко указано:

Установлено sh подключение между вашим сервером уведомлений, Apple Pu sh Уведомление сервисная песочница и производственные среды для доставки удаленных уведомлений в ваше приложение. При использовании HTTP / 2 один и тот же сертификат можно использовать для доставки уведомлений приложений, обновления данных о сложности ClockKit и фоне оповещения приложений VoIP о входящих действиях . Для каждого распространяемого приложения требуется отдельный сертификат.

Это означает, что один сертификат работал для обоих.

Вопрос: 1

Требуется ли для PushKit сертификат APNS и VOIP? или только один из них и какой именно и почему?

  • Общий сертификат работал для обоих.

Вопрос: 2

Если для этого требуются оба сертификата, нужно ли хранить оба сертификата на сервере приложений для отправки успешных отправок в мое приложение?

  • Теперь, нет смысла этого вопроса.

Обновление: 1

Похоже, проблема связана с путем сертификата. Оставьте это сейчас, вы можете использовать ниже php script использовать для запуска уведомления

Pu sh. php

<?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);

Вы можете запустить Pu sh с помощью php push.php команда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...