2017-07-31 42 views
-1

目前我能够发送“你好”作为通知。现在我想发送一个文本框的值作为notification.below是我正在使用的代码。我需要做什么改变?如何将文本框的值作为网页推送通知发送?

这里是我的index.html:

<html> 
    <body> 
     <h1>Web Push Notification</h1> 
     <button id="push-subscription-button">Push notifications ! 
     </button><br><br> 
     <input name="message" id="message" value="" 
     placeholder="Message"/><br><br> 

    <button id="send-Push-Button">Send Push notifications</button> 

    <script type="text/javascript" src="app.js"></script> 
    </body> 
    </html> 


    Here is send_push_notification.php: 

    <?php 
    require __DIR__ . '/../vendor/autoload.php'; 
    use Minishlink\WebPush\WebPush; 


    $subscription = json_decode(file_get_contents('php://input'), 
    true); 

$auth = array(
'VAPID' => array(

    'subject' => '', 
    'publicKey' => '', 
    'privateKey' => ' ' 
    ), 
); 

    $webPush = new WebPush($auth); 

    $res = $webPush->sendNotification(
    $subscription['endpoint'], 
    "Hello", 
    $subscription['key'], 
    $subscription['token'], 
    true 
    ); 

    app.js: 

    document.addEventListener("DOMContentLoaded",() => { 
    const applicationServerKey = "`enter code here`"; 
    let isPushEnabled = false; 

    const pushButton = document.querySelector('#push-subscription- 
    button'); 
    if (!pushButton) { 
    return; 
    } 

pushButton.addEventListener('click', function() { 
    if (isPushEnabled) { 
     push_unsubscribe(); 
    } else { 
     push_subscribe(); 
    } 
    }); 

    if (!('serviceWorker' in navigator)) { 
    console.warn("Service workers are not supported by this browser"); 
    changePushButtonState('incompatible'); 
    return; 
    } 

    if (!('PushManager' in window)) { 
    console.warn('Push notifications are not supported by this 
    browser'); 
    changePushButtonState('incompatible'); 
    return; 
    } 

    if (!('showNotification' in ServiceWorkerRegistration.prototype)) 
    { 
    console.warn('Notifications are not supported by this browser'); 
    changePushButtonState('incompatible'); 
    return; 
    } 


    if (Notification.permission === 'denied') { 
    console.warn('Notifications are denied by the user'); 
    changePushButtonState('incompatible'); 
    return; 
    } 

     navigator.serviceWorker.register("serviceWorker.js") 
     .then(() => { 
     console.log('[SW] Service worker has been registered'); 
     push_updateSubscription(); 
    }, e => { 
     console.error('[SW] Service worker registration failed', e); 
     changePushButtonState('incompatible'); 
    }); 

    function changePushButtonState (state) { 
    switch (state) { 
     case 'enabled': 
      pushButton.disabled = false; 
      pushButton.textContent = "Disable Push notifications"; 
      isPushEnabled = true; 
      break; 
     case 'disabled': 
      pushButton.disabled = false; 
      pushButton.textContent = "Enable Push notifications"; 
      isPushEnabled = false; 
      break; 
     case 'computing': 
      pushButton.disabled = true; 
      pushButton.textContent = "Loading..."; 
      break; 
     case 'incompatible': 
      pushButton.disabled = true; 
      pushButton.textContent = "Push notifications are not 
     compatible with this browser"; 
      break; 
     default: 
      console.error('Unhandled push button state', state); 
      break; 
     } 
    } 

    function urlBase64ToUint8Array(base64String) { 
    const padding = '='.repeat((4 - base64String.length % 4) % 4); 
    const base64 = (base64String + padding) 
     .replace(/\-/g, '+') 
     .replace(/_/g, '/'); 

    const rawData = window.atob(base64); 
    const outputArray = new Uint8Array(rawData.length); 

    for (let i = 0; i < rawData.length; ++i) { 
     outputArray[i] = rawData.charCodeAt(i); 
    } 
    return outputArray; 
    } 

    function push_subscribe() { 
    changePushButtonState('computing'); 

    navigator.serviceWorker.ready 
    .then(serviceWorkerRegistration => 
    serviceWorkerRegistration.pushManager.subscribe({ 
     userVisibleOnly: true, 
     applicationServerKey: 
     urlBase64ToUint8Array(applicationServerKey), 
    })) 
    .then(subscription => { 
     // Subscription was successful 
     // create subscription on your server 
     return push_sendSubscriptionToServer(subscription, 'POST'); 
     }) 
     .then(subscription => subscription && 
     changePushButtonState('enabled')) // update your UI 
     .catch(e => { 
     if (Notification.permission === 'denied') { 
      // The user denied the notification permission which 
      // means we failed to subscribe and the user will need 
      // to manually change the notification permission to 
      // subscribe to push messages 
      console.warn('Notifications are denied by the user.'); 
      changePushButtonState('incompatible'); 
     } else { 

      console.error('Impossible to subscribe to push 
      notifications', e); 
       changePushButtonState('disabled'); 
     } 
     }); 
    } 

     function push_updateSubscription() { 
     navigator.serviceWorker.ready.then(serviceWorkerRegistration 
     => serviceWorkerRegistration.pushManager.getSubscription()) 
     .then(subscription => { 
     changePushButtonState('disabled'); 

     if (!subscription) { 

      return; 
     } 


     return push_sendSubscriptionToServer(subscription, 'PUT'); 
    }) 
    .then(subscription => subscription && 
    changePushButtonState('enabled')) 
    .catch(e => { 
     console.error('Error when updating the subscription', e); 
    }); 
    } 

    function push_unsubscribe() { 
    changePushButtonState('computing'); 


    navigator.serviceWorker.ready 
    .then(serviceWorkerRegistration => 
    serviceWorkerRegistration.pushManager.getSubscription()) 
    .then(subscription => { 

     if (!subscription) { 
      // No subscription object, so set the state 
      // to allow the user to subscribe to push 
      changePushButtonState('disabled'); 
      return; 
     } 

     // We have a subscription, unsubscribe 
     // Remove push subscription from server 
     return push_sendSubscriptionToServer(subscription, 'DELETE'); 
    }) 
    .then(subscription => subscription.unsubscribe()) 
    .then(() => changePushButtonState('disabled')) 
    .catch(e => { 

     console.error('Error when unsubscribing the user', e); 
     changePushButtonState('disabled'); 
    }); 
    } 

function push_sendSubscriptionToServer(subscription, method) { 
    const key = subscription.getKey('p256dh'); 
    const token = subscription.getKey('auth'); 

    return fetch('push_subscription.php', { 
     method, 
     body: JSON.stringify({ 
      endpoint: subscription.endpoint, 
      key: key ? btoa(String.fromCharCode.apply(null, new 
      Uint8Array(key))) : null, 
      token: token ? btoa(String.fromCharCode.apply(null, new 
      Uint8Array(token))) : null 
     }), 
     }).then(() => subscription); 
     } 



     const sendPushButton = document.querySelector('#send-push- 
     button'); 
     if (!sendPushButton) { 
     return; 
     } 

     sendPushButton.addEventListener('click',() => 
    navigator.serviceWorker.ready 
    .then(serviceWorkerRegistration => 
    serviceWorkerRegistration.pushManager.getSubscription()) 
    .then(subscription => { 

     if (!subscription) { 

    alert('Please enable push notifications'); 
      return; 
     } 

     var msg= document.getElementById("message").value; 
    // alert(msg); 

     const key = subscription.getKey('p256dh'); 
     const token = subscription.getKey('auth'); 

     fetch('send_push_notification.php', { 

      method: 'POST', 
      body: JSON.stringify({ 

       endpoint:subscription.endpoint, 
       key: key ? btoa(String.fromCharCode.apply(null, new 
       Uint8Array(subscription.getKey('p256dh')))) : null, 
       token: token ? btoa(String.fromCharCode.apply(null, 
       new Uint8Array(subscription.getKey('auth')))) : null, 
      }) 
     }) 
     }) 
    ); 
    }); 

我应该从哪里获取文本框的值,并发送推-notification.php用“你好”更换呢?

+1

该脚本看起来相当复杂。你能详细解释它的功能吗? –

+0

关注[这些](https://meta.stackoverflow.com/a/291370/1783163)简单的规则可以改善您的问题。我建议跟着他们。我现在部分解决了你的问题,但我不能每次都和你在一起:-)(尤其是,在你的情况下:“我”总是用英文大写!) – peterh

+0

你好......我对上面的代码做了一些修改,它按照要求工作,但它在本地工作,而不是在上传到server.please时告诉问题是什么。 – Nisha

回答