Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Ваша проблема заключается в отсутствии AJAX для подключения Javascript и PHP. Как работает ваш PHP script, вручную запустив script, так что только устройство, поразившее этот script, увидит уведомление. Нет ничего, что действительно отправляет эту информацию на ваше другое устройство прямо сейчас.

Чтобы лучше объяснить эту проблему, ваш рабочий стол, возможно, разрешил доступ к уведомлениям, но не автоматически извлекает эти уведомления. Код, который вы предоставили, должен использовать AJAX, чтобы попасть в URL script, вместо того, чтобы использовать его как задание cron.

Во-первых, вам нужно запустить повторяющийся запрос на PHP script, чтобы узнать, было ли какое-либо обновленное уведомление. Если есть новое уведомление, вам нужно создать новый объект уведомления с помощью возвращаемого ответа.

Во-вторых, вам нужно изменить PHP script, чтобы вывести строку JSON, а не уведомление script.

Пример вывода 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 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);

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

Ответ 2

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

<button onclick="notifyMe()">Notify me!</button>

function notifyMe() {
  // Let check if the browser supports notifications
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Let check whether notification permissions have already been granted
  else if (Notification.permission === "granted") {
    // If it okay let 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 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.
}