Настройка службы 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-уведомление.
Дайте мне знать, если вам нужен рабочий пример проекта. Надеюсь это поможет. Спасибо!