Настройка службы WNS для Windows Phone 8 выдает ошибку после добавления тега <Identity>

Я настраиваю Windows Phone 8.1 push-уведомления с городской. У меня есть SID и секретный ключ для моего приложения. Но когда я делаю следующий шаг, упомянутый в dev.windows WNS->Live Service site:

Чтобы вручную установить значения идентификаторов приложения, откройте файл AppManifest.xml в текстовом редакторе и установите эти атрибуты элемента, используя значения, показанные здесь.

мое приложение перестало работать. Кто-нибудь может предложить мне шаги по настройке WNS в Windows Phone 8.1, тогда это мне очень помогает, я трачу на это целую неделю и теперь очень расстраиваюсь.

1 ответ

Решение

Я получил успех с Push Notification в Windows Phone 8.1/ Windows Apps (Универсальные приложения). Я реализовал отправку Push-уведомлений на устройства из нашего собственного веб-сервиса.

Шаг 1: получите секрет клиента и идентификатор SID пакета от dev.windows.com >> Сервисы >> Сервисы Live. Они понадобятся вам позже в веб-сервисе.

Шаг 2. В приложении Windows вы должны связать свое приложение с Магазином. Для этого щелкните правой кнопкой мыши на проекте >> Магазин >> Связать приложение с магазином. Войдите в свою учетную запись Dev и свяжите свое приложение.Связывание вашего приложения с магазином

Шаг 3 Вам понадобится канал Uri. В MainPage.xaml добавьте кнопку и текстовый блок, чтобы получить свой URI канала. Код XAML выглядит следующим образом:

<Page
x:Class="FinalPushNotificationTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:FinalPushNotificationTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBlock Text="Push Notification" Margin="20,48,10,0" Style="{StaticResource HeaderTextBlockStyle}" TextWrapping="Wrap" />
    <ScrollViewer Grid.Row="1" Margin="20,10,10,0">
        <StackPanel x:Name="resultsPanel">
            <Button x:Name="PushChannelBtn" Content="Get Channel Uri" Click="PushChannelBtn_Click" />
            <ProgressBar x:Name="ChannelProgress" IsIndeterminate="False" Visibility="Collapsed" />
            <TextBlock x:Name="ChannelText" FontSize="22" />

        </StackPanel>
    </ScrollViewer>
</Grid>

Шаг 4: На странице MainPage.xaml.cs Добавьте следующий фрагмент кода, т.е. для события нажатия кнопки. Когда вы запустите свое приложение, вы получите URI канала в окне консоли. Запишите этот канал Uri, он понадобится вам в веб-сервисе.

private async void PushChannelBtn_Click(object sender, RoutedEventArgs e)
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
        ChannelText.Text = channel.Uri.ToString();
        Debug.WriteLine(channel.Uri);
    }

Канал Ури

Шаг 5: Теперь вам нужен веб-сервис для отправки push-уведомлений на ваше устройство. Для этого щелкните правой кнопкой мыши ваш проект в обозревателе решений. Добавить >> Новый проект >> Visual C# >> Веб >> ASP.NET Web Application. Нажмите OK, на Шаблон выберите Пусто. После этого добавьте новую веб-форму в ваше веб-приложение. Назовите это SendToast.Добавление нового веб-проекта в ваш проектВыбор пустого шаблона для вашего веб-проектаДобавление веб-формы в ваше веб-приложение

Шаг 6. Теперь в SendToast.aspx.cs вам необходимо реализовать методы и функции для получения токена доступа с использованием SID пакета, Client Secret и URI канала. Добавьте свой SID пакета, Cleint Secret и Channel Uriin в соответствующих местах. Полный код выглядит как следующий фрагмент кода:

using Microsoft.ServiceBus.Notifications;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SendToast
{
    public partial class SendToast : System.Web.UI.Page
    {
        private string sid = "Your Package SID";
        private string secret = "Your Client Secret";
        private string accessToken = "";
    [DataContract]
    public class OAuthToken
    {
        [DataMember(Name = "access_token")]
        public string AccessToken { get; set; }
        [DataMember(Name = "token_type")]
        public string TokenType { get; set; }
    }

    OAuthToken GetOAuthTokenFromJson(string jsonString)
    {
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {
            var ser = new DataContractJsonSerializer(typeof(OAuthToken));
            var oAuthToken = (OAuthToken)ser.ReadObject(ms);
            return oAuthToken;
        }
    }

    public void getAccessToken()
    {
        var urlEncodedSid = HttpUtility.UrlEncode(String.Format("{0}", this.sid));
        var urlEncodedSecret = HttpUtility.UrlEncode(this.secret);

        var body =
          String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret);

        var client = new WebClient();
        client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

        string response = client.UploadString("https://login.live.com/accesstoken.srf", body);
        var oAuthToken = GetOAuthTokenFromJson(response);
        this.accessToken = oAuthToken.AccessToken;
    }

    protected string PostToCloud(string uri, string xml, string type = "wns/toast")
    {
        try
        {
            if (accessToken == "")
            {
                getAccessToken();
            }
            byte[] contentInBytes = Encoding.UTF8.GetBytes(xml);

            WebRequest webRequest = HttpWebRequest.Create(uri);
            HttpWebRequest request = webRequest as HttpWebRequest;
            webRequest.Method = "POST";

            webRequest.Headers.Add("X-WNS-Type", type);
            webRequest.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken));

            Stream requestStream = webRequest.GetRequestStream();
            requestStream.Write(contentInBytes, 0, contentInBytes.Length);
            requestStream.Close();

            HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

            return webResponse.StatusCode.ToString();
        }
        catch (WebException webException)
        {
            string exceptionDetails = webException.Response.Headers["WWW-Authenticate"];
            if ((exceptionDetails != null) && exceptionDetails.Contains("Token expired"))
            {
                getAccessToken();
                return PostToCloud(uri, xml, type);
            }
            else
            {
                return "EXCEPTION: " + webException.Message;
            }
        }
        catch (Exception ex)
        {
            return "EXCEPTION: " + ex.Message;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        string channelUri = "Your Channel Uri";

        if (Application["channelUri"] != null)
        {
            Application["channelUri"] = channelUri;
        }
        else
        {
            Application.Add("channelUri", channelUri);
        }

        if (Application["channelUri"] != null)
        {
            string aStrReq = Application["channelUri"] as string;
            string toast1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?> ";
            string toast2 = @"<toast>
                        <visual>
                            <binding template=""ToastText01"">
                                <text id=""1"">Hello Push Notification!!</text>
                            </binding>
                        </visual>
                    </toast>";
            string xml = toast1 + toast2;

            Response.Write("Result: " + PostToCloud(aStrReq, xml));
        }
        else
        {
            Response.Write("Application 'channelUri=' has not been set yet");
        }
        Response.End();
    }
  }
}

Запустите ваше веб-приложение, вы получите ответ Result OK, если оно успешно отправит push-уведомление.

Дайте мне знать, если вам нужен рабочий пример проекта. Надеюсь это поможет. Спасибо!

Другие вопросы по тегам