none
Push-уведомления RRS feed

  • Общие обсуждения

  • У меня есть некоторая проблема: Я хочу добавить Push-уведомления в приложение, но что то не очень получается. Когда делаю отдельное приложение в котором получаю URI, все нормально работает. Код брал с блога Пугачева, а вот когда хочу встроить этот же код в свое приложение, то он отказывается получать URI, просто ноль эмоций. У меня уже голова болит, второй день думаю над этим вопросом. Я только недавно начал заниматься программированием под WP так что не пинайте)) К тому же еще и школьник)))
    12 марта 2013 г. 17:28

Все ответы

  • Для push уведомлений нужно само мобильное приложение которое будет их получать и серверное (или просто удаленное) приложение, которое будет отправлять уведомления.
    На каком этапе у вас возникли проблемы и работает ли у вас исходный пример из блога Сергея Пугачева?

    12 марта 2013 г. 20:12
    Модератор
  • Если я делаю отдельное приложение по исходнику с блога Пугачева, то все работает и URI приходит, а вот когда я тот же самый код встраиваю уже в свое приложение, то при нажатии на кнопку URI не приходит. Я никак не пойму почему. Вроде все тоже самое что и из примера Сергея Пугачева, но не работает((
    13 марта 2013 г. 1:01
  • он точно такой же как и в примере Сергея Пугачева. Просто копипаст)) Вот поэтому я и не понимаю почему МОЁ приложение отказывается получать URI.
    13 марта 2013 г. 18:47
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Notification;
    using System.Text;
    
    namespace PushNotificationExample
    {
        public partial class MainPage : PhoneApplicationPage
        {
            // Конструктор
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void SetPushNotification_Click(object sender, RoutedEventArgs e)
    {
     HttpNotificationChannel myChannel;
    bool isNewChannel = false;
     string myChannelName = "MyChannel";
     
    myChannel = HttpNotificationChannel.Find(myChannelName);
     
    if (myChannel == null)
     {
    myChannel = new HttpNotificationChannel(myChannelName);
    isNewChannel = true;
     
     }
     
    //получаем URI и его изменения
     myChannel.ChannelUriUpdated +=
     new EventHandler<NotificationChannelUriEventArgs>
    (myToastChannel_ChannelUriUpdated);
     
     //обрабатываем ошибки
    myChannel.ErrorOccurred += 
    new EventHandler<NotificationChannelErrorEventArgs>
    (myToastChannel_ErrorOccurred);
     
     //регируем на получение Toast оповещения 
    //при запущеном приложении
    myChannel.ShellToastNotificationReceived += 
    new EventHandler<NotificationEventArgs>
    (myToastChannel_ShellToastNotificationReceived);
     
      //регируем на получение Raw оповещения 
    //при запущеном приложении
    myChannel.HttpNotificationReceived +=
    new EventHandler<HttpNotificationEventArgs>(
    myToastChannel_HttpNotificationReceived);
     
     if (isNewChannel)
     myChannel.Open();
     
    // говорим о том, что у нас будут toast оповещения
     if (!myChannel.IsShellToastBound)
    myChannel.BindToShellToast();
     
    // говорим о том, что у нас будут tile оповещения
     if (!myChannel.IsShellTileBound)
     myChannel.BindToShellTile();
     
    // если канал был раньше – посылаем URI сервису
    if (!isNewChannel)
    SendURIToService(myChannel.ChannelUri);
                
    }
    
            void myToastChannel_ErrorOccurred
    (object sender, NotificationChannelErrorEventArgs e)
            {
                // здесь мы должны были бы обработать ошибку 
                // здесь просто выводим, для использования в тестировании
                Dispatcher.BeginInvoke(() =>
                {
                    System.Diagnostics.Debug.WriteLine(e.Message);
                    MessageBox.Show(String.Format("Error: {0}", e.Message));
                });
            }
    
            void myToastChannel_ChannelUriUpdated
            (object sender, NotificationChannelUriEventArgs e)
            {
                // здесь мы должны были бы отослать URI нашему сервису
                // просто выводим, для использования в тестировании
                // из-за взаимодействия c UI - используем Dispatcher
                Dispatcher.BeginInvoke(() => SendURIToService(e.ChannelUri));
            }
    
    
    
            void SendURIToService(Uri channelURI)
            {
                // здесь мы должны были бы отослать URI нашему сервису
                // просто выводим, для использования в тестировании
                System.Diagnostics.Debug.WriteLine(channelURI.ToString());
              
            }
    
    
            void myToastChannel_ShellToastNotificationReceived
    (object sender, NotificationEventArgs e)
     {
     // здесь мы должны были бы обработать сообщение 
     // здесь просто выводим,
    // для использования в тестировании
     
     StringBuilder sb = new StringBuilder();
     
     foreach (string key in e.Collection.Keys)
     {
     sb.AppendFormat("{0}:{1}\n", key, e.Collection[key]);
       }
     
     string result = sb.ToString();
     
     Dispatcher.BeginInvoke(() =>
    {
    System.Diagnostics.Debug.WriteLine(result);
      MessageBox.Show(result);
    });
    }
    
            void myToastChannel_HttpNotificationReceived
            (object sender, HttpNotificationEventArgs e)
     {
    //добавьте свой обработчик Raw сообщения, 
    //который будет его разбирать
    Dispatcher.BeginInvoke(() =>
      {
     System.Diagnostics.Debug.WriteLine
    ("Получено Raw сообщение.");
     MessageBox.Show("Получено Raw сообщение");
    });
     
     }
    
    
        }
    }


    <phone:PhoneApplicationPage 
        x:Class="PushNotificationExample.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the application and page title-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" 
    Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" 
    Text="PUSH NOTIFICATION" 
    Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="PageTitle" Text="настройки" 
    Margin="9,-7,0,0" Style=
    "{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" 
    Margin="12,0,12,0">
                <StackPanel>
                    <Button Name="SetPushNotification" 
    Content="установка оповещений" Click="SetPushNotification_Click" />
                </StackPanel>
            </Grid>
    
            <!--Пример кода, иллюстрирующий использование ApplicationBar-->
            <!--<phone:PhoneApplicationPage.ApplicationBar>
            <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Кнопка 1"/>
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Кнопка 2"/>
                <shell:ApplicationBar.MenuItems>
                    <shell:ApplicationBarMenuItem Text="Элемент меню 1"/>
                    <shell:ApplicationBarMenuItem Text="Элемент меню 2"/>
                </shell:ApplicationBar.MenuItems>
            </shell:ApplicationBar>
        </phone:PhoneApplicationPage.ApplicationBar>-->
        </Grid>
    </phone:PhoneApplicationPage>
    Вот весь код главной страницы. Больше в приложении ничего нет. Это из примера с блога Пугачева. Когда я запускаю это приложение, то я могу получить URI, а когда встраиваю этот же в свой проект, то URI просто не приходит. В окне вывода ничего не присходит при нажатии на кнопку.
    13 марта 2013 г. 18:55
  • Но в его примере все работает. Основу кода не меняя встраиваю в приложение и нифига((
    13 марта 2013 г. 19:17
  • Ладно. Спасибо большое. Я решил пока что не добавлять push-уведомления и полностью сосредоточится на наполнение приложения информацией. Пока что приложение находится на стадии альфа-теста. Но на маркете уже 2.5К скачиваний))
    14 марта 2013 г. 1:38
  • Так, а Вы в своем приложении, также как и в примере вызываете метод 

     SetPushNotification_Click

    через нажатие кнопки?! или как!?

    14 марта 2013 г. 17:14
  • через нажатие кнопки. По разному пробовал. И с этим именем, и с другими. В моем проекте пример просто не работает.
    14 марта 2013 г. 17:38
  • А можете выложить код своей программы? 

    И кстати проверьте подключение вашего эмулятора к интернету, через Internet Explorer. Может в этом проблема? А может Вы мало времени выжидаете? порой требуется секунд 5 для получения url.

    А еще можете попробовать вставить код

    HttpNotificationChannel myChannel;
    bool isNewChannel = false;
     string myChannelName = "MyChannel";
     
    myChannel = HttpNotificationChannel.Find(myChannelName);
     
    if (myChannel == null)
     {
    myChannel = new HttpNotificationChannel(myChannelName);
    isNewChannel = true;
     
     } 
    
     myChannel.ChannelUriUpdated +=
     new EventHandler<NotificationChannelUriEventArgs>
    (myToastChannel_ChannelUriUpdated);
     
      
     //регируем на получение Toast оповещения 
    //при запущеном приложении
    myChannel.ShellToastNotificationReceived += 
    new EventHandler<NotificationEventArgs>
    (myToastChannel_ShellToastNotificationReceived);
     
     
     if (isNewChannel)
     myChannel.Open();
     
    // говорим о том, что у нас будут toast оповещения
     if (!myChannel.IsShellToastBound)
    myChannel.BindToShellToast();
     
     
    // если канал был раньше – посылаем URI сервису
    if (!isNewChannel)
    SendURIToService(myChannel.ChannelUri);
                
    }
    
           
    
            

    в метод  Application_Launching в App.xaml.cs

    ну и не забудьте в App.xaml.cs про 

    void myToastChannel_ChannelUriUpdated
            (object sender, NotificationChannelUriEventArgs e)
            {
                // здесь мы должны были бы отослать URI нашему сервису
                // просто выводим, для использования в тестировании
                // из-за взаимодействия c UI - используем Dispatcher
                Dispatcher.BeginInvoke(() => SendURIToService(e.ChannelUri));
            }
    
            void SendURIToService(Uri channelURI)
            {Debug.WriteLine(channelURI.ToString());
              
            }
        }
    }


    • Изменено ProstoKorol 14 марта 2013 г. 18:06
    14 марта 2013 г. 18:05
  • Спасибо, я попробую ваш код встроить. Я тестирую на реальном устройстве(Nokia L800). Я пробовал ждать. Доходило и до 40 минут(просто пришлось отлучится) И ничего не пришло.
    15 марта 2013 г. 1:51
  • Уважаемый пользователь!

    В вашей теме отсутствует активность более 5 дней. Тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме

    26 марта 2013 г. 15:42
    Модератор
  • через нажатие кнопки. По разному пробовал. И с этим именем, и с другими. В моем проекте пример просто не работает.

    А через Azure mobile services пробовали?
    27 марта 2013 г. 15:50