Отправка уведомления в Центр уведомлений Azure из приложения универсальной платформы Windows (UWP)

Как следует из названия, мне нужно отправить уведомление ИЗ приложения UWP (написанного на C#) в мой концентратор Azure (и оттуда оно будет отправлено в приложение Android, которое я уже создал). Я, очевидно, использую GCM для отправки push-уведомлений в свое приложение для Android.

После бесчисленных часов поиска я так и не нашел ни одного учебника, который был бы хоть как-то полезен, поскольку большинство из них используют консольное приложение для отправки уведомления, а не приложение универсальной платформы Windows.

Если бы кто-нибудь мог помочь мне, я был бы действительно благодарен.


person Kyle    schedule 21.04.2016    source источник
comment
Не могли бы вы показать код, который вы используете? Отправка push-уведомления через С# всегда одинакова... независимо от того, используете ли вы UWP, WPF, Forms или консольное приложение.   -  person Heribert Scharnagl    schedule 21.04.2016
comment
@HeribertScharnagl С удовольствием. Вот ссылка: azure .microsoft.com/en-us/documentation/articles/ ... И для своего приложения для Android я использовал это: azure.microsoft.com/en-us/documentation/articles/ ... Все, что мне нужно сделать, это в основном переводя функции, указанные ниже (необязательно) Отправляйте push-уведомления непосредственно из приложения по этой ссылке на C#. Но проблема в том, что я никогда не писал код на C#.   -  person Kyle    schedule 22.04.2016


Ответы (2)


Вы можете использовать API-интерфейсы REST концентратора уведомлений для отправки уведомления из любого места (серверной части или устройства) по стандартному HTTP/HTTPS.

Здесь есть пример (с использованием клиента Java): https://msdn.microsoft.com/en-us/library/azure/dn495628.aspx

И ссылка на API находится здесь: https://msdn.microsoft.com/en-us/library/azure/dn495827.aspx

person Addys    schedule 21.04.2016

Я собираюсь ответить на свой вопрос здесь, так как многие люди боролись с этим, как я. Итак, вот код, который отправляет уведомление с универсальной платформы Windows (UWP) через центр уведомлений Azure в приложение Android (с помощью GCM).

Обратите внимание, что НЕОБХОДИМО слегка изменить код, чтобы он работал в вашем собственном центре уведомлений (дополнительную информацию см. в комментариях к коду).

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;


namespace SendNotification
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            this.sendNotification();
        }

        string Endpoint = "";
        string SasKeyName = "";
        string SasKeyValue = "";

        public void ConnectionStringUtility(string connectionString)
        {
            //Parse Connectionstring
            char[] separator = { ';' };
            string[] parts = connectionString.Split(separator);
            for (int i = 0; i < parts.Length; i++)
            {
                if (parts[i].StartsWith("Endpoint"))
                    Endpoint = "https" + parts[i].Substring(11);
                if (parts[i].StartsWith("SharedAccessKeyName"))
                    SasKeyName = parts[i].Substring(20);
                if (parts[i].StartsWith("SharedAccessKey"))
                    SasKeyValue = parts[i].Substring(16);
            }
        }


        public string getSaSToken(string uri, int minUntilExpire)
        {
            string targetUri = Uri.EscapeDataString(uri.ToLower()).ToLower();

            // Add an expiration in seconds to it.
            long expiresOnDate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
            expiresOnDate += minUntilExpire * 60 * 1000;
            long expires_seconds = expiresOnDate / 1000;
            String toSign = targetUri + "\n" + expires_seconds;

            // Generate a HMAC-SHA256 hash or the uri and expiration using your secret key.
            MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
            BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
            var messageBuffer = CryptographicBuffer.ConvertStringToBinary(toSign, encoding);
            IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(SasKeyValue, encoding);
            CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer);
            IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer);

            string signature = Uri.EscapeDataString(CryptographicBuffer.EncodeToBase64String(signedMessage));

            return "SharedAccessSignature sr=" + targetUri + "&sig=" + signature + "&se=" + expires_seconds + "&skn=" + SasKeyName;
        }


        public async void sendNotification()
        {
            //insert your HubFullAccess here (a string that can be copied from the Azure Portal by clicking Access Policies on the Settings blade for your notification hub)
            ConnectionStringUtility("YOURHubFullAccess"); 

            //replace YOURHUBNAME with whatever you named your notification hub in azure 
            var uri = Endpoint + "YOURHUBNAME" + "/messages/?api-version=2015-01";
            string json = "{\"data\":{\"message\":\"" + "Hello World!" + "\"}}";


            //send an HTTP POST request
            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, uri);
                request.Content = new StringContent(json);

                request.Headers.Add("Authorization", getSaSToken(uri, 1000));
                request.Headers.Add("ServiceBusNotification-Format", "gcm");
                var response = await httpClient.SendAsync(request);
                await response.Content.ReadAsStringAsync();
            }
        }
    }
}
person Kyle    schedule 24.04.2016