52
5 июля 2013 Создание современных приложений с Visual Studio 2013 Ефимцева Наталия, [email protected] Работа c облачным бэкендом мобильных приложений

Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Embed Size (px)

DESCRIPTION

Windows Azure Mobile Services – быстрый и функциональный мобильный бэкенд

Citation preview

Page 1: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

5 июля 2013

Создание современных приложений с Visual Studio 2013

Ефимцева Наталия, [email protected]Работа c облачным бэкендом мобильных приложений

Page 2: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Mobile Services – быстрый и функциональный мобильный бэкенд

Page 3: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Windows Azure Mobile Services

Data

Notifications

Auth

Server Logic

Scheduler

Logging & Diag

Scale

Page 4: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Mobile Service: что нового? Продакшен – 99.9% SLA

БД 20МБ бесплатно CLI Планировщик Custom API Source Control (git) Общий код

NPM Android SDK HTML + JS SDK Поддержка WP7.x

Page 5: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Приложение My TODO

Page 6: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Мультиплатформенность

Page 7: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Вам не нужно создавать отдельный мобильный сервис к каждой платформе!

Page 8: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Подключайте их все!

Page 9: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Мультиплатформенность

Page 10: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Смешарики

• Используют Mobile Services в Windows 8, Windows Phone, iOS, Android приложениях

Page 11: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Push-нотификации

Page 12: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Единая платформа для pushWindows Store

push.wns.sendToastText04(item.channel, {text1: text}, … );

Windows Phone

push.mpns.sendFlipTile(item.channel, {title: text}, …);

iOS

push.apns.send(item.token, { alert: text, payload: { inAppMessage: Details }}, …);

Android

push.gcm.send(item.registrationId, item.text, …);

Page 13: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013
Page 14: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Единая платформа для pushfunction sendNotifications() {

var deviceInfoTable = tables.getTable('DeviceInfo');

deviceInfoTable.where({ userId : user.userId }).read({

success: function(deviceInfos){

deviceInfos.forEach(function(deviceInfo){

if (deviceInfo.uuid != request.parameters.uuid) {

if (deviceInfo.pushToken != null && deviceInfo.pushToken != 'SimulatorToken') {

if (deviceInfo.platform == 'iOS') {

push.apns.send(deviceInfo.pushToken, {

alert: "New something created"

} , { //success / error block});

} else if (deviceInfo.platform == 'Android') {

push.gcm.send(deviceInfo.pushToken, "New something created", { success / error block});

}

}

}

});

}

});

}

Page 15: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Не забывайте проверять ответ при возврате от notification-сервера ошибке (или getFeedback для APNS)

Page 16: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Добавим toast-уведомления

Page 17: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Виртуальные таблицы

Page 18: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Создание таблицыЕе использование как endpoint’аТ.е. нет вызова request.Execute

Page 19: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Собственный код\API

Page 20: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

• Скрипты, не привязанные к таблице• Доступ как• GET• POST• PUT• PATCH• DELETE

• Разделение прав

Собственный код\API

Page 21: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Обновим тайл через Custom API

Page 22: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Работа с хранилищем (Azure Storage)

Page 23: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Это возможноЭто еще не совершенноРеализуется через серверные скрипты и модули

Page 24: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Чтением данных из таблицыvar azure = require('azure');

function read(query, user, request) {

var accountName = 'accountname';

var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';

var host = accountName + '.table.core.windows.net';

var tableService = azure.createTableService(accountName, accountKey, host);

tableService.queryTables(function (error, tables) {

if (error) {

request.respond(500, error);

} else {

request.respond(200, tables);

}

});

}

Page 25: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Работа с BLOB’амиvar azure = require('azure'), qs = require('querystring');

function insert(item, user, request) {

var accountName = 'accountname';

var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';

var host = accountName + '.blob.core.windows.net';

var blobService = azure.createBlobService(accountName, accountKey, host);

var sharedAccessPolicy = {

AccessPolicy: {

Permissions: 'rw', //Read and Write permissions

Expiry: minutesFromNow(5)

}

};

var sasUrl = blobService.generateSharedAccessSignature(request.parameters.containerName,

request.parameters.blobName, sharedAccessPolicy);

var sasQueryString = { 'sasUrl' : sasUrl.baseUrl + sasUrl.path + '?' + qs.stringify(sasUrl.queryString) };

request.respond(200, sasQueryString);

}

function minutesFromNow(minutes) {

var date = new Date()

date.setMinutes(date.getMinutes() + minutes);

return date;

}

Page 26: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Работа с BLOB’ами

Page 27: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Работа с email

Page 28: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013
Page 29: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Отправка сообщения//var crypto = require('crypto');

//item.tempId = new Buffer(crypto.randomBytes(16)).toString('hex');

function sendEmail(item) {

var sendgrid = new SendGrid('[email protected]', 'mypassword');

var email = {

to : item.email,

from : '[email protected]',

subject : 'Welcome to MyApp',

text: 'Thanks for installing My App! Click this link to verify:\n\n'

+ 'http://myapp.azurewebsites.net/activate.html?id=' + item.id + '&tid=' + item.tempId,

createDate : new Date()

};

sendgrid.send({

to: item.email,

from: email.from,

subject: email.subject,

text: email.text

}, function(success, message) {

// If the email failed to send, log it as an error so we can investigate

if (!success) {

console.error(message);

} else {

saveSentEmail(email);

}

});

}

Page 30: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Отправим письмо

Page 31: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

DelegatingHandler’ы

Page 32: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

На стороне клиентаПерехватывают запросы и ответы

Page 33: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Добавляет версию к каждому запросуpublic static MobileServiceClient MobileService = new MobileServiceClient( "https://<your subdomain>.azure-mobile.net/", "<your app key>", new VersionHandler()); using System;using System.Net.Http;using System.Threading.Tasks;namespace WindowsStore{ public class VersionHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,

System.Threading.CancellationToken cancellationToken) { request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.ToString() + "?version=v2"); return base.SendAsync(request, cancellationToken); } }}

Page 34: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Работа с версиями в серверном скриптеfunction insert(item, user, request) {

if (request.parameters.build < 2.0) {

item.description = 'Not entered';

}

request.execute({

success : function() {

if (request.parameters.build < 2.0) {

delete item.description;

}

request.respond();

}

});

}

Page 35: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Версионность

Page 36: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013
Page 37: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Авторизация: кэширование токена

Page 38: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Кэширование в .NETpublic static class CredentialLocker    {        private const string RESOURCE= "MobileServices";        public static void AddCredential(string username, string password) {            var vault = new PasswordVault();            var credential = new PasswordCredential(RESOURCE, username, password);            vault.Add(credential);        }        public static PasswordCredential GetCredential() {                        PasswordCredential credential = null;                        var vault = new PasswordVault();                        try {                                        credential = vault.FindAllByResource(RESOURCE).FirstOrDefault();                                if (credential != null){                                                               credential.Password = vault.Retrieve(RESOURCE, credential.UserName).Password;                        }                }    

catch (Exception)    { //creds not found       }

            return credential;        }

        public static void RemoveCredential(string username) {                var vault = new PasswordVault();                try {                        // Removes the credential from the password vault.                        vault.Remove(vault.Retrieve(RESOURCE, username));                }                catch (Exception)    { //creds not stored       }        }    }

Page 39: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Получение токенаSetting:

MoblieServiceUser user;user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);CredentialLocker.AddCredential(user.userId, user.MobileServiceAuthenticationToken);

Getting:

var credential = CredentialLocker.GetCredential();if (credential != null){ MobileService.CurrentUser = new MobileServiceUser(credential.UserName); MobileService.CurrentUser.MobileServiceAuthenticationToken =

credential.Password; }

Page 40: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Авторизуемся с Google

Page 41: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Авторизация: обновление токена

Page 42: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Обновление токенаЗапрос (request)

Проверка ответа (response) на 401 код ошибки Повторный login

пользователя

Обновление запроса (request) новым токеном

Повторная отправка запроса (request)

Обновление UI

Page 43: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

DelegationHandlers (снова)public class VersionHandler : DelegatingHandler{ protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,

System.Threading.CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); while (response.StatusCode == HttpStatusCode.Unauthorized) { try { await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook); request.Headers['X-ZUMO-AUTH'] =

App.MobileService.CurrentUser.MobileServiceAuthenticationToken; } catch (Exception ex) {}

response = await base.SendAsync(request, cancellationToken); } } }

Page 44: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Получение данных постранично

Page 45: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

На клиентеНа сервере

Page 46: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

На клиентеC#:IMobileServiceTableQuery<TodoItem> query = todoTable .Where(todoItem => todoItem.Complete == false) .Skip(3) .Take(3);items = await query.ToCollectionAsync();ListItems.ItemsSource = items;

iOS:NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"];MSQuery * query = [self.table queryWithPredicate:predicate];query.includeTotalCount = YES; // Request the total item count

query.fetchOffset = 3;query.fetchLimit = 3;

[query readWithCompletion:^(NSArray *results, NSInteger totalCount, NSError *error) { …

Android:mToDoTable.where().field("complete").eq(false).skip(3).top(3) .execute(new TableQueryCallback<ToDoItem>() {

Page 47: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

На сервереOption 1:query.where({complete: false}) .take(3) .skip(3);

Option 2:var q = query.getComponents();q.take = 3;q.skip = 1;query.setComponents(q);

Option 3:query.where(function() {

return this.complete == false}) .take(3) .skip(3);

Page 48: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Поддержка Source Control

Page 49: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Включается на порталеСоздается git репозиторийКопируем локально, работаем, обновляем удаленный репозиторийДобавление NPM модулей

Page 50: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Интеграция с Git и добавление node-uuid

Page 51: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

Windows Azure Mobile Services

Page 52: Работа c облачным бэкендом мобильных приложений в Visual Studio 2013

© 2012 Microsoft Corporation. All rights reserved. Microsoft, Windows, and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

Ефимцева Наталия[email protected]@nefimtseva

Команда Windows Azure в России – [email protected]