• 20-09-2024, 03:47:59
    #1
    Selam arkadaşlar, ajax ile yeni sipariş geldiğinde bildirim sesi vermek istiyorum ama birazcık bu konuda bilgisiz olduğum için eksik yaptım sanırım pc cihazlar da zor'da olsa bildirim sesi alabiliyorum ama mobil cihazlarda bildirim sesi gelmiyor bu sorunu nasıl çözebilirim. Uygulama gibi tepki veren bir sistem yapmak istiyorum nasıl yaparım bilgisi olan varmı R10 gibi bir bildirim sistemi olsa bana yetiyor ajax her 5 saniyede 1 sorgu attığında yeni bildirim var ise bildirim sesi gelecek bu kadar bildirim sesi garson mutfak bu tür bölümlere gideceği için kritik bir öneme sahip.

    Yardımcı olacaklara şimdiden teşekkür ederim.

    $(document).ready(function () {
                let audio = new Audio('audio/yeni.mp3');
                let isAudioInitialized = false;
                let lastCounts = JSON.parse(localStorage.getItem('lastCounts')) || {
                    beklemede: null,
                    hazirlaniyor: null,
                    hazir: null
                };
                let notificationQueue = [];
                let isNotificationShowing = false;
                if (Notification.permission !== "granted" && Notification.permission !== "denied") {
                    Notification.requestPermission().then(permission => {
                        if (permission === "granted") {
                            console.log("Bildirim izni verildi");
                        }
                    });
                }
                function initAudio() {
                    if (!isAudioInitialized) {
                        audio.play().then(() => {
                            audio.pause();
                            audio.currentTime = 0;
                            isAudioInitialized = true;
                            console.log("Ses sistemi başlatıldı");
                        }).catch(error => {
                            console.error("Ses başlatma hatası:", error);
                        });
                    }
                }
                function playNotificationSound() {
                    if (isAudioInitialized) {
                        audio.play().catch(error => {
                            console.error("Ses çalma hatası:", error);
                        });
                    } else {
                        initAudio();
                    }
                }
                function updateCount(action, elementId) {
                    $.ajax({
                        url: URL,
                        method: 'GET',
                        data: {
                            action: action
                        },
                        dataType: 'json',
                        success: function (response) {
                            let currentCount = response.count;
                            let statusKey = elementId.split('-')[1];
                            let element = $(`#${elementId}`);
                            if (response.status === false || currentCount === 0) {
                                if (element.length) {
                                    element.text('');
                                    element.removeClass('pyrz-icon');
                                }
                            } else {
                                if (element.length) {
                                    element.text(currentCount).addClass('pyrz-icon');
                                } else {
                                    $('<span></span>')
                                        .attr('id', elementId)
                                        .text(currentCount)
                                        .addClass('pyrz-icon')
                                        .appendTo('body');
                                }
                                let stat;
                                if (statusKey === 'hazir') {
                                    stat = 'Teslim Edilecek Siparişler';
                                } else if (statusKey === 'hazirlaniyor') {
                                    stat = 'Hazırlanacak Siparişler';
                                } else {
                                    stat = 'Yeni Sipariş';
                                }
                                if (lastCounts[statusKey] === null || currentCount > lastCounts[statusKey]) {
                                    queuePushNotification(`${stat} | Toplam: ${currentCount}`);
                                }
                            }
                            lastCounts[statusKey] = currentCount;
                            localStorage.setItem('lastCounts', JSON.stringify(lastCounts));
                        }
                    });
                }
                // Bildirim kuyruğu
                function queuePushNotification(message) {
                    notificationQueue.push(message);
                    if (!isNotificationShowing) {
                        showNextNotification();
                    }
                }
                // Kuyruktaki bildirimi gösterme
                function showNextNotification() {
                    if (notificationQueue.length > 0) {
                        isNotificationShowing = true;
                        const message = notificationQueue.shift();
                        const notification = $('#pushNotification');
                        notification.text(message);
                        notification.addClass('animate');
                        // Görsel bildirim gönder
                        showBrowserNotification(message);
                        setTimeout(() => {
                            notification.removeClass('animate');
                            isNotificationShowing = false;
                            showNextNotification();
                        }, 5000);
                    }
                }
                // Bildirim div'i ekle
                if (!$('#pushNotification').length) {
                    $('body').append('<div id="pushNotification" class="push-notification"></div>');
                }
                // Ses sistemini başlatma girişimi
                initAudio();
                function updateAllCounts() {
                    updateCount('getBeklemedeCount', 'ntfy-beklemede');
                    updateCount('getHazirlaniyorCount', 'ntfy-hazirlaniyor');
                    updateCount('getHazirCount', 'ntfy-hazir');
                }
                // Düzenli aralıklarla güncelleme yap
                setInterval(() => {
                    updateAllCounts();
                }, 3000);
                updateAllCounts();
                function showBrowserNotification(message) {
                    if (Notification.permission === "granted") {
                        new Notification("Yeni Bildirim", {
                            body: message
                        });
                        playNotificationSound();
                    } else {
                        playNotificationSound();
                    }
                }
            });
    konuyla detaylı ilgilenen ve anlamayan arkadaşlara php kodlarını ve bildirim sisteminin tam işleyişini anlatabilirim.
  • 20-09-2024, 07:36:10
    #2
    Chrome yeni politikaları ile direkt ses çakmak baya zorlaştı. Akşam saat 8 gibi mesajımı beğenirseniz hatırlatma niyetinde kodu atabilirim
  • 20-09-2024, 09:16:49
    #3
    yusok32 adlı üyeden alıntı: mesajı görüntüle
    Chrome yeni politikaları ile direkt ses çakmak baya zorlaştı. Akşam saat 8 gibi mesajımı beğenirseniz hatırlatma niyetinde kodu atabilirim
    evet hocam bu biraz canımı sıktı neredeyse bitmek üzere ama en önemli şey bu kaldı.
  • 20-09-2024, 22:57:06
    #4
    $("body").append('<audio class="sound-player" autoplay="autoplay" style="display:none;"><source src="bildirimsesurl" /><embed src="bildirimsesurl" hidden="true" autostart="true" loop="false"/></audio>');
    ajaxdan gelen yanıta göre yukardaki kodla bildirim sesi çalabilirsin. ben ajax yerine EventSource kullanıyorum onu da araştırabilirsin
  • 20-09-2024, 23:33:11
    #5
    yusok32 adlı üyeden alıntı: mesajı görüntüle
    $("body").append('<audio class="sound-player" autoplay="autoplay" style="display:none;"><source src="bildirimsesurl" /><embed src="bildirimsesurl" hidden="true" autostart="true" loop="false"/></audio>');
    ajaxdan gelen yanıta göre yukardaki kodla bildirim sesi çalabilirsin. ben ajax yerine EventSource kullanıyorum onu da araştırabilirsin
    hocam sen harikasın birkaç pürüz var onun harici mükemmel ios telefonlarda safari için bir yöntem varmı veya en sağlıklısı eventsource mu acaba ?
    garson'a sipariş geldiğinde telefon'a bildirim sesi düşüyor yani kısaca senaryo böyle pürüz olmadan çalışırsa çok mükemmel olacak 3 gündür bununla uğraşıyorum 75% sorunum çözüldü aslında.
  • 20-09-2024, 23:35:03
    #6
    ertaytw adlı üyeden alıntı: mesajı görüntüle
    hocam sen harikasın birkaç pürüz var onun harici mükemmel ios telefonlarda safari için bir yöntem varmı veya en sağlıklısı eventsource mu acaba ?
    garson'a sipariş geldiğinde telefon'a bildirim sesi düşüyor yani kısaca senaryo böyle pürüz olmadan çalışırsa çok mükemmel olacak 3 gündür bununla uğraşıyorum 75% sorunum çözüldü aslında.
    safari kısaca ios tarafı zor biraz hocam sertifika vs işleri var apn sistemi falan o kısma girersen işin içinden çıkamazsın
  • 20-09-2024, 23:36:25
    #7
    yusok32 adlı üyeden alıntı: mesajı görüntüle
    safari kısaca ios tarafı zor biraz hocam sertifika vs işleri var apn sistemi falan o kısma girersen işin içinden çıkamazsın
    peki hocam pwa ile bunu aşabilirmiyiz yine mi safari altyapısını kullanır yoksa pwa tek başına çözüm sunar mı yada js ile siteyi çeken bir client yaptırsak bildirim sesini de clientten çeksek ?
  • 20-09-2024, 23:58:58
    #8
    ertaytw adlı üyeden alıntı: mesajı görüntüle
    peki hocam pwa ile bunu aşabilirmiyiz yine mi safari altyapısını kullanır yoksa pwa tek başına çözüm sunar mı yada js ile siteyi çeken bir client yaptırsak bildirim sesini de clientten çeksek ?
    Hocam mevzumuz safarinin vs sesleri çalma konusunda olan politikaları, yaptığım sistemler android ve Windows olduğu için böyle bir ihtiyacım olmadı çok gerekli olduğunda mobil uygulamamdan bildirim atıyorum ios tarafında ondan dolayı pwa konusunda vs ne desem yanlış olur