Ho notato che Facebook ha iniziato a utilizzare la notifica HTML5 per desktop e ho pensato di iniziare a dilettarci per divertirmi sul mio blog. La mia idea è piuttosto semplice: esce un nuovo blog, cronache di apache esegue ogni X minuti e chiama un file, esegue alcune magie PHP e esce la notifica.Notifica HTML5 con PHP
Ho cercato online e ho trovato degli esempi usando node.js and angular, ma non mi sento a mio agio nell'utilizzare entrambi, quindi preferisco attenermi a PHP.
Ecco il mio processo: l'utente visita il mio blog e fa clic su un pulsante per consentire le notifiche. Per brevità, il codice sottostante invia agli utenti una notifica quando fanno clic sul pulsante "notifica". Questo funziona perfettamente, e in teoria dovrebbe iscriverli a eventuali notifiche future.
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
}
È possibile vedere il fiddle di quanto sopra.
L'accesso all'utente è concesso e ora dovrei essere in grado di inviare loro le notifiche ogni volta che voglio. Eccezionale! Quindi scrivo un post di blog e ha l'ID di XYZ. Il mio cronjob va e chiama il seguente script PHP, usando l'esempio node.js sopra come modello.
(In questo esempio io sono solo chiamando lo script manualmente dal mio telefono e guardando lo schermo del desktop. Dal momento che il mio tavolo è "sottoscritto" per lo stesso dominio, penso che il seguente sarebbe/dovrebbe funzionare.)
$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;
}
Poi controllo il database e la voce del blog L'avviso di XYZ è ora impostato su "1", tuttavia il mio browser desktop non è mai stato avvisato. Dal momento che il mio browser è iscritto allo stesso URL che sta inviando la notifica, immagino che otterrei un messaggio.
O sto facendo qualcosa di sbagliato (forse PHP non è la lingua giusta per questo?), O sto fraintendendo le specifiche. Qualcuno potrebbe aiutarmi a indicarmi la giusta direzione? Penso che mi manchi qualcosa.
Grazie mille.
Update 1
Secondo i commenti, se mi limito a chiamare uno script con questo in esso:
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);
Si dovrebbe colpire tutti i dispositivi che hanno sottoscritto le notifiche. Ho provato questo sul mio telefono ma il mio desktop non ha ancora ricevuto una notifica. Continuo a pensare che manchi qualcosa perché le mie notifiche sembrano bloccate su un dispositivo e possono essere richiamate solo a caricamento di pagina o su clic anziché su Facebook che invia notifiche anche se la pagina non è aperta nel browser.
è necessario recuperare l'URL fornito ripetutamente da JS per rilevare le modifiche dopo che si sono verificate. puoi lasciare una connessione aperta e long-poll o cometa, ma è eccessivo per gli aggiornamenti a bassa frequenza come i nuovi post del blog. – dandavis
Non capisco. Se prendo l'URL e invierò la notifica, colpirà tutti gli utenti iscritti? Sembra che invii solo il dispositivo in questione e non altri in aggiunta. –
li colpirà, la prossima volta ricaricheranno la pagina o ajax il php. non c'è una "sottoscrizione" integrata con php, ma ci sono alcuni modi per "spingere". un semplice file RSS è il modo lo-fi, e se l'utente è iscritto, di solito riceve una notifica. – dandavis