One thing I found, is that getting the token from the console when using node js can be quite frustrating as there is a lot of other stuff coming through from the phone, so I would recommend installing another plugin nativescript clipboard as well, and then using this to store the token so you can paste it into an email and email it to yourself while testing.
Below is my amended code from the hello world project.
var __extends = this.__extends || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } __.prototype = b.prototype; d.prototype = new __(); }; var observable = require("data/observable"); var HelloWorldModel = (function (_super) { __extends(HelloWorldModel, _super); function HelloWorldModel() { _super.call(this); this.counter = 42; this.set("message", this.counter + " taps left"); var pushPlugin = require("nativescript-push-notifications"); var clipboard = require("nativescript-clipboard"); var self = this; var settings = { senderID: 'YOUR GOOGLE ID' }; pushPlugin.register(settings, // Success callback function (token) { clipboard.setText(token); alert('Device registered successfully ' + token); }, // Error Callback function (error) { alert(error.message); } ); pushPlugin.onMessageReceived(function callback(data) { alert(JSON.stringify(data)); }); pushPlugin.onTokenRefresh(function (token) { alert(token); }); } HelloWorldModel.prototype.tapAction = function () { this.counter--; if (this.counter <= 0) { this.set("message", "Hoorraaay! You unlocked the NativeScript clicker achievement!"); } else { this.set("message", this.counter + " taps left"); } }; return HelloWorldModel; })(observable.Observable); exports.HelloWorldModel = HelloWorldModel; exports.mainViewModel = new HelloWorldModel();So what exactly is your google id?
You need to create an account and logon to Google Developer Console.
Create a project and click on the overview option. The project id appears at the top of the screen as "Project Number". It also appears in the url after https://console.developers.google.com/project/.
You also need to go to the APIs section and give yourself access to "Google Cloud Messaging for Android".
Then goto the credentials section and click "Add Credentials" and create a server key. Copy the API key, you will need this later.
The next step is to write the code for sending the messages to the devices. How to do this is outlined here.
It details message formats. If however, you are using ASP NET for your server technology, I include my code here, so you can reuse it.
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Drawing; public static class AndroidGCMPushNotification { #region Constants const string AuthorizationKey = "YOUR AUTHORIZATION KEY"; const string SenderId = "YOUR GOOGLE PROJECT ID"; #endregion #region Public Methods public class MessageToSend { public string Title { set; get; } // Title of message public string Message { set; get; } // Message Countent public int? MessageCount { set; get; } // Number to show up in message public long NotId { set; get; } // Notification Id - If set to zero, it makes one randomly public string Sound { set; get; } // Sound to play public Color? Color { set; get; } // Color of Notification public string Icon { set; get; } // Icon for Notification } ///Run up your android app, paste the token from the clipboard and pass it into the method as a device id./// Send message to google servers in JSON format /// /// Tokens generated from Nativescript code /// Message to send ///public static Response SendNotificationJSON(string[] deviceIds, MessageToSend messageToSend) { var webRequest = GetWebRequest(true); var pushNotification = new PushNotification(); pushNotification.registration_ids = deviceIds; // Data pushNotification.data = new Dictionary (); pushNotification.data.Add("title", messageToSend.Title); pushNotification.data.Add("message", messageToSend.Message); pushNotification.data.Add("notId", messageToSend.NotId.ToString()); if (messageToSend.MessageCount.HasValue) { pushNotification.data.Add("msgcnt", messageToSend.MessageCount.ToString()); } if (!String.IsNullOrEmpty(messageToSend.Sound)) { pushNotification.data.Add("sound", messageToSend.Sound); } if (messageToSend.Color.HasValue) { pushNotification.data.Add("color", ColorTranslator.ToHtml(messageToSend.Color.Value)); } if (!String.IsNullOrEmpty(messageToSend.Icon)) { pushNotification.data.Add("smallIcon", messageToSend.Icon); pushNotification.data.Add("largeIcon", messageToSend.Icon); } pushNotification.data.Add("time", System.DateTime.Now.ToString()); // This will not be read by nativescript var postData = JsonConvert.SerializeObject(pushNotification, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }).Replace("\"messageOption\":", ""); return GetWebResponse(webRequest, postData); } #endregion #region Private Methods /// /// Builds the web request for url encoded or JSON format /// /// indicates JSON is required ///Web request private static WebRequest GetWebRequest(bool json) { WebRequest webRequest; webRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); webRequest.Method = "post"; webRequest.ContentType = json ? "application/json" : "application/x-www-form-urlencoded;charset=UTF-8"; webRequest.Headers.Add(string.Format("Authorization: key={0}", AuthorizationKey)); webRequest.Headers.Add(string.Format("Sender: id={0}", SenderId)); return webRequest; } ////// Posts data and gets response from server /// /// Web request to post /// Web request body ///private static Response GetWebResponse(WebRequest webRequest, string postData) { Byte[] byteArray = Encoding.UTF8.GetBytes(postData); webRequest.ContentLength = byteArray.Length; Stream dataStream = webRequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); WebResponse webResponse = webRequest.GetResponse(); dataStream = webResponse.GetResponseStream(); StreamReader tReader = new StreamReader(dataStream); String sResponseFromServer = tReader.ReadToEnd(); tReader.Close(); dataStream.Close(); webResponse.Close(); return JsonConvert.DeserializeObject<Response>(sResponseFromServer); } #endregion #region Push Notification Classes for JSON serialization // Message class for serialization taken from here // https://developers.google.com/cloud-messaging/server-ref#table1 private class PushNotification { public string[] registration_ids; public Notification notification; // Not used in nativescript public Dictionary<string, string> data; public PushNotificationOption messageOption; } private class PushNotificationOption { public PushNotificationOption() { content_available = true; delay_while_idle = false; time_to_live = 4; dry_run = false; } public string collapse_key; public string priority; public bool? content_available; public bool? delay_while_idle; public int? time_to_live; public string restricted_package_name; public bool? dry_run; } private class Notification { public Notification() { icon = "ic_launcher"; } public string title; public string body; public string icon; // Android public string badge; // IOS public string tag; // Android public string color; // Android public string click_action; } public class ResponseResult { public string message_id { set; get; } public string registration_id { set; get; } public string error { set; get; } } public class Response { public long multicast_id { set; get; } public int success { set; get; } public int failure { set; get; } public int canonical_ids { set; get; } public ResponseResult[] results { set; get; } } #endregion }
AndroidGCMPushNotification.SendNotificationJSON(string[] deviceIds, MessageToSend messageToSend)
With the magic of nativescript, you can see your push notification come through, an example is shown below.
See the MessageToSend class for things you can control. This includes :
- Title of message
- Message
- Unique Notification Id
- Message Count - see number on the right under the message time
- Sound - custom sound to play - you need to put the custom sound in the \platforms\android\res\raw folder. For example a mp3 or wav file. The sound passed in does not have to include the file extension
- Color - color of notification
- Icon - icon of notification - put image file in \platforms\android\res\drawable folder.
Hopefully this may help someone else get started at least.
No comments:
Post a Comment