Я заметил, что Facebook начал использовать уведомление HTML5 для рабочего стола, и я подумал, что начну заниматься этим ради удовольствия для своего блога. Моя идея довольно проста: выходит новый блог, apache cronjob запускается каждые X минут и вызывает файл, выполняет некоторые PHP-мастера и выходит извещения.
Я посмотрел онлайн и нашел примеры, используя node.js и angular, но мне не удобно использовать любой из них, поэтому я бы предпочел придерживаться PHP.
Вот мой процесс: пользователь переходит в мой блог и нажимает кнопку, чтобы разрешать уведомления. Для краткости нижеприведенный код отправляет пользователям уведомление, когда они нажимают кнопку "уведомлять". Это прекрасно работает и теоретически должно подписаться на любые будущие уведомления.
if ('Notification' in window) {
function notifyUser() {
var title = 'example title';
var options = {
body: 'example body',
icon: 'example icon'
};
if (Notification.permission === "granted") {
var notification = new Notification(title, options);
} else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
if (permission === "granted") {
var notification = new Notification(title, options);
}
});
}
}
$('#notify').click(function() {
notifyUser();
return false;
});
} else {
//not happening
}
Вы можете увидеть fiddle выше.
Доступ к пользователю предоставляется, и теперь я должен иметь возможность отправлять им уведомления, когда захочу. Потрясающие! Затем я пишу запись в блоге, и у нее есть идентификатор XYZ. Мой cronjob отправляется и вызывает следующий PHP script, используя приведенный выше пример node.js в качестве шаблона.
(В этом примере я просто вызываю script вручную с моего телефона и просматриваю экран своего рабочего стола. Поскольку мой рабочий стол "подписан" в тот же домен, я думаю, что следующее будет/должно работать.)
$num = $_GET['num'];
$db = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if($db) {
mysql_select_db('mydb', $db);
$select = "SELECT alert FROM blog WHERE id = ".$num." && alert = 0 LIMIT 1";
$results = mysql_query($select) or die(mysql_error());
$output = '';
while($row = mysql_fetch_object($results)) {
$output .= "<script>
var title = 'new blog!';
var options = {
body: 'come read my new blog!',
icon: 'same icon as before or maybe a new one!'
};
var notification = new Notification(title, options);
</script>";
$update = "UPDATE blog SET alert = 1 WHERE id = ".$num." && alert = 0 LIMIT 1";
mysql_query($update) or die(mysql_error());
}
echo $output;
}
Затем я проверяю базу данных и запись в блоге. "Предупреждение" XYZ теперь установлено на "1", но мой настольный браузер так и не получил уведомление. Поскольку мой браузер подписывается на тот же URL-адрес, который выдает уведомление, я бы предположил, что получаю сообщение.
Либо я делаю что-то неправильно (возможно, PHP не подходит для этого?), или я неправильно понимаю спецификацию. Может ли кто-нибудь помочь указать мне в правильном направлении? Кажется, я что-то упускаю.
Большое спасибо.
Обновление 1
Согласно комментариям, если я просто вызываю script с этим в нем:
var title = 'new blog!';
var options = {
body: 'come read my new blog!',
icon: 'same icon as before or maybe a new one!'
};
var notification = new Notification(title, options);
Он должен ударить по всем устройствам, которые подписаны на мои уведомления. Я попробовал это на своем телефоне, но мой рабочий стол все равно не получил уведомления. Я все еще думаю, что у меня что-то не хватает, поскольку мои уведомления, похоже, привязаны к одному устройству и могут быть вызваны только на загрузку страницы или на клик, а не на Facebook, который отправляет вам уведомления, даже если страница не открыта в вашем браузере.