使用 GCM 向多个 Android 设备发送推送通知

2024-02-18

我正在关注http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/?通过 GCM 发送推送通知。一切正常,但是,我只能将推送通知发送到一台设备。注册另一个设备会替换之前设备的注册 ID。我尝试了 Shardool 提供的解决方案http://javapapers.com/android/android-multicast-notification-using-google-cloud-messaging-gcm/ http://javapapers.com/android/android-multicast-notification-using-google-cloud-messaging-gcm/?但它不起作用。

任何建议都会有很大帮助。

这是我的gcm.php注册设备并发送推送通知的代码,但仅限于最近注册的单个设备。

gcm.php

<?php
//generic php function to send GCM push notification
function sendPushNotificationToGCM($registatoin_ids, $message) {
    //Google cloud messaging GCM-API url
    $url = 'https://android.googleapis.com/gcm/send';
    $fields = array(
        'registration_ids' => $registatoin_ids,
        'data' => $message,
    );
    // Google Cloud Messaging GCM API Key
    define("GOOGLE_API_KEY", "MY_KEY");       
    $headers = array(
        'Authorization: key=' . GOOGLE_API_KEY,
        'Content-Type: application/json'
    );
    $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_POSTFIELDS, json_encode($fields));
    $result = curl_exec($ch);             
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
    curl_close($ch);
    return $result;
}
?>
<?php
//this block is to post message to GCM on-click
$pushStatus = "";   
if ( ! empty($_GET["push"])) { 
    $gcmRegID  = file_get_contents("GCMRegId.txt");
    $pushMessage = $_POST["message"];   
    if (isset($gcmRegID) && isset($pushMessage)) {      
        $gcmRegIds = array($gcmRegID);
        $message = array("m" => $pushMessage);  
        $pushStatus = sendPushNotificationToGCM($gcmRegIds, $message);
    }       
}
//this block is to receive the GCM regId from external (mobile apps)
if ( ! empty($_GET["shareRegId"])) {
    $gcmRegID  = $_POST["regId"]; 
    file_put_contents("GCMRegId.txt",$gcmRegID);
    echo "Ok!";
    exit;
}   
?>
<html>
    <head>
        <title>Google Cloud Messaging (GCM) Server in PHP</title>
    </head>
    <body>
        <h1>Google Cloud Messaging (GCM) Server in PHP</h1> 
        <form method="post"   action="gcm.php/?push=1">                                              
            <div>                                
                <textarea rows="2" name="message" cols="23" placeholder="Message to transmit via   GCM"></textarea>
            </div>
            <div><input type="submit"  value="Send Push Notification via GCM" /></div>
        </form>
        <p><h3><?php echo $pushStatus; ?></h3></p>        
    </body>
</html>

请告诉我如何存储多个设备注册 IDGCMRegid.txt并向每个注册设备发送通知


这里我使用 mysql 重写了 php,而不是从文件中检索密钥。在这种情况下,我检索所有regIds从表中将它们放入一个数组中,并将其传递给 sendPushNotification 函数以将消息推送给所有人。这里有 2 个文件,一个用于连接数据库,一个用于 GCM:

连接.php:

<?php

    $db_host = "localhost";
    $db_user = "root"; //change to your database username, it is root by default
    $db_pass = '';     //change to your database password, for XAMPP it is nothing for WAMPP it is root
    $db_db = 'gcmFirst'; //change to your database name

    if(!@mysql_connect($db_host, $db_user, $db_pass) || !@mysql_select_db($db_db)) {
        die('couldnt connect to database ' .mysql_error());
    }

?>

gcm.php

<?php
require 'connect.php';

function sendPushNotification($registration_ids, $message) {

    $url = 'https://android.googleapis.com/gcm/send';
    $fields = array(
        'registration_ids' => $registration_ids,
        'data' => $message,
    );

    define('GOOGLE_API_KEY', 'AIzaSyCjctNK2valabAWL7rWUTcoRA-UAXI_3ro');

    $headers = array(
        'Authorization:key=' . GOOGLE_API_KEY,
        'Content-Type: application/json'
    );
    echo json_encode($fields);
    $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_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

    $result = curl_exec($ch);
    if($result === false)
        die('Curl failed ' . curl_error());

    curl_close($ch);
    return $result;

}

$pushStatus = '';

if(!empty($_GET['push'])) {

    $query = "SELECT regId FROM users";
    if($query_run = mysql_query($query)) {

        $gcmRegIds = array();
        while($query_row = mysql_fetch_assoc($query_run)) {

            array_push($gcmRegIds, $query_row['regId']);

        }

    }
    $pushMessage = $_POST['message'];
    if(isset($gcmRegIds) && isset($pushMessage)) {

        $message = array('message' => $pushMessage);
        $pushStatus = sendPushNotification($gcmRegIds, $message);

    }   
}

if(!empty($_GET['shareRegId'])) {

    $gcmRegId = $_POST['regId'];
    $query = "INSERT INTO users VALUES ('', '$gcmRegId')";
    if($query_run = mysql_query($query)) {
        echo 'OK';
        exit;
    }   
}
?>

<html>
    <head>
        <title>Google Cloud Messaging (GCM) Server in PHP</title>
    </head>
    <body>
    <h1>Google Cloud Messaging (GCM) Server in PHP</h1>
    <form method = 'POST' action = 'gcm.php/?push=1'>
        <div>
            <textarea rows = 2 name = "message" cols = 23 placeholder = 'Messages to Transmit via GCM'></textarea>
        </div>
        <div>
            <input type = 'submit' value = 'Send Push Notification via GCM'>
        </div>
        <p><h3><?php echo $pushStatus ?></h3></p>
    </form>
    </body>
</html>

您所要做的就是创建一个数据库,其中包含一个用户表,其中包含 id、regId 和 name 作为列。

希望这就是您正在寻找的

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

使用 GCM 向多个 Android 设备发送推送通知 的相关文章

  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Android Studio更新到1.5后Gradle错误

    今天我已将 Android Studio 更新到 v1 5 我的 libgdx 项目在这次更新之前运行良好 现在我收到此错误消息 Error Unable to load class org gradle mvn3 org sonatype
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • 无法获取 Facebook 传入请求

    我正在尝试在我的 Facebook android 游戏应用程序中实现发送数据并接受该数据 我正在关注https developers facebook com docs android send requests notification
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • Android - 如何更改 TimePicker 中的文本颜色?

    我正在使用 TimePicker 到 LinearLayout 中 背景颜色 黑色 但是 我看不到 TimePicker 中的数字 并且我需要在布局中将背景颜色设置为黑色 如何更改 TimePicker 中的 textColor 我已经尝试
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 从字符串中获取数字

    我有一个字符串 例如 lorem 110 ipusm 我想获取 110 我已经尝试过这个 preg match all 0 9 string ret 但这正在返回 Array 0 gt 1 1 gt 1 2 gt 0 我想要这样的东西 Ar
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function

随机推荐

  • 与 Backbone 交换视图?

    我环顾四周 但尚未找到解决以下问题的好方法 我有一个主干视图绑定到页面上的 el 它是传统意义上的 侧边栏 的容器元素 为了解释起见 这个侧边栏元素的inner html需要根据路线完全改变 然而 页面上的位置永远不会改变 并且将始终填充此
  • 缩略图和图像编号

    我正在使用 FancyBox 来显示组成一本书的大量页面 我使用 Fancybox 是因为它似乎是我尝试过的无数图库插件中唯一一个能够以合理的方式处理大于屏幕的图像的插件 我使用缩略图是因为我希望能够跳过图像 例如从图像 1 到图像 30
  • AWS Lambda - 在 Spring Boot 处理程序中注入 Spring Bean

    我已将一个简单的 Spring Boot 项目上传到 Amazon Lambda 目前正在尝试测试它 它可以 100 工作 但当我尝试注入 Spring Bean 时 我得到一个空指针 这是我的 LambdaHandler 代码 packa
  • 更改导航栏的字体

    这个问题很简单 但不幸的是答案并非如此 如何更改文本中的字体UINavigationBar 从 iOS 7 及更高版本开始 NSShadow shadow NSShadow new shadow shadowOffset CGSizeMak
  • SunTlsRsaPremasterSecret KeyGenerator 不可用

    当我的应用程序尝试从 JAVA 加载 RSA 算法提供程序类时 我遇到错误 异常堆栈如下 javax jms JMSException RSA premaster secret error at org apache activemq ut
  • Django1.9:'function'对象没有属性'_meta'

    Django 给出错误信息 形式 py from django import forms from django contrib auth import authenticate get user model login logout fr
  • 这个复杂的查询该怎么做呢?

    这是我的数据库架构 Post id title body date Tag id title Post Tag id id post id tag Comment id id post body date 帖子和标签之间存在多对多的关系 我
  • java.text.ParseException:无法解析的日期

    我在尝试以下代码时遇到解析异常 String date Sat Jun 01 12 53 10 IST 2013 SimpleDateFormat sdf new SimpleDateFormat MMM d yyyy HH mm ss D
  • 在 SQL 中选择连续数字

    这感觉很简单 但我在任何地方都找不到答案 我正在尝试按一天中的每个小时运行查询 所以我正在做一个Group By在小时部分 但并非所有小时都有数据 因此存在一些间隙 我想每小时显示一次 无论是否有数据 这是一个示例查询 SELECT DAT
  • 使用 unison 同步包含 git 存储库的目录

    我想在两台机器上同步包含我的点文件的 git 存储库的目录 两台机器都会对存储库中的文件进行更改 通常我使用一致来同步目录 但在这种情况下 文件在 git即使目录内容表面上相同 目录也会有所不同 Unison见状举手退出 unison do
  • 纤维与异步等待

    我正在加入一个 C 项目 其中开发人员大量使用Fibers https en wikipedia org wiki Fiber computer science 在这个项目之前我什至没有听说过它们并且以前使用过async await and
  • 重复消息之间的时间间隔

    根据 SQS 的文档 重点是我的 Amazon SQS 将消息副本存储在多个服务器上 以实现冗余和高可用性 在极少数情况下 当您接收或删除邮件时 存储邮件副本的服务器之一可能不可用 如果发生这种情况 该消息的副本将不会在该不可用的服务器上被
  • 如何在Spring Cloud Netflix eureka上注册Spring Boot微服务?

    我们计划使用 Spring Cloud Netflix oss 组件 所以我正在做一个小样本项目 我开发了 2 个 Spring 微服务 这些服务运行良好http localhost 9000 microsvc one http local
  • MySQL数据导出变化次数

    我有一些用于数据库的备份和恢复脚本 该表有一个时间戳字段 备份脚本如下所示 mysqldump u user ppass database tab fields terminated by skip comments table 它创建两个
  • Django SECURE_SSL_REDIRECT 和 301 HTTP 响应

    在与本地不同的环境中 我设置DJ SSL REDIRECT True对于我的 Django 项目 但现在 当我在另一个环境 例如 在 Travis CI 中 中运行时 与 REST API 端点相关的所有单元测试都失败了 发生的情况是所有
  • InkCanvas 的撤消/重做命令堆栈

    我正在使用 InkCanvas 创建类似绘画的应用程序 我愿意实现撤消 和我的应用程序中的重做功能 哪种是为 InkCanvas 实现撤消 重做的最佳方法 我已经为 WPF 应用程序实现了撤消 重做 并最终将我的撤消 重做代码发布到http
  • 完成 GeneratorDataset 迭代器时发生错误:已取消:操作已取消

    在运行具有使用tensorflow 2 0的代码的kubeflow管道时 每个纪元结束时显示以下错误 W tensorflow core kernels data generator dataset op cc 103 完成 Generat
  • 如何修复这个 ES6 模块循环依赖?

    编辑 有关更多背景 另请参阅ES 讨论 讨论 https esdiscuss org topic how to solve this basic es6 module circular dependency problem 我有三个模块A
  • 删除级联时不触发触发器

    我有一个名为 player instance 的表 然后是一个名为 penalties 的表 其中有一个引用player instance的外键 我还有一个名为 分数 的表 我有一个关于处罚的删除触发器 这样如果删除一行 那么它将改变分数中
  • 使用 GCM 向多个 Android 设备发送推送通知

    我正在关注http javapapers com android google cloud messaging gcm for android and push notifications http javapapers com andro