将GCM推送通知发送到设备

时间:2016-08-31 12:36:22

标签: android xamarin push-notification google-cloud-messaging

我正在尝试开发一个Xamarin Android应用程序,使用GCM服务发送推送通知。

我遵循了Xamarin教程page上提供的教程,该教程教授如何注册GCM,请求设备令牌以及如何创建消息发送者。

一切正常,除非我想向具有令牌x 的特定设备发送推送消息,而不是全部。

Message Sender如下所示:

    private static void messageSender(string title, string message, string summary)
    {
        var jGcmData = new JObject();
        var jData = new JObject();

        jData.Add("message", message);
        jData.Add("title", title);
        jData.Add("summary", summary);
        jGcmData.Add("to", "/topics/global");
        jGcmData.Add("data", jData);

        var url = new Uri("https://gcm-http.googleapis.com/gcm/send");
        try
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

                client.DefaultRequestHeaders.TryAddWithoutValidation(
                    "Authorization", "key=" + API_KEY);

                Task.WaitAll(client.PostAsync(url,
                    new StringContent(jGcmData.ToString(), Encoding.Default, "application/json"))
                        .ContinueWith(response =>
                        {
                            Console.WriteLine(response);
                            Console.WriteLine("Message sent: check the client device notification tray.");
                        }));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Unable to send GCM message:");
            Console.Error.WriteLine(e.StackTrace);
        }
    }

任何帮助?

1 个答案:

答案 0 :(得分:1)

*client side*

    private void SendNotification()
        {
            var jGcmData = new JObject();
            var jData = new JObject();

            jData.Add("title", txtTitle.Text);
            jData.Add("message", txtMessage.Text);
            jData.Add("summary", txtSummary.Text);
            jGcmData.Add("to", "/topics/global");
            jGcmData.Add("data", jData);
            var url = new Uri("https://gcm-http.googleapis.com/gcm/send");
            try
            {
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Add(
                        new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.TryAddWithoutValidation(
                        "Authorization", "key=" + API_KEY);
                    Task.WaitAll(client.PostAsync(url,
                            new StringContent(jGcmData.ToString(), Encoding.Default, "application/json"))
                        .ContinueWith(response =>
                        {
                            Console.WriteLine(response);
                            Console.WriteLine("Message sent: check the client device notification tray.");
                        }));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to send GCM message:");
                Console.Error.WriteLine(ex.StackTrace);
            }
        }
*phone side*

public override void OnMessageReceived(string from, Bundle data)
        {
            var message = data.GetString("message");
            var title = data.GetString("title");
            var summary = data.GetString("summary");
            Log.Debug("MyGcmListenerService", "From:    " + from);
            Log.Debug("MyGcmListenerService", "Message: " + message);
            Log.Debug("MyGcmListenerService", "Title: " + title);
            Log.Debug("MyGcmListenerService", "Summary: " + summary);
            SendNotification(message, title, summary);
        }
        void SendNotification(string message,string title,string summary)
        {

            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
            var notificationBuilder = new Notification.Builder(this)
                .SetSmallIcon(Resource.Drawable.aalogo2)
                .SetContentTitle(title)
                .SetContentText(message)
                .SetSubText(summary)
                .SetAutoCancel(true)
                .SetContentIntent(pendingIntent);
            var notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
            notificationManager.Notify(0, notificationBuilder.Build());
        }