Как подключиться к apn с PHP, используя файл ключа аутентификации p8

После того, как Apple изменила ключ аутентификации APN на p8, текущие библиотеки, такие как https://github.com/immobiliare/ApnsPHP по-прежнему использовать старые файлы pem и cert для подключения

$push = new ApnsPHP_Push(
    ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,
    'server_certificates_bundle_sandbox.pem'
);
// Set the Provider Certificate passphrase
// $push->setProviderCertificatePassphrase('test');
// Set the Root Certificate Autority to verify the Apple remote peer
$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');
// Connect to the Apple Push Notification Service
$push->connect()

На примере Node.js (https://eladnava.com/send-push-notifications-to-ios-devices-using-xcode-8-and-swift-3/), я мог бы отправить так:

var apnProvider = new apn.Provider({
     token: {
        key: 'APNsAuthKey_Q34DLF6Z6J.p8', // Path to the key p8 file
        keyId: 'Q34DLF6Z6J', // The Key ID of the p8 file (available at https://developer.apple.com/account/ios/certificate/key)
        teamId: 'RLAHF6FL89', // The Team ID of your Apple Developer Account (available at https://developer.apple.com/account/#/membership/)
    },
    production: false // Set to true if sending a notification to a production iOS app
});

Как я могу использовать PHP для отправки удаленных уведомлений на iOS, как в node.js?


person mehmetsen80    schedule 09.11.2016    source источник
comment
У тебя есть решение? :)   -  person Maximus1809    schedule 20.02.2017
comment
@Maximus1809 еще нет :)   -  person mehmetsen80    schedule 22.02.2017
comment
Я тоже ищу способ сделать это, похоже, мне придется сделать решение   -  person Joseph Astrahan    schedule 04.03.2017
comment
Изучаем это сейчас (developer.apple.com/library/content/documentation/)   -  person Joseph Astrahan    schedule 04.03.2017
comment
Эта библиотека поддерживает то, что вам нужно github.com/edamov/pushok   -  person Ibrahim Azhar Armar    schedule 08.08.2017


Ответы (2)


Может быть, уже слишком поздно, но у меня были проблемы с этим, потому что почти все инструкции по-старому.

Поэтому я решил ответить на этот «старый» вопрос своим решением.

private static function sendNotificationAPN($device_token, $title, $body, $category, $sound, $optionals) {
        $alert = array(
            'aps' => array(
                'alert'    => array(
                    'title' => $title,
                    'body'  => $body
                ),
                'badge' => 0,
                'sound'    => $sound,
                'category' => $category,
                'content-available' => true
            )
        );

        foreach ($optionals as $key => $option) {
            $alert[$key] = $option;
        }

        $alert = json_encode($alert);

        $url = 'https://api.development.push.apple.com/3/device/' . $device_token['apn'];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $alert);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: '/* your app name */'"));
        curl_setopt($ch, CURLOPT_SSLCERT, /* absolute path to cert file */);
        curl_setopt($ch, CURLOPT_SSLCERTPASSWD, /* passphrase for cert */);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);


        $ret = array(
            'body' => $response,
            'httpcode' => $httpcode
        );

        return $ret;
    }
person BraveButter    schedule 27.06.2018

Извините, что так поздно на игру. Если я правильно понял ваш вопрос, я считаю, что это то, что вы ищете. Это то, что я использую для отправки сообщений в Apple APNS с помощью PHP. Возможно, вам придется провести некоторое исследование полезной нагрузки, поскольку существует несколько способов ее структурирования в зависимости от того, как вы написали код своего приложения. Кроме того, имейте в виду, что вы должны иметь возможность использовать порт 2195, чтобы это работало. Если вы используете выделенный или внутренний сервер, все должно быть в порядке. Если это общий сервер, он не будет работать.

    $passphrase = 'xxxxx'; // This is the passphrase used for file ck.pem
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); // ck.pem file must be included to sent token to ios devices 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    stream_context_set_option($ctx, 'ssl', 'verify_peer', true);
    stream_context_set_option($ctx, 'ssl', 'allow_self_signed', true);
    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
    stream_set_blocking ($fp, 0); // Ensure that blocking is disabled

    if (!$fp) {
        $fds = "Failed to connect: $err $errstr" . PHP_EOL;
        return false;
    } else {

        // Create the payload body
        // this example uses a custom data payload.  depending on your app you may need to change this
        $body['aps'] = array('alert' => $message, 'sound' => 'default', 'badge' => 1);
        // Encode the payload as JSON
        $payload = json_encode($body);
        // Build the binary notification
        $msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '',$token)) . pack('n', strlen($payload)) . $payload;
        // Send it to the server
        $result = fwrite($fp, $msg, strlen($msg));
        // Close the connection to the server
        fclose($fp);
    }
person Austin    schedule 09.05.2017
comment
Пожалуйста, используйте новую аутентификацию JWT. - person Benoit Deldicque; 06.06.2020