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

Я заметил, что Facebook начал использовать уведомление HTML5 для рабочего стола, и я думал, что начну баловаться в нем для удовольствия для моего блога. Моя идея довольно проста: выходит новый блог, apache cronjob запускается каждые X минут и вызывает файл, делает некоторые PHP-волшебство и выходит уведомление.

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

2 ответов


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

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


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

<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.
}