推送通知如何工作?
Posted
技术标签:
【中文标题】推送通知如何工作?【英文标题】:How do push notifications work? 【发布时间】:2012-07-20 12:33:21 【问题描述】:我正在尝试在我的基于 php 的网站上实现推送通知。目标是制作类似于 *** 和其他网站的东西,它们会在用户收到消息时实时通知用户。
我使用 mysql 作为我的数据库,Apache 作为我的服务器,并且正在考虑使用 Amazon-SNS 作为这些通知的框架,因为这似乎是该服务的目的。
我从文献中很难理解如何以编程方式设置 sending.php
和 receiving.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 允许您将消息推送到本地主机。它将被推送到您已实现此代码的每个服务器。以上是关于推送通知如何工作?的主要内容,如果未能解决你的问题,请参考以下文章