2013-04-29 9 views
11

Mam aplikację korzystającą z powiadomień wypychanych GCM. Działa dobrze, a moje urządzenie rejestruje i odbiera wiadomości Push.GCM, jak wyrejestrować urządzenie za pomocą GCM i serwera innej firmy

Po odinstalowaniu aplikacji z mojego urządzenia przestaję odbierać wiadomości zgodnie z oczekiwaniami. TextBox, w którym wysyłasz wiadomości na serwerze, jest nadal dostępny po odinstalowaniu aplikacji, której też bym się spodziewał.

Sprawdziłem dokumentację dotyczącą wyrejestrowania i można to zrobić ręcznie lub automatycznie.

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. 

Nie rozumiem następnego stwierdzenia z powyższej listy.

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

Jak to się dzieje?

Również, jeśli aplikacja została odinstalowana z urządzenia, jak wykonać poniższe instrukcje? Czy istnieje metoda cyklu życia aplikacji, która jest uruchamiana, gdy aplikacja jest usuwana z urządzenia? Jeśli tak, to czy jest to miejsce, w którym umieszczony jest kod informujący serwer GCM o dezinstalacji i wywołuje skrypt php na serwerze zewnętrznym, który usuwa identyfikator REGID z DB?

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

góry dzięki,

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

[EDIT2] Kod wyrejestrować poniżej jest wyrejestrowanie urządzenia na 3 strony serwera po usunięciu aplikacji z telefonu. Kod jest uzupełnieniem poniższego samouczka.

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


    } 

Odpowiedz

14

Gdy serwer GCM próbuje wysłać wiadomość do urządzenia po Aplikacja została odinstalowana, UMK klient wykrywa, że ​​ta aplikacja nie jest już zainstalowana na urządzeniu. Nie robisz tego w swoim kodzie aplikacji. Składnik klienta GCM systemu operacyjnego Android to robi.

Następnym razem, gdy spróbujesz wysłać wiadomość do aplikacji na urządzeniu, które ją odinstalowało, serwer GCM będzie już wiedział, że został odinstalowany i wyśle ​​Ci błąd NotRegistered.

Nie ma metody cyklu życia wywoływanej po usunięciu aplikacji z urządzenia. Gdyby tak było, nie potrzebowałbyś sekwencji zdarzeń wymienionych powyżej, aby serwer GCM i serwer zewnętrzny wykryły, że aplikacja została odinstalowana (ponieważ mogłeś użyć takiej metody zarówno do wyrejestrowania aplikacji z Serwer GCM i powiadomienie serwera zewnętrznego o tym, że aplikacja została odinstalowana z tego urządzenia).

+0

ok dzięki, więc w którym momencie chciałbym poinformować serwer zewnętrzny o identyfikatorze REGID do usunięcia? Jeśli po prostu usunę aplikację z urządzenia, nie zapisuję kodu w moim [edit1] w którymś momencie, który mógłby przekazać regID do pliku php, który usuwa regID z DB? – turtleboy

+0

Nie ma za co. Ty nie. Nie masz możliwości dowiedzenia się, kiedy aplikacja została odinstalowana, więc nie masz możliwości dowiedzenia się, kiedy wywołać ten kod.Jedyny przypadek, w którym powinieneś wywołać ten kod, to sytuacja, w której chcesz przestać wysyłać wiadomości GCM do aplikacji, mimo że jest ona nadal zainstalowana na urządzeniu. Jeśli aplikacja zostanie odinstalowana, serwer zewnętrzny będzie wiedział, aby usunąć identyfikator REGID po otrzymaniu błędu "NotRejestracja" po próbie wysłania wiadomości na to urządzenie. – Eran

+0

Cześć, rozumiem, co mówisz, ale wciąż czuję się trochę po ciemku w związku z tutorialem, którego przestrzegałem. Moim zdaniem, myślę, że w samouczku może brakować pliku, który obsługuje usuwanie identyfikatora regID z bazy danych innego producenta. Mówisz, że serwery GCM informują serwer zewnętrzny o usunięciu identyfikatora regID z bazy danych, ale nie ma odpowiedniego pliku php, który mógłby to zrobić. Jeśli masz czas, możesz szybko przejrzeć pliki php i sprawdzić, co myślę o brakującym pliku wyrejestrowania. – turtleboy