2013-04-20 2 views
2

Я пытаюсь использовать push-уведомления в WP7.1. Я создал класс и некоторые классы php. Этот пример работает для всех типов уведомлений, но моя проблема - UriChannel. В моем простом примере я должен вручную написать канал URI в PHP-коде.Push Notifications, Uri Channel и Php Server side

  • Является ли канал uri уникальным для всех устройств, на которых установлено мое приложение?

  • Как я могу отправить Uri Channel на свой сервер?

Спасибо.

Это мой код:

/// Holds the push channel that is created or found. 
    HttpNotificationChannel pushChannel; 
    // The name of our push channel. 
    string channelName = "LiveTileChannel"; 

    // Costruttore 
    public MainPage() 
    { 
     InitializeComponent(); 
     CreatePushChannel(); 
    } 

    private void CreatePushChannel() 
    { 
     // Try to find the push channel. 
     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.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived); 
      pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(pushChannel_HttpNotificationReceived); 
      pushChannel.Open(); 
      // Bind this new channel for Tile events. 
      pushChannel.BindToShellTile(); 
      pushChannel.BindToShellToast(); 
      connessioneTxt.Text = "Connessione avvenuta"; 
     } 
     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.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived); 
      pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(pushChannel_HttpNotificationReceived); 
      // Display the URI for testing purposes. Normally, the URI would be passed back to your web service at this point. 
      System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString()); 
      uriTxt.Text=pushChannel.ChannelUri.ToString(); 
      connessioneTxt.Text = "Connessione già avvenuta"; 
     } 
    } 

    void pushChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e) 
    { 
     string message; 

     using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body)) 
     { 
      message = reader.ReadToEnd(); 
     } 

     Dispatcher.BeginInvoke(() => rawTxt.Text = String.Format("Received Notification {0}:\n{1}", 
       DateTime.Now.ToShortTimeString(), message) 
       ); 

    } 

    /// Event handler for when the Push Channel Uri changes.  
    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()); 
      uriTxt.Text = pushChannel.ChannelUri.ToString(); 
     }); 
    } 

    // Event handler for when a Push Notification error occurs. 
    void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e) 
    { 
     // Error handling logic for your particular application would be here. 
     Dispatcher.BeginInvoke(() => 
      MessageBox.Show(String.Format("A push notification {0} error occurred. {1} ({2}) {3}", e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData))); 
    } 

    void PushChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("notifica aperta"); 
    } 


} 

И один из примера дерево PHP:

Pastebin of PHP

ответ

1

URI-канал является уникальным для каждого устройства, на котором установлено приложение. Он должен быть уникальным для каждого устройства, поскольку это то, что сообщает службе MPN, какое устройство отправляет уведомление. Он служит той же цели, что и токены устройств для уведомлений Apple Push и идентификаторов регистрации для облачных сообщений Google.

Вы можете отправить канал URI на свой сервер, отправив на ваш сервер HTTP-запрос GET или POST с использованием URI Chnnael в качестве входного параметра.

Вот некоторые рекомендации для comminicating сервера, взятую из MSDN:

Каждый раз, когда начинается ваше приложение, вы должны пройти URI из вашего толчок канала на облачный сервис, который рассылает уведомления толчка. Это также необходимо, чтобы вы передали идентификатор устройства на ваш облачный сервис , чтобы служба облака могла отслеживать, какие устройства имеют URI . Если URI изменяется, то облачный сервис может заменить старый URI для этого идентификатора устройства. Windows Phone не обеспечивает рамки для , так как в большинстве случаев приложения и облачные сервисы уже имеют свои собственные протоколы, которые они используют для связи друг с другом.

Лучшие практики для общения с облачной службы включают в себя:

приложение должно аутентифицировать с соответствующим облачного сервиса.

Приложение должно зашифровать свой URI канала уведомлений перед отправкой URI в свою соответствующую облачную службу .

Если облачный сервис будет использовать уведомления свойства, которые не существуют в Windows, Phone OS 7.0, то вы должны передать информацию о версии ОС вашего облачного сервиса, так что служба облака может правильно понизить уведомления для Windows Phone OS 7.0 клиентов.

Служба облака должна проверять URI-канал уведомления, полученный от своего , соответствующее приложение и хранить его в надежном режиме.

Когда сеанс инициируется из приложения, URI канала уведомлений всегда должен быть отправлен в его соответствующую облачную службу.

Служба облака должна иметь код состояния, который он может отправить в соответствующее приложение, чтобы запускает приложение для создания нового URI канала уведомлений.

Смежные вопросы