如何使用p8 auth密钥文件与PHP连接到apn

meh*_*n80 10 php apn apple-push-notifications ios apns-php

Apple将APNs Auth Key更改为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()
Run Code Online (Sandbox Code Playgroud)

使用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
});
Run Code Online (Sandbox Code Playgroud)

如何在node.js中使用PHP向iOS发送远程通知?

Aus*_*tin -2

抱歉这么晚才参加比赛。如果我正确理解你的问题,我相信这就是你所寻找的。这是我使用 PHP 向 Apple APNS 发送消息的方法。您可能需要对有效负载进行一些研究,因为根据您编写应用程序的方式,有几种方法可以构建它。另外,请记住您必须能够使用端口 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);
    }
Run Code Online (Sandbox Code Playgroud)