SimpleSamples-WindowsPhone ru

Ask tech team
From QuickBlox Developers (API docs, code samples, SDK)
Jump to: navigation, search

Contents

Введение

Каждый сэмпл представляет собой стандартный одностраничный проект WP7. В стандартном классе App.xaml.cs происходит инициализация необходимых компонент. В главной странице приложения MainPage.xaml.cs непосредственно выполняются операции с сервисами QuickBlox. Каждый сэмпл состоит из четырех компонент: инициализация контекста и установление соединения с сервером, инициализация определенного сервиса, реализация обработчика ответов и методы, которые отправляют команды на сервер.

Инициализация контекста и установление соединения с сервером происходят в каждом сэмпле одинаково в App.xaml.cs:

private const int AppID = 150;
private const int OwnerID = 4331;
private const string AuthKey = "8vXrOPEEXFacuEa";
private const string AuthSecret = "Up3AjdkjEDAzraL";
 
public QuickBloxSDK_Silverlight.QuickBlox QBlox
{ get; set; }
 
public App()
    {
         this.QBlox = new QuickBloxSDK_Silverlight.QuickBlox(AppID, OwnerID,   AuthKey, AuthSecret, null, true);
          UnhandledException += Application_UnhandledException;
          InitializeComponent();
          InitializePhoneApplication();
     }

SimpleSample-Users-WindowsPhone7

Демонстрирует работу с пользователями в QuickBlox. Позволяет добавлять, удалять, редактировать и т.д.

В MainPage() получим наш контекст и назначим eventHandler для сервиса:

//Set up service Context for this Page
this.appContext = App.Current as App;
this.QBlox = this.appContext.QBlox;
this.QBlox.userService.UserServiceEvent += new QuickBloxSDK_Silverlight.users.UserService.UserServiceHeandler(userService_UserServiceEvent);

Пишем сами команды-запросы. Каждая команда запускается по тапу пункта меню:

1. Получить всех пользователей:

 this.QBlox.userService.GetUsers();

2. Получить определенного пользователя:

 this.QBlox.userService.GetUser(this.TestUser.id, false);

3. Добавить нового пользователя:

User user = new User(); 
user.Email = "vova@rsk-k161.com"; 
user.Password = "123456"; 
...
this.Password = user.Password; 
this.QBlox.userService.AddUser(user);

4. Изменить данные определенного пользователя:

... 
this.TestUser.Website = "Kreditstore.org"; 
this.QBlox.userService.EditUser(this.TestUser);

5. Удалить пользователя:

this.QBlox.userService.DeleteUser(this.TestUser.id, false);

6. Аутентифицировать пользователя:

 this.QBlox.userService.Authenticate(this.QBlox.Username, this.Password);

Необходимо реализовать обработку ответов от сервера (реализация userService_UserServiceEvent(QuickBloxSDK_Silverlight.users.UserServiceEventArgs Args) ). Команды посылают запросы на сервер в асинхронном режиме. Обработчик же в свою очередь отлавливает их. Для работы обработчика в асинхронном режиме необходимо использовать Dispatcher:

Dispatcher.BeginInvoke(new Action(() => { ... })

Внутри него мы получаем и обрабатываем результаты, находящиеся в аргументе. Для начала определяем какую команду необходимо было выполнить: Args.currentCommand (например, GetUsers, GetUser, DeleteUser и т.д.). Затем проверяем успешность выполнения данного запроса:

QuickBloxSDK_Silverlight.Core.Status. [OK, ValidationError, AuthenticationError, NotFoundError, AccessDenied, ContentError, StreamError]).

В результате получаем либо ответ об удачном/неудачном выполнении запроса, либо еще и данные. Например:

User user = (User)Args.result;

SimpleSample-Geo-WindowsPhone7

Демонстрирует работу с сервисом Location и оперирует объектами GeoData. Показывает как добавлять местоположения, удалять их, делать выборки и т.д. Необходимо отметить, что сервис Users используется везде, так как все действия требуют аутентификацию. Необходимый функционал содержится как раз в этом классе.

Аналогичным образом назначаем контекст и eventHandler:

this.appContext = App.Current as App;
this.QBlox = this.appContext.QBlox;
this.QBlox.geoService.GeoServiceEvent += new QuickBloxSDK_Silverlight.Geo.GeoService.GeoServiceHeandler(geoService_GeoServiceEvent);
this.QBlox.userService.UserServiceEvent += new QuickBloxSDK_Silverlight.users.UserService.UserServiceHeandler(userService_UserServiceEvent);

Пишем сами команды-запросы. Каждая команда запускается по тапу пункта меню:

1. Получить все геодаты, 10 записей первой страницы:

this.QBlox.geoService.GetGeoLocationsForApp(1, 10);

2. Получить 5 объектов GeoData с первой страницы для ID пользователя равного 518:

this.QBlox.geoService.GetGeoLocationsForUser(518, 1, 5);

3. Получить GeoData по ID:

this.QBlox.geoService.GetGeoLocation(12317);

4. Добавить новую локацию (объект GeoData)

this.QBlox.geoService.AddGeoLocation(new GeoData(518, decimal.Parse("51,46546546"), decimal.Parse("122,6565465"), "Hi"));

Аналогичным образом реализуем eventHandler – geoService_GeoServiceEvent!

SimpleSample-BackgroundMode-WindowsPhone7

Данный сэмпл показывает каким образом использование background режима помогает в построении качественного приложения. Данный режим позволяет всегда иметь возможность через контекст обратиться и получить:

  • Всех пользователей приложения;
  • Все локации (объекты GeoData) приложения;
  • Проверить соединение с сервером.

Для того, чтобы запустить данный режим необходимо задать интервал опроса сервера и дать команду на старт:

this.QBlox = new QuickBloxSDK_Silverlight.QuickBlox(AppID, OwnerID, this.AuthKey, this.AuthSecret, null, true);
this.QBlox.BackgroundEvent += new QuickBloxSDK_Silverlight.QuickBlox.BGR(QBlox_BackgroundEvent);
this.QBlox.PingInterval = 5;
this.QBlox.BackgroundUpdateStart();

Теперь мы можем отлавливать каждое обновление и выполнять необходимые действия. Для этого необходимо лишь создать eventHandler для данного режима:

this.QBlox.BackgroundEvent += new QuickBloxSDK_Silverlight.QuickBlox.BGR(QBlox_BackgroundEvent);

Команды представляют собой строки: "users" (User[] users = (User[])Result;) , "geodata" (GeoData[] geo = (GeoData[])Result;), "Connection", "Online", "Offline".

            var MainContext = App.Current as App;
     this.QBlox = MainContext.QBlox;
     this.QBlox.BackgroundEvent += new QuickBloxSDK_Silverlight.QuickBlox.BGR(QBlox_BackgroundEvent);
 
switch (Command)
      {
         case "users":
             {
                User[] users = (User[])Result;
                this.MainText.Text += "Users updates : " + users.Length.ToString() + " elements count \n-------------\n";
                break;
             }
          case "geodata":
             {
                GeoData[] geo = (GeoData[])Result;
                this.MainText.Text += "GeoData updates : " + geo.Length.ToString() + " elements count \n-------------\n";
                break;
             }
          case "Connection":
             {
                 this.MainText.Text = "App connection...\n";
                 break;
             }
          case "Online":
             {
                 this.MainText.Text = "App online \n";
                 break;
             }
          case "Offline":
             {
                 this.MainText.Text = "App offline\n";
                 break;
             }
      }

SimpleSample-chat_locations-wp7

Данный пример показывает как можно реализовать простой чат, используя несколько сервисов библиотеки QuickBlox. Идея работы примера построена на статье [[1]]. Весь Функционал (получение всех сообщений, отправка нового сообщения) строится на 3 сервисах библиотеки QuickBlox:

  1. Background Mode - реализует автоматическое получение сообщений
  2. User Service - аутентификация
  3. GeoService - работа с сообщениями (основа для хранения кодированных xml-структур)

Для работы чата используются два основных класса (MessageManager и Message), последний представляет собой "обертку" над объектами GeoData, а первый методы для работы с объктами Message.

Для работы чата назначаем контекст и eventHandler'ы необходимых сервисов:

this.appContext = App.Current as App;
//Create context     
this.QBlox = MainContext.QBlox;
//Add event handler for GeoService events
this.QBlox.geoService.GeoServiceEvent += new GeoService.GeoServiceHandler(geoService_GeoServiceEvent);
//Add event handler for Background events
this.QBlox.BackgroundEvent += new QuickBloxSDK_Silverlight.QuickBlox.BGR(QBlox_BackgroundEvent);

В обработчике событий background режима реализуется аутентификация пользователя и обработка полученного массива GeoData объектов:

//Authenticate sample user (Jane)
this.QBlox.userService.Authenticate("Jane", "123456");
 
//Get from all geoData all chat Messages
var res = MessageManager.GetChatMessages(QBlox.GeoData);           
//Update chat list
if (res != null && CommonMessages != null)
{
   if (res.Count() != CommonMessages.Count())
   for (int i = CommonMessages.Count(); i < res.Count(); i++)
      CommonMessages.Add(res[i]);
}

Осталось только добавить возможность создавать сообщение и отправлять его:

//ID of Sample User
int UserID = 578;
//Post new Message 
this.QBlox.geoService.AddGeoLocation(new GeoData(UserID, 0, 0, MessageManager.CreateChatMessage(chatField.Text)));

SimpleSample-messages_users_background-wp7

Данный пример показывает как Вы можете реализовать push-нотификацию, используя сервисы QuickBlox. 1. Вам необходимо подключить контекст библиотеки QuickBlox и описать обработчиков для основных используемых сервисов. Для работы понадобятся 2 базовых (BackgroundMode для определения статуса приложения, UserService для аутентификации) и pushNotificationService:

//Create context
var MainContext = App.Current as App;
this.QBlox = MainContext.QBlox;
//Add event handler for Background events
this.QBlox.BackgroundEvent += new QuickBloxSDK_Silverlight.QuickBlox.BGR(QBlox_BackgroundEvent);
//Add event handler for User Service events
this.QBlox.userService.UserServiceEvent += new UserService.UserServiceHandler(userService_UserServiceEvent);
//Add event handler for Push Notification events
this.QBlox.pushNotificationService.PushNotificationServiceEvent += new PushNotificationService.PushNotificationServiceHandler(pushNotificationService_PushNotificationServiceEvent);

2. Затем Вы должны создать канал (получить от сервера Microsoft) или взять его из особого хранилища в приложении:

this.Channel = HttpNotificationChannel.Find(ChannelName);

или

this.Channel = new HttpNotificationChannel(ChannelName);

3. Надо описать обработчиков для пришедших нотификаций и в первую очередь для ShellToastNotification:

//Set the event handler when toast notification received
this.Channel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(delegate(object senderObj, NotificationEventArgs arg)
{
   StringBuilder sb = new StringBuilder();
   foreach (string key in arg.Collection.Keys)
      sb.AppendFormat("{0}:{1}\n", key, arg.Collection[key]);
   string result = sb.ToString();
});

4. Теперь можно работать с нотификациями. Для этого после того как Вы подключились и удачно аутентифицировались, необходимо получить token для нотификаций, который определяет вашу подписку:

//If User has been connected then create token for push                            this.QBlox.pushNotificationService.CreatePushToken(this.Channel.ChannelUri.ToString());
void pushNotificationService_PushNotificationServiceEvent( QuickBloxSDK_Silverlight.PushNotification.PushNotificationEventArgs Args)
{            
   this.Dispatcher.BeginInvoke(new Action(() => 
   {
      if (Args.currentCommand == PushNotificationCommand.CreatePushToken)
      {
         this.URLPush = ((PushToken)Args.result).ClientIdentificationSequence;
         this.PushTokenId = ((PushToken)Args.result).Id;
      }
   }));
}

5. Имея PushTokenId и URLPush, мы можем создать подписку на уведомления или подписаться на уведомления:

//Create subscription
this.QBlox.pushNotificationService.CreateSubscription(this.URLPush, QuickBloxSDK_Silverlight.PushNotification.NotificationType.mpns);

6. Теперь мы можем отправлять уведомления через админку всем подписанным пользователям, либо мы можем из программы отправить уведомление любому пользователю, id которого мы знаем и который подписан на уведомления данного приложения:

string notificationHeader = "Simple Push Notification";
string textMesssage = "This is test notification. Please try it.";
 
//Page that will be opened when you tap on the toast.
string pagePath = "/Main.xaml";
 
/Create new Notifications with Title and Text
string notificationMessage = new PushNotification(PushNotificationType.Toast, notificationHeader,textMesssage, pagePath).ToBase64String();
 
//Create notification
//In order to make it work you need to put your message between  "mpns=" and "26headers=Q29udGV..."
this.QBlox.pushNotificationService.CreateEvent(new int[] { SimpleUserId },
"mpns=" + notificationMessage + "%26headers=Q29udGVudC1UeXBlLHRleHQveG1sLENvbnRlbnQtTGVuZ3RoLDIxOCxYLU5vdGlmaWNhdGlvbkNsYXNzLDIsWC1XaW5kb3dzUGhvbmUtVGFyZ2V0LHRvYXN0");

See also

Sources

Project homepage on GIT — https://github.com/QuickBlox/SimpleSample-Users-WindowsPhone7

Clone from GIT dev version — git@github.com:QuickBlox/SimpleSample-Users-WindowsPhone7.git

Download ZIP for dev version — https://github.com/QuickBlox/SimpleSample-Users-WindowsPhone7/zipball/master