Search code examples
safariapple-push-notificationsapns-phpsafari-push-notifications

Signature verification of push package failed - Safari Push


I am trying to implement Safari Push Notification into my server (For my website) using PHP.

I am following the tutorial below by Apple: https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html

I am using the library developed by Connor: https://github.com/connorlacombe/Safari-Push-Notifications

But I am continuously getting permission: "denied" at Safari console. I am printing the log (from this URL: webServiceURL/version/log) at my server end and found that Signature verification of push package failed message from Apple.

In stackOverflow I found these: Safari push notifications certificate issue and Apple website push: Signature verification of push package failed, but apple certificates are ok. I have applied the solution they provided but getting the error message below: Missing file in push notification package. Downloading the pushPackage zip file manually I have found that the SIGNATURE file is missing applying their solution (using the AppleWWDRCA.pem file in openssl_pkcs7_sign method).

How to get rid of this problem? What to do get registered with APNS service?


Solution

  • I had this type of problem before when I implementing Safari push Notification in my project. Now,You are following the developer.apple.com that good one, but this one is also good for reference.

    Now already known that for push send in safari you need three things first

    1. Create fileName.cer file and CSR file in Mac.
    2. Create A p12-File with the use of CSR file.
    3. Building the Push Package

    To create push Package You Need

    1. Create icon.iconset there will be 6 icon these are shown in the push notification.
    2. Now create website.json file this the most important file in push.

    Then Code for Permission for the push in Safari:

    window.onload = function () {
        if ('safari' in window && 'pushNotification' in window.safari) {
            var permissionData = window.safari.pushNotification.permission('web.com.domainname');
            checkRemotePermission(permissionData);
        }
    };
    var checkRemotePermission = function (permissionData) {
        console.log(permissionData);
        if (permissionData.permission === 'default') {
    
            window.safari.pushNotification.requestPermission(
                'https://domainname.com',
                'web.com.domainname', {},
                checkRemotePermission
            );
        } else if (permissionData.permission === 'denied') {
            console.log('denied');
    
        } else if (permissionData.permission === 'granted') {
            console.log('granted');
        }
    
    
    };
    

    This will provided you the device Token by using that token you are able to send push.

    To Send push:

    $title ="title";//Title of the push
    $body = "body";//Body of the Push
    $button = "View";//view button 
    $payload['aps']['alert'] = array(
        "title" => $title,
        "body" => $body,
        "action" => $button
    );
    $payload['aps']['url-args'] = array(
        "www.facebook.com" // the sub part of the url to which the subscriber will be redirect after click on the push .This is Add with the URL u given in the website.json file that is:[ "urlFormatString": "http://%@" ] for this url will be :->http://www.facebook.com
    );
    for($i=0;$i<1;$i++){
        $deviceToken =$deviceToken;//This is the DeviceToken that u stored in the DB before.
    
        $payload = json_encode($payload);
        $apnsHost = 'gateway.push.apple.com';
        $apnsPort = 2195;
        $apnsCert = path/PushCertificates.pem';//Give the path to the ,pem file generated previously from ur registered .p12 file not for the downloaded .p12 file.
        $streamContext = stream_context_create();
        stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
        $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
        $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
        fwrite($apns, $apnsMessage);
        fclose($apns);
    }
    

    Here I am sending the push for multiple users. Replace the required files and then this will work for you.