Window Phone silverlight 8.1 HttpNotificationChannel ChannelUriUpdated 未命中

Posted

技术标签:

【中文标题】Window Phone silverlight 8.1 HttpNotificationChannel ChannelUriUpdated 未命中【英文标题】:Window Phone silverlight 8.1 HttpNotificationChannel ChannelUriUpdated not being hit 【发布时间】:2015-08-06 05:54:19 【问题描述】:

我有一个非常基本的 Windows Phone Silverlight 8.1 应用程序,其中包含以下内容(我想在将其添加到更大的现有应用程序之前证明这个概念):

HttpNotificationChannel pushChannel;

void registerPushChannel()

   pushChannel = HttpNotificationChannel.Find(channelName);

   // If the channel was not found, then create a new connection to the push service.
   if (pushChannel == null)
   
      pushChannel = new HttpNotificationChannel(channelName);

      // Register for all the events before attempting to open the channel.
      pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
      pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
      pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);

      pushChannel.Open();

   
   else
   
      // The channel was already open, so just register for all the events.
      pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
      pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
      pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);

      // code which passes the new channel URI back to my web service     
    


void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)

   Dispatcher.BeginInvoke(() =>
   
       // Display the new URI for testing purposes. Normally, the URI would be passed back to your web service at this point.
       System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
       MessageBox.Show(String.Format("Channel Uri is 0",
                    e.ChannelUri.ToString()));

     );
 

问题是 PushChannel_ChannelUriUpdated 永远不会被击中,我就是不知道为什么!

我已经在我的 WMAppManifest.xml 中设置了 ID_CAP_PUSH_NOTIFICATION 并且还 Toast Capable = yes 在我的 Package.appmanifest 中......我错过了什么运动鞋?

【问题讨论】:

哪里有问题? pushChannel.Uri 在 pushChannel.Open() 之后总是为空;并且连接状态已断开。然后当我调用 NotificationHub hub = new NotificationHub(hubName, connectionString);等待 hub.RegisterNativeAsync(pushChannel.ChannelUri.ToString());它在 RegisterNativeAsync 上引发 NullReferenceException 您尝试过我发布的答案吗? 【参考方案1】:

我尝试过以下通知代码:

HttpNotificationChannel pushChannel;

将 pushChannel 作为 globle 放在 App.xaml.cs 文件中,它在 EventHandler 中使用

string channelName = "PushChannel";
pushChannel = HttpNotificationChannel.Find(channelName);
//Push Notifications
if (pushChannel == null)

    pushChannel = new HttpNotificationChannel(channelName);

    //// Register for all the events before attempting to open the channel.
    pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
    pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);

    // Register for this notification only if you need to receive the notifications while your application is running.
    pushChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived);

    pushChannel.Open();

    // Bind this new channel for toast events.
    pushChannel.BindToShellToast();

else

    // The channel was already open, so just register for all the events.
    pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
    pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);

    // Register for this notification only if you need to receive the notifications while your application is running.
    pushChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived);

    // Display the URI for testing purposes. Normally, the URI would be passed back to your web service at this point.enter code here
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    
        //pushURI = pushChannel.ChannelUri.ToString();
        //MessageBox.Show(String.Format("Channel Uri is 0", pushChannel.ChannelUri.ToString()));
        Notification.ChannelURI = pushChannel.ChannelUri.ToString();
    );

将上述代码放入您的 App.xaml.cs 文件中 App()

活动:

void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e1)

    try
    
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        
            MessageBox.Show(String.Format("Channel Uri is 0", e1.ChannelUri.ToString()));
        );
    
    catch (Exception ex)
     

void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e2)

    try
    
        // Error handling logic for your particular application would be here.
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        
            //MessageBox.Show(String.Format("A push notification 0 error occurred.  1 (2) 3", e2.ErrorType, e2.Message, e2.ErrorCode, e2.ErrorAdditionalData));
        );
    
    catch (Exception ex)
     

【讨论】:

谢谢 - 我应该更精确...在 pushChannel.Open(); pushChannel Uri 为 null 且 connectionstatus 已断开连接。 @BzBurr 我在PushChannel_ChannelUriUpdated 事件中得到了 ChannelUri 得到了 ChannelUri @BzBurr 请检查您的配置 @BzBurr PushChannel_ChannelUriUpdated 不是每次都调用,而是在HttpNotificationChannel 找不到时调用 OR null ID_CAP_PUSH_NOTIFICATION 已开启,ID_CAP_NETWORKING 已开启,应用支持 Toast...我可能缺少什么?

以上是关于Window Phone silverlight 8.1 HttpNotificationChannel ChannelUriUpdated 未命中的主要内容,如果未能解决你的问题,请参考以下文章

Windows phone silverlight one 主题

Windows phone webdriver (selenium community)/ Nunit silverlight windows for Windows phone 单元测试框架?

带有自动边距的网格 - Windows Phone 8.1 Silverlight

在 Windows Phone 和 Silverlight 中将 Image Feed 转换为 BitmapImage

windows phone silverlight 8 app 系统托盘颜色变化

如何将 Windows 商店中的 Windows Phone 应用程序(8.1 XAML)迁移到 8.1 Silverlight?