推送通知如何工作?

Posted

技术标签:

【中文标题】推送通知如何工作?【英文标题】:How do push notifications work? 【发布时间】:2012-07-20 12:33:21 【问题描述】:

我正在尝试在我的基于 php 的网站上实现推送通知。目标是制作类似于 *** 和其他网站的东西,它们会在用户收到消息时实时通知用户。

我使用 mysql 作为我的数据库,Apache 作为我的服务器,并且正在考虑使用 Amazon-SNS 作为这些通知的框架,因为这似乎是该服务的目的。

我从文献中很难理解如何以编程方式设置 sending.phpreceiving.php 页面。我假设sending.php 页面只涉及到某个页面的$_POST['message'],但从那里我真的迷路了。

如果有什么可以帮助我理解receiving.php 页面对于推送通知的外观,我将不胜感激。

【问题讨论】:

@VirendraRajput,哦,太棒了,谢谢,看起来很有趣,让我看看.... @VirendraRajput,所以从caniuse.com 来看,浏览器似乎部分支持 websockets。我刚刚在我的 iPhone 上测试了这个演示,它可以工作。您能否对其他平台发表评论(Caniuse 表示不支持 android 版本,这是一种灾难)?也只在 IE10 上工作而不是更早的工作也不是很好。这些情况有后备方案吗? 【参考方案1】:

工作

html5rocks 提供了一个很好的解释 here,关于 websockets 的工作原理。

你可以为支持它的浏览器使用 Websockets(因为所有现代浏览器都提供了很好的支持)

开始

您可以从以下几个资源开始:

HTML5rocks

Nettuts+

Nettuts+ 提供了一个很好的 websockets 入门教程。

For Browsers Supporting Websockets

后备

您可以使用Modernizr 来检测客户端的浏览器是否支持 websockets,作为后备,您可以使用 flash 代替 Websockets。

对于那些项目,当在没有 WebSockets 或禁用它的浏览器上运行时,将使用web-socket-js。它的效率将低于原生,但仍比长轮询低得多。

任何带有 Flash 的浏览器都可以使用 web-socket-js shim/polyfill 支持 WebSocket。

参考:

Alternative to WebSockets

https://softwareengineering.stackexchange.com/questions/33713/is-there-an-alternative-to-html-web-sockets-now-that-firefox-4-has-disabled-the

【讨论】:

-@VirendraRajput,感谢您的回答。好的,现在我明白了pusher.com 使用带有 Flash 后备的 WebSockets。我想主要是服务是否太贵。我现在也看到了socket.io,但要使用它,我必须弄清楚如何将 node.js 连接到我的应用程序和 Apache 服务器/mysql 数据库。 你不需要使用socket.io,因为你需要使用Node.js!好吧,您可以使用 Modernizr 库来检测用户浏览器是否支持 websockets 并退回到 flash!留意更新的答案。 谢谢!如果您发现答案有用 - 您可能想接受它 -@Virendra 谢谢,但它没有解释receiving.php 的样子。我知道这些概念,而不是代码的样子。另外,我对 Amazon SNS 特别感兴趣,因为我将 AWS 用于他们的其他服务,而且与 pusher.com 和 pubnub.com 相比,它更便宜。 @Sameer 对 Pusher 仍然非常满意。 SNS 不提供棘手/耗时的部分,即 Websockets(带有 Flash 回退的 JS)。如果您有时间和金钱在您的可能上构建它是有道理的(除非您是 facebook 或其他大公司),但它很难击败 Pusher 的易用性。【参考方案2】:

我只是想分享我使用的实际实现。我决定使用出色的 SAAS,Pusher,因为在实施推送通知时存在许多具有挑战性的问题,正如我在阅读 @Virendra 的优秀答案中的链接时意识到的那样,Pusher 可以为您解决。

最让我印象深刻的是,您只需编写很少的代码即可完成这项工作。见下文。 我的服务器端是 PHP (Pusher has libraries in many languages)。

require('/application/thirdParty/pusher-html5-realtime-push-notifications/lib/squeeks-Pusher-PHP/lib/Pusher.php');
require('/application/thirdParty/pusher-html5-realtime-push-notifications/config.php');
$pusher = new Pusher(APP_KEY, APP_SECRET, APP_ID);

foreach($recipients as $row)                   
  $channel='my-channel'.$row->recipient_id;
  $pusher->trigger($channel, 'notifications', 
    array('message' => $row->message,
          'notification_id' => $row->notification_id) 
  );

这是 HTML/JS(不要不知所措,大部分代码只是用来填充小圆圈和列表,就像 *** 和其他人所做的那样):

<script src="/application/thirdParty/pusher.min.js"></script>
<script>     
var myID=179; // would receive notification if myID matches $row->recipient_id above;
var myChannel = pusher.subscribe('my-channel'+myID);
myChannel.bind('notifications',
  function(data) 
        var message=String(data.message),
            url='/notifications/'+data.notification_id, 
            icon='<i class=\'icon-heart\'></i>',
            urlText=icon+message;

        var notificationRow='<li><a href='+url+'>'+urlText+'</a></li>';
         $('#notificationsDropdownList').prepend(notificationRow);   

        if(notificationCircleCount==0)
             notificationCircleCount++;
              $notificationCircle.show();
               $notificationCircleCount.html(notificationCircleCount);
        
        else
             notificationCircleCount++;
             $notificationCircleCount.html(notificationCircleCount);
        
        console.log('Pusher happened'+data.message);                  
   //function
); //myChannel
</script>

【讨论】:

这可以在本地主机上测试吗?我将需要这么大的时间。提前致谢! 是的 Pusher.js 允许您将消息推送到本地主机。它将被推送到您已实现此代码的每个服务器。

以上是关于推送通知如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Android 推送通知关闭:它是如何在内部工作的?

多行和多个工作灯推送通知

推送通知是如何工作的,它的要求是啥?

GCM 之类的推送通知如何在内部工作?

当网站关闭时,推送通知如何在每个浏览器上工作?

推送通知测试工作流程 [iOS]