Я заметил, что Facebook начал использовать уведомление HTML5 для настольных компьютеров, и я подумал, что начну в нем баловаться ради своего блога. Моя идея довольно проста: выходит новый блог, apache cronjob запускается каждые X минут и вызывает файл, выполняет некоторые действия PHP и отправляет уведомление.
Я посмотрел онлайн и нашел примеры использования node.js и угловой, но мне неудобно использовать любой из них, поэтому я бы предпочел придерживаться 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
}
Вы можете увидеть играть на скрипке из вышеперечисленных.
Доступ к пользователю предоставлен, и теперь я могу отправлять ему уведомления, когда захочу. Потрясающие! Затем я пишу запись в блоге, и она имеет идентификатор XYZ. Мой cronjob идет и вызывает следующий скрипт PHP, используя приведенный выше пример node.js в качестве шаблона.
(В этом примере я просто вызываю скрипт вручную со своего телефона и наблюдаю за экраном рабочего стола. Поскольку мой рабочий стол «подписан» на тот же домен, я думаю, что следующее будет / должно работать.)
$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» «alert» теперь установлен на «1», но мой браузер на рабочем столе так и не получил уведомления. Так как мой браузер подписан на тот же URL-адрес, который отправляет уведомление, я думаю, я получу сообщение.
Либо я делаю что-то не так (возможно, PHP не подходит для этого?), Или я неправильно понимаю спецификацию. Может ли кто-нибудь помочь направить меня в правильном направлении? Я думаю, что что-то упустил.
Большое спасибо.
Обновление 1
Согласно комментариям, если я просто вызову скрипт с этим в нем:
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, который отправляет вам уведомления, даже если страница не открыта в вашем браузере.
Ваша проблема заключается в отсутствии AJAX для подключения Javascript и PHP. Ваш PHP-скрипт работает, выполняя сценарий вручную, поэтому уведомление будет отображаться только на устройстве, подключенном к этому сценарию. На самом деле сейчас нет ничего, что отправляло бы эту информацию на другое ваше устройство.
Чтобы лучше объяснить проблему, возможно, ваш рабочий стол разрешил доступ к уведомлениям, но он автоматически не извлекает эти уведомления. Код, который вы предоставили, должен будет использовать AJAX для обращения к URL скрипта, а не использовать его как задание cron.
Прежде всего, вам нужно запустить повторяющийся запрос к сценарию PHP, чтобы увидеть, было ли какое-либо обновленное уведомление. Если есть новое уведомление, то вам нужно создать новый объект уведомления, используя возвращенный ответ.
Во-вторых, вам нужно изменить скрипт PHP для вывода строки JSON вместо скрипта уведомления.
Пример вывода JSON:
{
{
title: 'new blog!',
options: {
body: 'come read my new blog!',
icon: 'same icon as before or maybe a new one!'
}
},
{
title: 'another blog item!',
options: {
body: 'come read my second blog!',
icon: 'hooray for icons!'
}
}
}
Ваш notifyUsers()
должен взять title
а также option
в качестве аргументов вместо их жесткого кодирования:
function notifyUser(title, options) { ... }
Используя jQuery, получите ответ PHP и создайте уведомление:
function checkNotifications(){
$.get( "/path/to/script.php", function( data ) {
// data is the returned response, let's parse the JSON string
json = JSON.parse(data);
// check if any items were returned
if(!$.isEmptyObject(json)){
// send each item to the notify function
for(var i in json){
notifyUser(json[i].title, json[i].options);
}
}
});
setTimeout(checkNotifications, 60000); // call once per minute
}
Теперь вам просто нужно запустить опрос AJAX, поэтому добавьте его на свою веб-страницу:
$(document).ready(checkNotifications);
Вот и все! Вам просто не хватало той части, когда на вашем рабочем столе нужно было извлекать уведомления. Направьте голову, хотя, это не проверено, и вам, возможно, придется кое-что настроить.
Других решений пока нет …