使用 PHP 的 Google 云消息传递 (GCM)

Posted

技术标签:

【中文标题】使用 PHP 的 Google 云消息传递 (GCM)【英文标题】:Google cloud messaging (GCM) with PHP 【发布时间】:2016-09-15 07:59:53 【问题描述】:

我正在尝试使用 php 发送推送通知。 问题是,如何在浏览器中注册 service worker 并直接从 PHP 发送通知。

我得到了后端部分的代码示例:

    <?php
        define( 'API_ACCESS_KEY', 'SOME KEY' );
        $registrationIds = array('fK_LVMivilI:APA91bHCXawEoNXc0Avwk4F6iYsshn4mmWX6jysrg8gC9PGA6_AlqWtr1HXhIMonCCUj8syOlsDGTFJVu_T3aPqdMNynqy7SY5L9OBlgolu-7L2a5pwZrB7kN_bdnUPeZHJQ1HT2i2ed');
        $msg = array
        (
            'message'   => 'here is a message. message',
            'title'     => 'This is a title. title',
            'subtitle'  => 'This is a subtitle. subtitle',
            'tickerText'    => 'Ticker text here...Ticker text here...Ticker text here',
            'vibrate'   => 1,
            'sound'     => 1,
            'largeIcon' => 'large_icon',
            'smallIcon' => 'small_icon'
        );
        $fields = array
        (
            'registration_ids'  => $registrationIds,
            'data'          => $msg
        );

        $headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );

        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
        echo $result;

当我尝试运行此脚本时,我收到以下错误:

"multicast_id":7003820144951503575,"success":0,"failure":1,"canonical_ids":0,"results":["error":"NotRegistered"]

我猜是因为浏览器中没有注册服务工作者。

因此,如果需要,我需要一些解决方案来使用 PHP 和 javascript 发送带有动态内容的通知。

任何建议。

【问题讨论】:

检查您的注册ID。对吗? 【参考方案1】:

查看documentation,了解如何在实现推送消息时注册 Service Worker。这里指出,有一个 service worker 来为 web 实现推送消息是有依赖性的。这样做的原因是,当接收到推送消息时,浏览器可以启动一个 service worker,它在后台运行而不打开页面,并调度一个事件,以便您可以决定如何处理该推送消息。

这是用于此的示例代码。

var isPushEnabled = false;

…

window.addEventListener('load', function()  
var pushButton = document.querySelector('.js-push-button'); 
pushButton.addEventListener('click', function()  
if (isPushEnabled)  
unsubscribe(); 
 else  
subscribe(); 
 
);

// Check that service workers are supported, if so, progressively 
// enhance and add push messaging support, otherwise continue without it. 
if ('serviceWorker' in navigator)  
navigator.serviceWorker.register('/service-worker.js') 
.then(initialiseState); 
 else  
console.warn('Service workers aren\'t supported in this browser.'); 
 
);

有关 Service Worker 的更多信息,请查看以下教程:

PUSH NOTIFICATIONS ON THE WEB - GOOGLE CHROME

WEB PUSH NOTIFICATION WITH SERVICE WORKER

mybb-gcm-push-notifications/service-worker.js.php

【讨论】:

我的主要问题是从我的 PHP 后端发送数据并填写服务人员通知。

以上是关于使用 PHP 的 Google 云消息传递 (GCM)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google 云消息传递和服务工作者的桌面推送通知

Google 云消息传递实例 ID 是永久的还是临时的?

如何将 Azure 通知 REST API 与 Google 云消息传递一起使用

适用于 iOS 应用的 GCM(Google 云消息传递)

Firebase 与 Android Java 中的 Google 云消息传递

为 Google 云消息传递设置服务器端和客户端