在 Windows Phone 8.1 上的推送通知中传递部分参数
Passing partial parameter in a push notification on Windows Phone 8.1
我正在尝试将带有参数的 toast 通知发送到 Windows Phone 8.1 设备,因此当用户点击 toast 时,应用程序将在应用程序中显示特定页面,如这篇 MSDN 文章 https://msdn.microsoft.com/library/windows/apps/jj662938(v=vs.105).aspx
中所述
这是我用来添加参数的片段:
<wp:Param>?cmd=command1 </wp:Param>
这是我在应用程序中阅读它的方式:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){
base.OnNavigatedTo(e);
string strVal1 = this.NavigationContext.QueryString["cmd"];
}
进行这些更改后它可以正常工作,但仅限于第一次通知。在所有后续通知中,应用程序中读取的参数值与第一个通知中的相同,无论我从服务器发送了什么。
这是一个例子:
- 我正在向通知负载中包含此参数的设备发送通知:
<wp:Param>?cmd=command1 </wp:Param>
this.NavigationContext.QueryString("cmd") 中的值是 command1,它应该是.
- 然后我用这个参数参数发送第二个通知
<wp:Param>?cmd=command2 </wp:Param>
this.NavigationContext.QueryString("cmd") 中的 cmd 值仍返回为 "command1",而不是 command2,因为它应该是。在我强制重启应用程序之前,它对所有后续通知都是这样工作的。
这是我试过的方法:
- 检查了 OnNavigatedTo 事件的 NavigationEventArgs 参数中的 Uri 值,它与我在 NavigationContext 中看到的相同。
- 双重检查从服务器发送的通知负载(正确)
- 已检查msdn/Whosebug/google。
- 已在 8.1 模拟器和设备上进行检查(效果相同)
问题:
- 我是否必须在应用程序中执行某些操作(idk、清除 NavigationContext 或其他),以便下一次通知会有所不同?
- 是否有人真正拥有使用部分参数的实时应用程序(不是具有完整 url 的服务器驱动导航,而是传递给应用程序的部分 url + 从应用程序内部相应的导航) 并且它适用于多个后续通知?
找出问题所在。重新启动应用程序时会触发两个 OnNavigated 事件。第一个具有 System.Windows.Navigation.NavigationMode.Reset
类型,它具有重置旧页面的数据(在我的例子中,使用旧通知中的数据)。第二个是 System.Windows.Navigation.NavigationMode.New
并且包含来自新通知的数据。
对导航模式进行简单检查以确保其属于 .New 修复了该问题:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){
base.OnNavigatedTo(e);
if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)){
// custom navigation logic based on the data within <wp:Param/>
}
}
我正在尝试将带有参数的 toast 通知发送到 Windows Phone 8.1 设备,因此当用户点击 toast 时,应用程序将在应用程序中显示特定页面,如这篇 MSDN 文章 https://msdn.microsoft.com/library/windows/apps/jj662938(v=vs.105).aspx
中所述这是我用来添加参数的片段:
<wp:Param>?cmd=command1 </wp:Param>
这是我在应用程序中阅读它的方式:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){
base.OnNavigatedTo(e);
string strVal1 = this.NavigationContext.QueryString["cmd"];
}
进行这些更改后它可以正常工作,但仅限于第一次通知。在所有后续通知中,应用程序中读取的参数值与第一个通知中的相同,无论我从服务器发送了什么。
这是一个例子:
- 我正在向通知负载中包含此参数的设备发送通知:
<wp:Param>?cmd=command1 </wp:Param>
this.NavigationContext.QueryString("cmd") 中的值是 command1,它应该是. - 然后我用这个参数参数发送第二个通知
<wp:Param>?cmd=command2 </wp:Param>
this.NavigationContext.QueryString("cmd") 中的 cmd 值仍返回为 "command1",而不是 command2,因为它应该是。在我强制重启应用程序之前,它对所有后续通知都是这样工作的。
这是我试过的方法:
- 检查了 OnNavigatedTo 事件的 NavigationEventArgs 参数中的 Uri 值,它与我在 NavigationContext 中看到的相同。
- 双重检查从服务器发送的通知负载(正确)
- 已检查msdn/Whosebug/google。
- 已在 8.1 模拟器和设备上进行检查(效果相同)
问题:
- 我是否必须在应用程序中执行某些操作(idk、清除 NavigationContext 或其他),以便下一次通知会有所不同?
- 是否有人真正拥有使用部分参数的实时应用程序(不是具有完整 url 的服务器驱动导航,而是传递给应用程序的部分 url + 从应用程序内部相应的导航) 并且它适用于多个后续通知?
找出问题所在。重新启动应用程序时会触发两个 OnNavigated 事件。第一个具有 System.Windows.Navigation.NavigationMode.Reset
类型,它具有重置旧页面的数据(在我的例子中,使用旧通知中的数据)。第二个是 System.Windows.Navigation.NavigationMode.New
并且包含来自新通知的数据。
对导航模式进行简单检查以确保其属于 .New 修复了该问题:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){
base.OnNavigatedTo(e);
if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)){
// custom navigation logic based on the data within <wp:Param/>
}
}