11

我有一个使用 GCM 推送通知的应用程序。它工作正常,我的设备注册并接收推送消息。

如果我从我的设备上卸载该应用程序,我将不再像您预期的那样收到消息。在我卸载应用程序后,您在服务器上发送消息的文本框仍然存在,这也是我所期望的。

我查看了有关取消注册的文档,您可以手动或自动进行。

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.

我不明白上面列表中的倒数第二个语句。

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

这是如何实现的?

另外,如果从设备上卸载了该应用程序,它如何执行以下语句?是否有在从设备中删除应用程序时执行的应用程序生命周期方法?如果有,这是放置代码的地方,通知 GCM 服务器卸载并调用 3rd 方服务器上的 php 脚本从数据库中删除 regID?

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

提前致谢,

马特

[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] 下面的注销代码用于在从手机中删除应用程序后在 3rd 方服务器上注销设备。该代码是对下面教程的补充。

教程

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


    }
4

1 回答 1

14

当 GCM 服务器在应用卸载后尝试向设备发送消息时,GCM 客户端检测到该应用不再安装在设备上。您不在应用程序代码中执行此操作。Android 操作系统的 GCM 客户端组件可以做到这一点。

下次尝试向卸载它的设备上的应用程序发送消息时,GCM 服务器将已经知道它已被卸载,并将NotRegistered错误发送给您。

从设备中删除应用程序时不会调用生命周期方法。如果有,您将不需要上面引用的事件序列,以便 GCM 服务器和第 3 方服务器检测到应用程序已卸载(因为您可以使用这种方法从GCM 服务器并让第 3 方服务器知道该应用程序已从该设备上卸载)。

于 2013-04-29T12:56:14.067 回答