Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to connect to apn with PHP using p8 auth key file

After Apple changed the APNs Auth Key to p8, the current libraries such as https://github.com/immobiliare/ApnsPHP still use old pem and cert files to connect

$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()

With Node.js example (https://eladnava.com/send-push-notifications-to-ios-devices-using-xcode-8-and-swift-3/), I could send like this:

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

How can I use PHP to send remote notifications to iOS like I do in node.js?

like image 984
mehmetsen80 Avatar asked Nov 09 '16 05:11

mehmetsen80


People also ask

How do I set up APN authentication?

[1] To begin, visit the Apple Developer Member Center and log in with your credentials. [2] Click Certificates, Identifiers & Profiles. [3] Click Keys then the “+” button in the top right corner to create a new key. [4] Enter a descriptive name for your APNS Auth Key, then select Apple Push Notification Service (APNs).

What is a p8 key?

p8 file contains the PRIVATE KEY that is used to SIGN the JWT content for APNS messages. The file itself is a pure text file, the KEY inside is formatted in PEM format. The part between the -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY----- is a base64 formatted ASN.

How do I run a .p8 file?

p8 key file, go to Apple developer account page , then select Certificates, IDs & Profiles. Next, select Keys. Click the “+” button to add a new key. In the new key page, type in your key name and check the Apple Push Notification service (APNs) box , then click “Continue” and click “Register'.

What is p8 and p12 file?

p8 files are keys used to create tokens, and those . p12 files are used as certificates? authentication.


1 Answers

Maybe its too late but I had struggle with this because almost every instruction is for the old way.

So i decided to answer this "old" question with my solution.

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;
    }
like image 186
BraveButter Avatar answered Sep 25 '22 02:09

BraveButter