JavaScript-уведомление с переполнением стека

Я заметил, что 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, который отправляет вам уведомления, даже если страница не открыта в вашем браузере.

25

Решение

Ваша проблема заключается в отсутствии 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);

Вот и все! Вам просто не хватало той части, когда на вашем рабочем столе нужно было извлекать уведомления. Направьте голову, хотя, это не проверено, и вам, возможно, придется кое-что настроить.

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]