Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS GCM push notifications not received in background using PHP sender and Swift

I'm working on getting background notifications to work on IOS with GCM - non-background notifications are already working. Here are my steps to integrate background notifications:

  1. Enable the remote-notifications tag in UIBackgroundmodes
  2. Add the content-available key to my notification payload.
  3. Write the application:didRecieveRemoteNotification:fetchCompletionHandler: in my delegate.

Here is the code for the delegate function:

func application( application: UIApplication,
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
    fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) {
        println("Notification received2: \(userInfo)")

        GCMService.sharedInstance().appDidReceiveMessage(userInfo);

        NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil,
            userInfo: userInfo)
        handler(UIBackgroundFetchResult.NoData);    
}

This is the code for the on-server php script:

<?php
$regId = $_GET["regId"];
$message = $_GET["message"];

$data = array( 'price' => $message, 'sound' => 'default', 'body' => 'helloworld', 'title' => 'default', 'badge' => 12, 'content-available' => 1);

$ids = array( $regId);

sendGoogleCloudMessage(  $data, $ids );

function sendGoogleCloudMessage( $data, $ids )
{

    $apiKey = THE-API-KEY-THAT-I-AM-USING;

    $url = 'https://android.googleapis.com/gcm/send';

    $post = array(
                'registration_ids'  => $ids,
                'data'              => $data,
                'content-available' => 1,
    );

    $headers = array(
                    'Authorization: key=' . $apiKey,
                    'Content-Type: application/json'
                );

    $ch = curl_init();

    curl_setopt( $ch, CURLOPT_URL, $url );

    curl_setopt( $ch, CURLOPT_POST, true );

    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );

    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $post ) );

    $result = curl_exec( $ch );

    if ( curl_errno( $ch ) )
    {
        echo 'GCM error: ' . curl_error( $ch );
    }

    curl_close( $ch );

    echo $result;
}
?>

I have tried sending the content-available flag through both the inner "data" array and the outer "post" array, which I have indicated by adding it to both.

The message is not received by the fetchCompletionHandler function, but rather waits until the app is active again and is received by the normal application:didRecieveRemoteNotification function. What could be the reason that my notification is not received via the background functionality?

like image 283
John Szymanski Avatar asked Oct 31 '22 23:10

John Szymanski


1 Answers

You should provide content_available to GCM, not content-available (like in APNs) and you will be able to receive push notifications in background.

https://developers.google.com/cloud-messaging/server-ref#send-downstream

P.S. - Less then five minutes ago I had absolutely same problem. We should read docs more carefully...

like image 74
Oleg Tsvetkov Avatar answered Nov 15 '22 06:11

Oleg Tsvetkov