2013-04-29 10 views
11

Ich habe eine App, die GCM Push-Benachrichtigungen verwendet. Es funktioniert gut und mein Gerät registriert und empfängt Push-Nachrichten.GCM Wie melde ich ein Gerät mit GCM und 3rd Party Server

Wenn ich die App von meinem Gerät deinstalliere, erhalte ich die Nachrichten nicht mehr wie erwartet. Die TextBox, in der Sie Nachrichten auf dem Server senden, ist immer noch da, nachdem ich die App entfernt habe, was ich auch erwarten würde.

Ich habe die Dokumentation über die Aufhebung der Registrierung und Sie können es manuell oder automatisch tun.

The end user uninstalls the application. 
The 3rd-party server sends a message to GCM server. 
The GCM server sends the message to the device. 
The GCM client receives the message and queries Package Manager about whether there are broadcast receivers configured to receive it, which returns false. 
The GCM client informs the GCM server that the application was uninstalled. 
The GCM server marks the registration ID for deletion. 
The 3rd-party server sends a message to GCM. 
The GCM returns a NotRegistered error message to the 3rd-party server. 
The 3rd-party deletes the registration ID. 

Ich verstehe nicht die vorletzte Aussage in der obigen Liste.

The GCM returns a NotRegistered error message to the 3rd-party server. 

Wie wird das erreicht?

Auch wenn die App vom Gerät deinstalliert wird, wie kann es die folgende Aussage tun? Gibt es eine App-Lebenszyklusmethode, die ausgeführt wird, wenn eine App von einem Gerät entfernt wird? Wenn dies der Fall ist, ist dies der Ort, an dem Code platziert wird, der den GCM-Server über die Deinstallation informiert und ein php-Skript auf dem 3rd-Party-Server aufruft, das die reg-ID aus der Datenbank entfernt?

The GCM client informs the GCM server that the application was uninstalled. 

Vielen Dank im Voraus,

Matt

[edit1] 

static void unregister(final Context context, final String regId) { 
     Log.i(TAG, "unregistering device (regId = " + regId + ")"); 
     String serverUrl = SERVER_URL + "/unregister.php"; 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("regId", regId); 
     try { 
      post(serverUrl, params); 
      GCMRegistrar.setRegisteredOnServer(context, false); 
      String message = context.getString(R.string.server_unregistered); 
      CommonUtilities.displayMessage(context, message); 
     } catch (IOException e) { 
      // At this point the device is unregistered from GCM, but still 
      // registered in the server. 
      // We could try to unregister again, but it is not necessary: 
      // if the server tries to send a message to the device, it will get 
      // a "NotRegistered" error message and should unregister the device. 
      String message = context.getString(R.string.server_unregister_error, 
        e.getMessage()); 
      CommonUtilities.displayMessage(context, message); 
     } 
    } 

[EDIT 2] Der austragen Code unten ist das Gerät auf dem 3rd-Party-Server für die Deregistrierung nach der App aus dem Telefon zu löschen. Der Code ist zusätzlich zum folgenden Tutorial.

tutorial

send_messages.php

<?php 
if (isset($_GET["regId"]) && isset($_GET["message"])) { 
    $regId = $_GET["regId"]; 
    $message = $_GET["message"]; 
    $strRegID = strval($regId); 

    include_once './GCM.php'; 
    include_once './db_functions.php'; 
    $gcm = new GCM(); 

    $registatoin_ids = array($regId); 
    $message = array("price" => $message); 

    $result = $gcm->send_notification($registatoin_ids, $message); 
    $db = new db_Functions(); 

    if (strcasecmp (strval($result) , 'NotRegistered')) { 
    $db->deleteUser($strRegID); 
    } 
} 
?> 

db_functions.php

public function deleteUser($regid) { 

    $strRegID = strval($regid); 

    $serverName = "LOCALHOST\SQLEXPRESS"; 
     $uid = "gcm";  
     $pwd = "gcm";  
     $databaseName = "gcm"; 

     $connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>$databaseName); 


      $db = sqlsrv_connect($serverName,$connectionInfo) or die("Unable to connect to server"); 

      $query = "DELETE FROM gcmUser2 WHERE gcuRegID = '$regid'"; 
      $result = sqlsrv_query($db, $query); 


    } 

Antwort

14

Wenn der GCM-Server versucht, die Nachricht an das Gerät zu senden, nachdem die Anwendung deinstalliert wurde, das GCM Der Client erkennt, dass diese App nicht mehr auf dem Gerät installiert ist. Sie tun es nicht in Ihrem Anwendungscode. Die GCM-Client-Komponente des Android OS tut es.

Wenn Sie das nächste Mal versuchen, eine Nachricht an die App auf dem Gerät zu senden, von dem es deinstalliert wurde, weiß der GCM-Server bereits, dass er deinstalliert wurde und sendet Ihnen den Fehler NotRegistered.

Es gibt keine Lebenszyklusmethode, die aufgerufen wird, wenn die App vom Gerät entfernt wird. Wenn dies der Fall wäre, würden Sie die oben beschriebene Reihenfolge der Ereignisse nicht benötigen, damit der GCM-Server und der Drittanbieter-Server erkennen, dass die App deinstalliert wurde (da Sie mit dieser Methode sowohl die Registrierung der App als auch die der App aufgehoben haben könnten GCM-Server und damit der Drittanbieter-Server weiß, dass die App von diesem Gerät deinstalliert wurde).

+0

ok danke, also an welchem ​​Punkt würde ich den 3rd-Party-Server mit der regID zu löschen? Wenn ich nur die App vom Gerät lösche shold nicht der Code in meinem [edit1] ausgeführt zu einem Zeitpunkt, der die regID an eine PHP-Datei übergeben könnte, die die regID aus der DB löscht? – turtleboy

+0

Gern geschehen. Du nicht. Sie haben keine Möglichkeit zu wissen, wann die App deinstalliert wird, so dass Sie nicht wissen, wann Sie diesen Code aufrufen sollen.Der einzige Fall, in dem Sie diesen Code aufrufen sollten, ist, wenn Sie ein Szenario haben, in dem Sie keine GCM-Nachrichten mehr an die App senden möchten, obwohl diese noch auf dem Gerät installiert ist. Wenn die App deinstalliert wird, weiß der 3rd-Party-Server, dass er die reg-ID löscht, wenn er den Fehler "NotRegistered" erhält, nachdem er versucht hat, eine Nachricht an dieses Gerät zu senden. – Eran

+0

Hallo, ich verstehe, was Sie sagen, aber ich fühle mich immer noch ein wenig im Dunkeln über das Tutorial, dem ich gefolgt bin. Meiner Meinung nach, kann es sein, dass im Tutorial eine Datei fehlt, die das Löschen der regID von der Datenbank des 3rd-Party Servers behandelt. Sie sagen, dass GCM-Server dem 3rd-Party-Server mitteilen, die reg-ID aus der DB zu löschen, aber es gibt keine entsprechende php-Datei, die dies tun könnte. Wenn du Zeit hast, könntest du dir die php-Dateien ansehen und vielleicht verifizieren, was ich über eine fehlende Unregister-Datei denke – turtleboy