Zauważyłem, że Facebook zaczął korzystać z powiadomienia HTML5 na pulpicie i myślałem, że zacznę się nim zajmować dla zabawy dla mojego bloga. Mój pomysł jest całkiem prosty: nowy blog wychodzi, cachejob Apache działa co X minut i wywołuje plik, robi trochę magii PHP i wychodzi powiadomienie.Powiadomienie HTML5 z PHP
Sprawdziłem online i znalazłem przykłady przy użyciu node.js and angular, ale nie jestem wygodne przy użyciu któregokolwiek z nich, więc wolę trzymać się z PHP.
Oto mój proces: użytkownik przechodzi do mojego bloga i kliknie przycisk, aby umożliwić powiadomienia. Dla zwięzłości poniższy kod wysyła użytkownikom powiadomienie po kliknięciu przycisku "powiadom". Działa to doskonale i teoretycznie należy je zasubskrybować do przyszłych powiadomień.
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
}
Możesz zobaczyć fiddle powyższych.
Dostęp do użytkownika został przyznany, a teraz powinienem mieć możliwość wysyłania powiadomień kiedy tylko chcę. Niesamowite! Później wpisuję blog i mam identyfikator XYZ. Mój cronjob idzie i wywołuje poniższy skrypt PHP, używając powyższego przykładu node.js jako szablonu.
(w tym przykładzie jestem po prostu wywołanie skryptu ręcznie z mojego telefonu i ogląda mój pulpit. Ponieważ mój pulpit jest „abonament” do tej samej domeny, myślę, że następne będzie/powinno działać.)
$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;
}
Następnie sprawdzam bazę danych i wpis na blogu "Alert" XYZ jest teraz ustawiony na "1", ale moja przeglądarka komputerowa nigdy nie otrzymała powiadomienia. Ponieważ moja przeglądarka jest subskrybowana tym samym adresem URL, który wypycha powiadomienie, wyobrażam sobie, że dostanę wiadomość.
Albo robię coś nie tak (być może PHP nie jest odpowiednim językiem do tego?), Albo nie rozumiem specyfikacji. Czy ktoś może wskazać mi właściwy kierunek? Chyba coś mi brakuje.
Wielkie dzięki.
Update 1
Według komentarzach, jeśli po prostu wywołaj skrypt z tym w tym:
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);
To powinno trafić wszystkie urządzenia, które zostały subskrybowane do moich powiadomień. Próbowałem tego na moim telefonie, ale mój pulpit nadal nie otrzymał powiadomienia. Nadal uważam, że coś mi brakuje, ponieważ moje powiadomienia są przyklejone do jednego urządzenia i można je wywoływać tylko na ładowanie strony lub kliknięcie, w przeciwieństwie do Facebooka, które wysyła powiadomienia, nawet jeśli strona nie jest otwarta w przeglądarce.
Należy pobrać adres URL dostarczony przez wielokrotnie z JS, aby przechwytywać zmiany po ich wystąpieniu. możesz pozostawić otwarte połączenie i długą ankietę lub kometę, ale to przesada dla aktualizacji o niskiej częstotliwości, takich jak nowe posty na blogu. – dandavis
Nie rozumiem. Czy po przesłaniu adresu URL i wysłaniu powiadomienia trafi on do wszystkich subskrybowanych użytkowników? Wydaje się, że wysyła tylko to urządzenie, a nie żadne dodatkowe. –
trafi je, gdy następnym razem przeładują stronę lub ajax php. nie ma wbudowanej "subskrypcji" z php, ale jest kilka sposobów na "push". prosty plik RSS jest sposobem lo-fi, a jeśli użytkownik jest subskrybowany, zwykle otrzymuje powiadomienie. – dandavis