Search code examples
c#.netgoogle-chromepush-notificationchrome-gcm

Push notification Chrome Mobile Ver 42+


I am trying a demo of push notification suggested by this article. https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web?hl=en

and trying to run code from github https://github.com/GoogleChrome/samples/tree/gh-pages/push-messaging-and-notifications

As per instruction I have done following things -
1. Created project on google developer console.
2. Added browser application key in to config.js > gcmAPIKey :'browser api key'
3.Added gsm_sender_id :'Project number' into manifest.json
4. Hosted application on https://somedomain.com
and result is this enter image description here


Whenever I click on SendPushMessage button it doesn't show any notification. While debugging, I found that this request get fired
https://xxsomedomainxxx.azurewebsites.net/api/get/?subscriptionId=APA91bE_xyl2sP8l1pa8j4n84VGfJgKVb28I0DJK5qo9zUVLy0ZSRsyl2BbjLDSZ-Y625LqsmMp3rIH4PW3s1v_ccBOdCbWYsxaF525FHRbx5odr-z1a1uPrP4zqy4DFlKkwa9pyHhkdxL0ggxGBbC_bB6LTZSDuTKlDeXTRhywcY9X5KxBXrxhS_4M8oJFUi3eW6FikEUiJ

As per my observation I need to catch substriptionId on server and need to do something with it. So what kind of code should I need to write on server for below API

https://xxsomedomainxxx.azurewebsites.net/api/get/


Solution

  • I have created one WCF REST service with following code and its sending notification to android chrome 42+.
    But one problem is here, notification shows message from service-worker.js file, not from in this code

    var value = "Hello from server";

    . I am working on it and update this answer soon.

    Please update this function in main.js file


    function getNotification(subscription) {
    
        navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) {
            serviceWorkerRegistration.pushManager.subscribe()
              .then(function (subscription) {
                  console.log('getNotification', subscription)
                  fetch('/pushnotificationservice.svc/sendnotification?key=' + subscription.subscriptionId).then(function (obj) {
                      console.log('getNotification', obj)
                  });
              });
        });
    

    WCF Service Code

    public string SendNotification(string key)
            {
                 ServiceData myServiceData = new ServiceData();
                try
                {
                    string GoogleAppID = "2440XXXXXXXX";//put your project number here
                    string redId = key;
                    var SENDER_ID = "youremail@gmail.com";//I haven't tried with another junk value
                    var value = "Hello from server";//this message do not displayed in notification
                    WebRequest tRequest;
                    tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
                    tRequest.Method = "post";
                    tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
    
                    tRequest.Headers.Add(string.Format("Authorization: key={0}", "Your browser key"));
    
                    tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
    
                    string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "&registration_id=" + key + "";
                    Console.WriteLine(postData);
                    Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                    tRequest.ContentLength = byteArray.Length;
    
                    Stream dataStream = tRequest.GetRequestStream();
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    dataStream.Close();
    
                    WebResponse tResponse = tRequest.GetResponse();
    
                    dataStream = tResponse.GetResponseStream();
    
                    StreamReader tReader = new StreamReader(dataStream);
    
                    String sResponseFromServer = tReader.ReadToEnd();
    
                    tReader.Close();
                    dataStream.Close();
                    tResponse.Close();
                    return sResponseFromServer;
                }
                catch (FaultException fex)
                {
                    myServiceData.Result = false;
                    myServiceData.ErrorMessage = "unforeseen error occurred. Please try later.";
                    myServiceData.ErrorDetails = fex.ToString();
                    throw new FaultException<ServiceData>(myServiceData);
                }
            }