Intereting Posts
Как получить идентификатор сообщения для сообщения, которое я только что сделал через API Facebook строка определения типа не соответствует числу переменных связывания PHP возвращает n-я строка таблицы html с dom добавлять дни и часы в поле даты / времени и получать обновленную дату / время в php с помощью mysql Глобальная переменная – соединение с базой данных? Phpmailer с использованием smtp с Gmail не работает – время подключения Как пригласить друзей друзей на мероприятие? API-интерфейс Facebook Graph МетодNotAllowedHttpException в строке RouteCollection.php 219 Magento – Неустранимая ошибка: вызов функции-члена getBackend () для не-объекта в app / code / core / Mage / Eav / Model / Entity / Abstract.php в строке 816 Как использовать поваренную книгу повара PHP для установки версии выше 5.3.3 Как проверить целочисленные значения, чтобы избежать SQL-инъекций? Доступ к json_decode Безопасно ли это для обеспечения JSONP? Нужна помощь в преобразовании кода SOAP PHP в Groovy с использованием groovy-wslite как я могу указать PHP glob на конкретный каталог?

Уведомление HTML5 с PHP

Я заметил, что 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 теперь установлено на «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 качестве аргументов вместо их notifyUsers() :

 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); 

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

используйте следующее

 <button onclick="notifyMe()">Notify me!</button> function notifyMe() { // Let's check if the browser supports notifications if (!("Notification" in window)) { alert("This browser does not support desktop notification"); } // Let's check whether notification permissions have already been granted else if (Notification.permission === "granted") { // If it's okay let's create a notification var notification = new Notification("Hi there!"); } // Otherwise, we need to ask the user for permission else if (Notification.permission !== 'denied') { Notification.requestPermission(function (permission) { // If the user accepts, let's create a notification if (permission === "granted") { var notification = new Notification("Hi there!"); } }); } // At last, if the user has denied notifications, and you // want to be respectful there is no need to bother them any more. }