GCM mit PHP (Google Cloud Messaging)

213

Update: GCM ist veraltet, verwenden Sie FCM

Wie kann ich das neue Google Cloud Messaging in ein PHP-Backend integrieren?

user1488243
quelle
4
Ich habe eine kleine OOP-Bibliothek mit einer Implementierung von GCM-Server geschrieben. Hoffe, es wird jemandem helfen :) Überprüfen Sie es auf GitHub - github.com/CodeMonkeysRu/GCMMessage
iVariable
1
@HelmiB: Ich habe Ihren Code auf der Website ausprobiert, er wird fehlerfrei ausgeführt, aber das $ -Ergebnis ist leer. Auch die Nachricht wird nicht zugestellt. Bitte hilf mir. Ich brauche es wirklich.
user2064667
Mein GCMMessage-Zweig unterstützt exponentielle Backups, die für die Verwendung der Google-API obligatorisch sind. Es verwendet einen Redis-Server zum Einreihen von Nachrichten und unterstützt den neuen Endpunkt sowie iOS: github.com/stevetauber/php-gcm-queue
Steve Tauber
Es ist sehr einfach. Sie benötigen lediglich einen App-Server, einen GCM-Server und eine App, die diesen Service hostet. Beziehen Sie sich auf dieses Beispiel. Hier fungiert localhost als App-Server. Fezzroid.com/2016/02/…
Naruto

Antworten:

236

Dieser Code sendet eine GCM-Nachricht über PHP CURL an mehrere Registrierungs-IDs.

// Payload data you want to send to Android device(s)
// (it will be accessible via intent extras)    
$data = array('message' => 'Hello World!');

// The recipient registration tokens for this notification
// https://developer.android.com/google/gcm/    
$ids = array('abc', 'def');

// Send push notification via Google Cloud Messaging
sendPushNotification($data, $ids);

function sendPushNotification($data, $ids) {
    // Insert real GCM API key from the Google APIs Console
    // https://code.google.com/apis/console/        
    $apiKey = 'abc';

    // Set POST request body
    $post = array(
                    'registration_ids'  => $ids,
                    'data'              => $data,
                 );

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

    // Initialize curl handle       
    $ch = curl_init();

    // Set URL to GCM push endpoint     
    curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');

    // Set request method to POST       
    curl_setopt($ch, CURLOPT_POST, true);

    // Set custom request headers       
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // Get the response back as string instead of printing it       
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Set JSON post data
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));

    // Actually send the request    
    $result = curl_exec($ch);

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

    // Close curl handle
    curl_close($ch);

    // Debug GCM response       
    echo $result;
}
Elad Nava
quelle
3
Hier funktioniert es fast, aber ich erhalte keine Nachricht am Telefon. Ich möchte es debuggen, aber ich weiß nicht, warum mein $ Ergebnis immer leer ist ...
Bertrand
9
Wo kann ich Registrierungs-IDs bekommen?
Seshu Vinay
6
Danke für diese Antwort! Ich habe es in ein PHP-Objekt-Framework gerollt, wenn dies für irgendjemanden nützlich ist: github.com/kaiesh/GCM_PHP
Kaiesh
6
@Sit Das Deaktivieren von SSL-Zertifikatprüfungen ist IMMER eine schlechte Idee. Wenn Ihr Server ein SSL-Zertifikat nicht überprüfen kann, teilen Sie cURL mit dieser Technik mit, welches Zertifikat zu erwarten ist: unitstep.net/blog/2009/05/05/… oder erzwingen Sie, dass cURL die neueste cacert.pem von der cURL-Website verwendet so etwas wie das: gist.github.com/gboudreau/5206966
Guillaume Boudreau
4
Dies half:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
Zeusstl
34
<?php
    // Replace with the real server API key from Google APIs
    $apiKey = "your api key";

    // Replace with the real client registration IDs
    $registrationIDs = array( "reg id1","reg id2");

    // Message to be sent
    $message = "hi Shailesh";

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

    $fields = array(
        'registration_ids' => $registrationIDs,
        'data' => array( "message" => $message ),
    );
    $headers = array(
        'Authorization: key=' . $apiKey,
        'Content-Type: application/json'
    );

    // Open connection
    $ch = curl_init();

    // Set the URL, number of POST vars, POST data
    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( $fields));

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    // curl_setopt($ch, CURLOPT_POST, true);
    // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields));

    // Execute post
    $result = curl_exec($ch);

    // Close connection
    curl_close($ch);
    echo $result;
    //print_r($result);
    //var_dump($result);
?>
Shailesh Giri
quelle
3
Hallo Shailesh Giri, es funktioniert einwandfrei mit dem Browser-Schlüssel , aber im Falle eines Server-Schlüssels wird der nicht autorisierte Fehler 401 angezeigt . Kannst du mir bitte helfen.
Sushil Kandola
Was ist das erwartete Ergebnis vom Server? Ich bekomme keine Antwort! Außerdem zeigt das Gerät keine Meldung an.
Shiladitya
3
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);ist ein großes Nein-Nein. Wenn Ihr Server, auf dem dieser PHP-Code ausgeführt wird, aus irgendeinem Grund das von den Google-Servern verwendete SSL-Zertifikat nicht überprüfen kann, können Sie cURL mitteilen, mit was überprüft werden soll. Beispiel: unitstep.net/blog/2009/05/05/…
Guillaume Boudreau
18

Es ist einfach zu machen. Der cURL- Code auf der Seite, die Elad Nava hier eingefügt hat, funktioniert. Elad hat den Fehler kommentiert, den er erhält.

Zeichenfolge, die einen Fehler beschreibt, der beim Verarbeiten der Nachricht für diesen Empfänger aufgetreten ist. Die möglichen Werte sind die gleichen wie in der obigen Tabelle dokumentiert, plus "Nicht verfügbar" (was bedeutet, dass GCM-Server ausgelastet waren und die Nachricht für diesen bestimmten Empfänger nicht verarbeiten konnten, sodass sie erneut versucht werden konnte).

Ich habe bereits einen Dienst eingerichtet, der anscheinend funktioniert (ish), und bisher habe ich nur nicht verfügbare Retouren von Google erhalten. Höchstwahrscheinlich wird sich dies bald ändern.

Um die Frage zu beantworten, verwenden Sie PHP, stellen Sie sicher, dass sich das Zend Framework in Ihrem Include-Pfad befindet, und verwenden Sie diesen Code:

<?php
    ini_set('display_errors',1);
    include"Zend/Loader/Autoloader.php";
    Zend_Loader_Autoloader::getInstance();

    $url = 'https://android.googleapis.com/gcm/send';
    $serverApiKey = "YOUR API KEY AS GENERATED IN API CONSOLE";
    $reg = "DEVICE REGISTRATION ID";

    $data = array(
            'registration_ids' => array($reg),
            'data' => array('yourname' => 'Joe Bloggs')
    );

    print(json_encode($data));

    $client = new Zend_Http_Client($url);
    $client->setMethod('POST');
    $client->setHeaders(array("Content-Type" => "application/json", "Authorization" => "key=" . $serverApiKey));
    $client->setRawData(json_encode($data));
    $request = $client->request('POST');
    $body = $request->getBody();
    $headers = $request->getHeaders();
    print("<xmp>");
    var_dump($body);
    var_dump($headers);

Und da haben wir es. Ein funktionierendes (es wird bald funktionieren) Beispiel für die Verwendung von Googles neuem GCM in Zend Framework PHP.

Roger Thomas
quelle
9
MASSIVES UPDATE! Anscheinend funktioniert die Verwendung eines API-Schlüsselsatzes mit IP-Einschränkung nicht. Ich habe gerade meinen API-Schlüssel auf der Serverseite ausgetauscht, um den Schlüssel in der API-Konsole mit dem Namen "Schlüssel für Browser-Apps (mit Verweisen)" zu verwenden. Und wissen Sie was? Es ging durch. Folgendes hatte ich zurückgegeben: {"multicast_id": 8466657113827057558, "success": 1, "failed": 0, "canonical_ids": 0, "results": [{"message_id": "0: 1341067903035991% 921c249a66d6cf16"}] }
Roger Thomas
1
Es ist jetzt ein und aus. Ich habe ungefähr 3500 Nachrichten pro Tag und bisher keine Probleme zu melden.
Roger Thomas
+1 Elad .. Sie müssen den BROWSER-Anwendungs-API-Schlüssel für SERVER-Anwendungen verwenden! Danke Google, wirklich hilfreich FAIL dort :( (verschwendete viele Stunden)
Jonny Nott
13

Nachdem ich lange gesucht habe, kann ich endlich herausfinden, was ich genau brauchte. Herstellen einer Verbindung zum GCM mithilfe von PHP als serverseitige Skriptsprache. Das folgende Tutorial gibt uns eine klare Vorstellung davon, wie wir alles einrichten, was wir für den Einstieg benötigen mit GCM

Android-Push-Benachrichtigungen mit Google Cloud Messaging (GCM), PHP und MySQL

Yoga Sai Krishna
quelle
10

Ich habe dies jetzt tatsächlich in einem Zweig in meinem Zend_Mobile-Baum: https://github.com/mwillbanks/Zend_Mobile/tree/feature/gcm

Dies wird mit ZF 1.12 veröffentlicht. Es sollte Ihnen jedoch einige gute Beispiele dafür geben.

Hier ist eine kurze Demo, wie es funktionieren würde ....

<?php
require_once 'Zend/Mobile/Push/Gcm.php';
require_once 'Zend/Mobile/Push/Message/Gcm.php';

$message = new Zend_Mobile_Push_Message_Gcm();
$message->setId(time());
$message->addToken('ABCDEF0123456789');
$message->setData(array(
    'foo' => 'bar',
    'bar' => 'foo',
));

$gcm = new Zend_Mobile_Push_Gcm();
$gcm->setApiKey('MYAPIKEY');

$response = false;

try {
    $response = $gcm->send($message);
} catch (Zend_Mobile_Push_Exception $e) {
    // all other exceptions only require action to be sent or implementation of exponential backoff.
    die($e->getMessage());
}

// handle all errors and registration_id's
foreach ($response->getResults() as $k => $v) {
    if ($v['registration_id']) {
        printf("%s has a new registration id of: %s\r\n", $k, $v['registration_id']);
    }
    if ($v['error']) {
        printf("%s had an error of: %s\r\n", $k, $v['error']);
    }
    if ($v['message_id']) {
        printf("%s was successfully sent the message, message id is: %s", $k, $v['message_id']);
    }
}
mwillbanks
quelle
1
OK! Das ist gut. aber wie kann ich das Token der Benutzer bekommen. Ich denke, Sie verwenden Token als Registrierungs-IDs. Wie lautet die Server-URL in meiner Android-App?
Tasomaniac
Ja, Token sind die Registrierungs-IDs. Dies liegt insbesondere daran, dass die Bibliothek versucht, etwas abstrakt zu bleiben, da sie auch APNS und MPNS implementiert. Die Server-URL ist das, was Sie am Ende machen. Dies liefert einfach den Kleber zum Senden. Sie müssen einen Bereich schreiben, in dem Sie die Registrierungs-ID veröffentlichen und irgendwo speichern würden. Von dort aus können Sie den obigen Code verwenden, um tatsächlich eine Push-Benachrichtigung an die App zu senden.
Mwillbanks
6

Viele der Tutorials sind veraltet, und selbst der aktuelle Code berücksichtigt nicht, wann Geräteregistrierungs-IDs aktualisiert oder Geräte abgemeldet werden. Wenn diese Elemente deaktiviert sind, führt dies möglicherweise zu Problemen, die den Empfang von Nachrichten verhindern. http://forum.loungekatt.com/viewtopic.php?t=63#p181

Verlassener Wagen
quelle
6

Sie können auch diesen Code ausprobieren, Quelle :

<?php
    define("GOOGLE_API_KEY", "AIzaSyCJiVkatisdQ44rEM353PFGbia29mBVscA");
    define("GOOGLE_GCM_URL", "https://android.googleapis.com/gcm/send");

    function send_gcm_notify($reg_id, $message) {
        $fields = array(
            'registration_ids'  => array( $reg_id ),
            'data'              => array( "message" => $message ),
        );

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

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, GOOGLE_GCM_URL);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

        $result = curl_exec($ch);
        if ($result === FALSE) {
            die('Problem occurred: ' . curl_error($ch));
        }

        curl_close($ch);
        echo $result;
    }

    $reg_id = "APA91bHuSGES.....nn5pWrrSz0dV63pg";
    $msg = "Google Cloud Messaging working well";

    send_gcm_notify($reg_id, $msg);
dexxtr
quelle
Ihr Code zeigt den Fehler "Problem aufgetreten: Verbindung zu 74.125.142.95 fehlgeschlagen: Berechtigung verweigert". Was ist das Problem?
user2064667
4
<?php

function sendMessageToPhone($deviceToken, $collapseKey, $messageText, $yourKey) {    
    echo "DeviceToken:".$deviceToken."Key:".$collapseKey."Message:".$messageText
            ."API Key:".$yourKey."Response"."<br/>";

    $headers = array('Authorization:key=' . $yourKey);    
    $data = array(    
        'registration_id' => $deviceToken,          
        'collapse_key' => $collapseKey,
        'data.message' => $messageText);  
    $ch = curl_init();    

    curl_setopt($ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send");    
    if ($headers)    
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    
    curl_setopt($ch, CURLOPT_POST, true);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    

    $response = curl_exec($ch);    
    var_dump($response);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);    
    if (curl_errno($ch)) {
        return false;
    }    
    if ($httpCode != 200) {
        return false;
    }    
    curl_close($ch);    
    return $response;    
}  

$yourKey = "YOURKEY";
$deviceToken = "REGISTERED_ID";
$collapseKey = "COLLAPSE_KEY";
$messageText = "MESSAGE";
echo sendMessageToPhone($deviceToken, $collapseKey, $messageText, $yourKey);
?>

Im obigen Skript ändern Sie einfach:

"YOURKEY" zum API-Schlüssel zum Serverschlüssel der API-Konsole.
"REGISTERED_ID" mit der Registrierungs-ID
"COLLAPSE_KEY" Ihres Geräts mit dem Schlüssel, den Sie
"MESSAGE" mit der Nachricht benötigen , die Sie senden möchten

Lassen Sie mich wissen, wenn Sie Probleme damit haben. Ich kann eine Benachrichtigung mit demselben Skript erfolgreich erhalten.

Ajit
quelle
2

Sie können diese auf packagist verfügbare PHP-Bibliothek verwenden:

https://github.com/CoreProc/gcm-php

Nach der Installation können Sie Folgendes tun:

$gcmClient = new GcmClient('your-gcm-api-key-here');

$message = new Message($gcmClient);

$message->addRegistrationId('xxxxxxxxxx');
$message->setData([
    'title' => 'Sample Push Notification',
    'message' => 'This is a test push notification using Google Cloud Messaging'
]);

try {

    $response = $message->send();

    // The send() method returns a Response object
    print_r($response);

} catch (Exception $exception) {

    echo 'uh-oh: ' . $exception->getMessage();

}
chrisbjr
quelle
0

Hier ist eine Bibliothek, die ich von CodeMonkeysRU gespalten habe.

Der Grund, warum ich gegabelt habe, war, dass Google ein exponentielles Backoff benötigt. Ich verwende einen Redis-Server, um Nachrichten in die Warteschlange zu stellen und nach einer festgelegten Zeit erneut zu senden.

Ich habe es auch aktualisiert, um iOS zu unterstützen.

https://github.com/stevetauber/php-gcm-queue

Steve Tauber
quelle
Hallo, können Sie mich bitte auf die für iOS vorgenommenen Änderungen hinweisen? Ich sehe im Vergleich zur Originalbibliothek nichts Besonderes.
Fralbo
@ 2ndGAB der Hauptgrund, warum ich gegabelt habe, war das exponentielle Backoff. Die iOS-Änderungen können Sie hier nachlesen: developer.google.com/cloud-messaging/…
Steve Tauber
0

Hier ist Android-Code für PHP-Code von oben von @Elad Nava gepostet

MainActivity.java (Launcher-Aktivität)

public class MainActivity extends AppCompatActivity {
    String PROJECT_NUMBER="your project number/sender id";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        GCMClientManager pushClientManager = new GCMClientManager(this, PROJECT_NUMBER);
        pushClientManager.registerIfNeeded(new GCMClientManager.RegistrationCompletedHandler() {
            @Override
            public void onSuccess(String registrationId, boolean isNewRegistration) {

                Log.d("Registration id", registrationId);
                //send this registrationId to your server
            }

            @Override
            public void onFailure(String ex) {
                super.onFailure(ex);
            }
        });
    }
}

GCMClientManager.java

public class GCMClientManager {
    // Constants
    public static final String TAG = "GCMClientManager";
    public static final String EXTRA_MESSAGE = "message";
    public static final String PROPERTY_REG_ID = "your sender id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    // Member variables
    private GoogleCloudMessaging gcm;
    private String regid;
    private String projectNumber;
    private Activity activity;
    public GCMClientManager(Activity activity, String projectNumber) {
        this.activity = activity;
        this.projectNumber = projectNumber;
        this.gcm = GoogleCloudMessaging.getInstance(activity);
    }
    /**
     * @return Application's version code from the {@code PackageManager}.
     */
    private static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            // should never happen
            throw new RuntimeException("Could not get package name: " + e);
        }
    }
    // Register if needed or fetch from local store
    public void registerIfNeeded(final RegistrationCompletedHandler handler) {
        if (checkPlayServices()) {
            regid = getRegistrationId(getContext());
            if (regid.isEmpty()) {
                registerInBackground(handler);
            } else { // got id from cache
                Log.i(TAG, regid);
                handler.onSuccess(regid, false);
            }
        } else { // no play services
            Log.i(TAG, "No valid Google Play Services APK found.");
        }
    }
    /**
     * Registers the application with GCM servers asynchronously.
     * <p>
     * Stores the registration ID and app versionCode in the application's
     * shared preferences.
     */
    private void registerInBackground(final RegistrationCompletedHandler handler) {
        new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                try {
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(getContext());
                    }
                    InstanceID instanceID = InstanceID.getInstance(getContext());
                    regid = instanceID.getToken(projectNumber, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                    Log.i(TAG, regid);
                    // Persist the regID - no need to register again.
                    storeRegistrationId(getContext(), regid);
                } catch (IOException ex) {
                    // If there is an error, don't just keep trying to register.
                    // Require the user to click a button again, or perform
                    // exponential back-off.
                    handler.onFailure("Error :" + ex.getMessage());
                }
                return regid;
            }
            @Override
            protected void onPostExecute(String regId) {
                if (regId != null) {
                    handler.onSuccess(regId, true);
                }
            }
        }.execute(null, null, null);
    }
    /**
     * Gets the current registration ID for application on GCM service.
     * <p>
     * If result is empty, the app needs to register.
     *
     * @return registration ID, or empty string if there is no existing
     *     registration ID.
     */
    private String getRegistrationId(Context context) {
        final SharedPreferences prefs = getGCMPreferences(context);
        String registrationId = prefs.getString(PROPERTY_REG_ID, "");
        if (registrationId.isEmpty()) {
            Log.i(TAG, "Registration not found.");
            return "";
        }
        // Check if app was updated; if so, it must clear the registration ID
        // since the existing regID is not guaranteed to work with the new
        // app version.
        int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
        int currentVersion = getAppVersion(context);
        if (registeredVersion != currentVersion) {
            Log.i(TAG, "App version changed.");
            return "";
        }
        return registrationId;
    }
    /**
     * Stores the registration ID and app versionCode in the application's
     * {@code SharedPreferences}.
     *
     * @param context application's context.
     * @param regId registration ID
     */
    private void storeRegistrationId(Context context, String regId) {
        final SharedPreferences prefs = getGCMPreferences(context);
        int appVersion = getAppVersion(context);
        Log.i(TAG, "Saving regId on app version " + appVersion);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(PROPERTY_REG_ID, regId);
        editor.putInt(PROPERTY_APP_VERSION, appVersion);
        editor.commit();
    }
    private SharedPreferences getGCMPreferences(Context context) {
        // This sample app persists the registration ID in shared preferences, but
        // how you store the regID in your app is up to you.
        return getContext().getSharedPreferences(context.getPackageName(),
                Context.MODE_PRIVATE);
    }
    /**
     * Check the device to make sure it has the Google Play Services APK. If
     * it doesn't, display a dialog that allows users to download the APK from
     * the Google Play Store or enable it in the device's system settings.
     */
    private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getContext());
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(),
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.i(TAG, "This device is not supported.");
            }
            return false;
        }
        return true;
    }
    private Context getContext() {
        return activity;
    }
    private Activity getActivity() {
        return activity;
    }
    public static abstract class RegistrationCompletedHandler {
        public abstract void onSuccess(String registrationId, boolean isNewRegistration);
        public void onFailure(String ex) {
            // If there is an error, don't just keep trying to register.
            // Require the user to click a button again, or perform
            // exponential back-off.
            Log.e(TAG, ex);
        }
    }
}

PushNotificationService.java (Benachrichtigungsgenerator)

public class PushNotificationService extends GcmListenerService{

    public static int MESSAGE_NOTIFICATION_ID = 100;

    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        sendNotification("Hi-"+message, "My App sent you a message");
    }

    private void sendNotification(String title, String body) {
        Context context = getBaseContext();
        NotificationCompat.Builder mBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(context)
                .setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title)
                .setContentText(body);
        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(MESSAGE_NOTIFICATION_ID, mBuilder.build());
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".PushNotificationService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="package.gcmdemo" />
        </intent-filter>
    </receiver>
</application>

Akshay Paliwal
quelle
0

benutze das

 function pnstest(){

                $data = array('post_id'=>'12345','title'=>'A Blog post', 'message' =>'test msg');

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

                $server_key = 'AIzaSyDVpDdS7EyNgMUpoZV6sI2p-cG';

                $target ='fO3JGJw4CXI:APA91bFKvHv8wzZ05w2JQSor6D8lFvEGE_jHZGDAKzFmKWc73LABnumtRosWuJx--I4SoyF1XQ4w01P77MKft33grAPhA8g-wuBPZTgmgttaC9U4S3uCHjdDn5c3YHAnBF3H';

                $fields = array();
                $fields['data'] = $data;
                if(is_array($target)){
                    $fields['registration_ids'] = $target;
                }else{
                    $fields['to'] = $target;
                }

                //header with content_type api key
                $headers = array(
                    'Content-Type:application/json',
                  'Authorization:key='.$server_key
                );

                $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_SSL_VERIFYHOST, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
                $result = curl_exec($ch);
                if ($result === FALSE) {
                    die('FCM Send Error: ' . curl_error($ch));
                }
                curl_close($ch);
                return $result;

}
Rajkumar Kumawat
quelle
0

Ich weiß, dass dies eine späte Antwort ist, aber sie kann für diejenigen nützlich sein, die ähnliche Apps mit dem aktuellen FCM-Format entwickeln möchten (GCM ist veraltet).
Der folgende PHP-Code wurde zum Senden von themenbezogenen Podcasts verwendet. Alle Apps, die bei dem genannten Kanal / Topis registriert sind, erhalten diese Push-Benachrichtigung.

<?php

try{
$fcm_token = 'your fcm token';
$service_url = 'https://fcm.googleapis.com/fcm/send';
$channel = '/topics/'.$adminChannel;
echo $channel.'</br>';
      $curl_post_body = array('to' => $channel,
        'content_available' => true,
        'notification' => array('click_action' => 'action_open',
                            'body'=> $contentTitle,
                            'title'=>'Title '.$contentCurrentCat. ' Updates' ,
                            'message'=>'44'),
        'data'=> array('click_action' => 'action_open',
                            'body'=>'test',
                            'title'=>'test',
                            'message'=>$catTitleId));

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

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $service_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($curl_post_body));

    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('FCM Send Error: ' . curl_error($ch));
        echo 'failure';
    }else{

    echo 'success' .$result;
    }
    curl_close($ch);
    return $result;

}
catch(Exception $e){

    echo 'Message: ' .$e->getMessage();
}
?>
Buben
quelle