为 windows phone 设置 WNS 服务 8 添加 <Identity> 标签后出现错误
Setting up WNS service for windows phone 8 get error after add <Identity> tag
我正在使用 urbanairship 设置 windows phone 8.1 推送通知。我的应用程序有 SID 和密钥。但是当我执行 dev.windows WNS-->Live Service 站点中提到的步骤时:
To set your application's identity values manually, open the
AppManifest.xml file in a text editor and set these attributes of the
element using the values shown here.
我的应用程序停止工作。有没有人为我提供在 windows phone 8.1 中设置 WNS 的步骤然后它对我有很大帮助,我花了一周时间在这上面,现在真的很沮丧。
我在 Windows Phone 8.1/ Windows 应用程序(通用应用程序)中成功使用推送通知。我已经实现了从我们自己的 Web 服务向设备发送推送通知。
步骤 1:从 dev.windows.com >> 服务 >> 实时服务。稍后您将在 Web 服务中需要这些。
第 2 步:在您的 Windows 应用程序中,您必须将您的应用程序与应用商店相关联。为此,右键单击项目 >> Store >> 将 App 与 Store 关联。使用您的 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 页面中,添加以下代码片段,即用于按钮单击事件。当您 运行 您的应用程序时,您将在控制台 Window 中获得 Channel Uri。记下此频道 Uri,您将在 Web 服务中需要它。
private async void PushChannelBtn_Click(object sender, RoutedEventArgs e)
{
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
ChannelText.Text = channel.Uri.ToString();
Debug.WriteLine(channel.Uri);
}
第 5 步:
现在您需要一个 Web 服务来向您的设备发送推送通知。为此,请在解决方案资源管理器中右键单击您的项目。添加 >> 新项目 >> Visual C# >> Web >> ASP.NET Web 应用程序。单击确定,模板 select 为空。之后在您的 Web 应用程序中添加一个新的 Web Form。将其命名为 SendToast。
第 6 步:
现在在 SendToast.aspx.cs 中,您需要实现方法和函数以使用 Package SID、Client Secret 和 Channel Uri 获取 Access Token .在相应位置添加您的包 SID、Cleint Secret 和 Channel Uri。
完整的代码类似于以下代码片段:
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();
}
}
}
运行 您的 Web 应用程序,如果它成功发送推送通知,您将收到 Result OK 响应。
如果您需要工作示例项目,请告诉我。
希望这可以帮助。
谢谢!
我正在使用 urbanairship 设置 windows phone 8.1 推送通知。我的应用程序有 SID 和密钥。但是当我执行 dev.windows WNS-->Live Service 站点中提到的步骤时:
To set your application's identity values manually, open the AppManifest.xml file in a text editor and set these attributes of the element using the values shown here.
我的应用程序停止工作。有没有人为我提供在 windows phone 8.1 中设置 WNS 的步骤然后它对我有很大帮助,我花了一周时间在这上面,现在真的很沮丧。
我在 Windows Phone 8.1/ Windows 应用程序(通用应用程序)中成功使用推送通知。我已经实现了从我们自己的 Web 服务向设备发送推送通知。
步骤 1:从 dev.windows.com >> 服务 >> 实时服务。稍后您将在 Web 服务中需要这些。
第 2 步:在您的 Windows 应用程序中,您必须将您的应用程序与应用商店相关联。为此,右键单击项目 >> Store >> 将 App 与 Store 关联。使用您的 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 页面中,添加以下代码片段,即用于按钮单击事件。当您 运行 您的应用程序时,您将在控制台 Window 中获得 Channel Uri。记下此频道 Uri,您将在 Web 服务中需要它。
private async void PushChannelBtn_Click(object sender, RoutedEventArgs e)
{
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
ChannelText.Text = channel.Uri.ToString();
Debug.WriteLine(channel.Uri);
}
第 5 步:
现在您需要一个 Web 服务来向您的设备发送推送通知。为此,请在解决方案资源管理器中右键单击您的项目。添加 >> 新项目 >> Visual C# >> Web >> ASP.NET Web 应用程序。单击确定,模板 select 为空。之后在您的 Web 应用程序中添加一个新的 Web Form。将其命名为 SendToast。
第 6 步: 现在在 SendToast.aspx.cs 中,您需要实现方法和函数以使用 Package SID、Client Secret 和 Channel Uri 获取 Access Token .在相应位置添加您的包 SID、Cleint Secret 和 Channel Uri。 完整的代码类似于以下代码片段:
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();
}
}
}
运行 您的 Web 应用程序,如果它成功发送推送通知,您将收到 Result OK 响应。
如果您需要工作示例项目,请告诉我。 希望这可以帮助。 谢谢!