GCM 如何使用 GCM 和第 3 方服务器取消注册设备

2023-11-22

我有一个使用 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.

提前致谢,

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

[编辑2] 下面的注销代码用于在从手机中删除应用程序后在第 3 方服务器上注销设备。该代码是对下面教程的补充。

tutorial

发送消息.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);


    }

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCM 如何使用 GCM 和第 3 方服务器取消注册设备 的相关文章

随机推荐

  • 如何为设置包(Root.plist)的文本字段提供占位符

    我想为设置包 Root plist 的文本字段提供占位符 是否可以 如果可以 如何 提前致谢 恐怕目前这是不可能的 我也试图这样做 但似乎找不到任何可行的解决方案 如果有帮助 应该放置此内容的官方文档是here
  • 短路与非短路操作员

    我理解下面的区别 至少对于Java if true false short circuiting boolean operator if true false non short circuiting boolean operator 但我
  • 什么时候需要 ScriptManager/ScriptManagerProxy?

    我认为我无法找到明确的答案 所以我会在这里问 什么时候需要 ScriptManager 或者在母版页上使用 ScriptManager 的情况下需要 ScriptManagerProxy 例如 假设我在 MasterPage 上有一个 Sc
  • pywin32 和 Excel。写入大量数据时出现异常

    我目前正在尝试使用 pywin32 库将大量数据写入 Excel 电子表格 作为我面临的问题的一个简单示例 使用以下代码生成 1000 个单元格 x 1000 个单元格的乘法表 import win32com client from win
  • 在管道处理期间可以从 spaCy 文档中删除令牌吗?

    我正在使用 spaCy 一个很棒的 Python NLP 库 来处理许多非常大的文档 但是 我的语料库中有一些我想在文档处理管道中消除的常见单词 有没有办法从管道组件内的文档中删除令牌 spaCy 的标记化是非破坏性的 因此它始终代表原始输
  • 从项目内的 JSON 文件读取

    我有一个名为资源在我的 WPF 项目中 我有一个设置 json在该目录内 我想从该文件中读取内容 在文件设置中我有构建操作 gt 嵌入资源 and 复制到输出目录 gt 始终复制我读了这样的文件 using StreamReader r n
  • MVC3 打开视图编译后出现奇怪的错误

    我目前正在使用 Razor 开发 MVC3 项目 我已经打开视图编译 以在编译时注意拼写错误等 一旦我在项目配置文件中打开 true 就会在编译过程中出现以下错误 错误1 在应用程序级别之外使用注册为allowDefinition Mach
  • d3 Sankey - 是否有可能影响或决定节点的放置?

    我正在使用 d3 js 的 Sankey 插件 有没有办法影响节点的自动放置 如果你比较下面两张图片 自动生成桑基图 https files secureserver net 0s3DEU5s3OZtqL 我手动重新排列后 https fi
  • 使用 RNDADDDENTROPY 将熵添加到 /dev/random

    我有一个设备会产生一些噪音 我想将其添加到嵌入式 Linux 系统中 dev random 设备的熵池中 我正在读 dev random 上的手册页我不太理解您传递给 RNDADDENTROPY ioctl 调用的结构 RNDADDENTR
  • Ruby 无需 eval 即可进行评估?

    如何在不使用 eval 的情况下评估数学字符串 Example mathstring 3 3 无论如何 可以在不使用 eval 的情况下进行评估吗 也许有正则表达式的东西 您必须或者eval它 或者解析它 既然你不想eval mathstr
  • com.android.ddmlib.SyncException:是一个目录

    当我尝试使用 Android Studio 中的 运行 按钮在我的设备上运行某个应用程序时 出现以下错误 12 16 15 05 27 Launching app adb push Users me myproject app build
  • 如何构建谷歌breakpad

    我完全不知道如何构建谷歌的breakpad 有一个 sln 文件 但它依赖于一个似乎没有关联 sln 的库 它似乎使用了一种叫做 gyp 的东西 我还没弄清楚如何开始工作 我试过 python gyp breakpad src client
  • Angular 7 项目无法在 Internet Explorer 11 中运行

    我已经通过互联网完成了不同帖子中提到的所有操作 但我的问题仍然存在 我取消了 IE 9 10 11 所需的 polyfill 的注释 IE9 IE10 and IE11 requires all of the following polyf
  • 如何在 OpenLayers-3 中使用 SVG 图像作为地图标记?

    我正在尝试使用 SVG 图像在 OpenLayers 3 OL3 中创建地图 针滴 即地图标记 目前 我使用 PNG 图像作为引用 ol style Icon 源 src 属性的 pindrop 效果很好 但是 使用 SVG 图像时会失败
  • 在 C++ 中搜索并插入具有 3 个元素的映射

    我需要一张这样的地图 typedef std map
  • 在 swagger 中过滤 API 部分

    我有一个 REST API 和 springfox swagger v2 6 1 并正在运行 但现在 我不想总是显示我拥有的所有控制器 因为其中一些控制器技术性很强 不适合普通用户 但我希望能够选择我显示的内容 而无需重新编译代码 页面顶部
  • laravel Livewire 线:单击不触发该功能

    我想用 laravel livewire 做一个 SPA 我想使用wire click 来触发组件中的一个函数 但它不起作用 如果代码混乱 请原谅 这是我第一次在这里发布 我不确定要发布什么这是我的代码来解决这些问题谢谢 main blad
  • 使用 h5py 将光栅图像添加到 HDF5 文件

    如果这是一个新手问题 我很抱歉 但我对 Python 和 HDF5 相当陌生 我正在使用 h5py numpy 和 Python 2 7 我有来自各种文件的数据需要导入到一个 HDF5 文件中 每个文件的数据将存储在不同的组中 每个组都需要
  • SKView 和 SKScene 有什么区别

    来自苹果文档 SK视图 SKView 对象是显示 Sprite Kit 内容的视图 此内容由 SKScene 对象提供 SK场景 SKScene 对象代表 Sprite Kit 中的内容场景 有什么不同 SKScene 类似于视图控制器 S
  • GCM 如何使用 GCM 和第 3 方服务器取消注册设备

    我有一个使用 GCM 推送通知的应用程序 它工作正常 我的设备注册并接收推送消息 如果我从设备上卸载该应用程序 我将不再像您期望的那样收到消息 在我卸载应用程序后 您在服务器上发送消息的文本框仍然存在 这也是我所期望的 我查看了有关取消注册