На правах рекламы:
ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Авторитетность издания

ВАК - К1
RSCI, ядро РИНЦ

Добавить в закладки

Следующий номер на сайте

4
Ожидается:
09 Сентября 2024

Разработка мобильного приложения онлайн-радио

Development of an online radio mobile application
Дата подачи статьи: 24.03.2016
УДК: 004.42
Статья опубликована в выпуске журнала № 2 за 2016 год. [ на стр. 185-194 ]
Аннотация:Статья посвящена проблеме информирования студентов и абитуриентов вузов и частичному ее решению с помощью студенческих СМИ и мобильных приложений к ним, в частности, студенческого радио. Студенческое радио – это не просто площадка для тренировки журналистов и специалистов по работе со звуковым оборудованием, но и отличный механизм для освещения каких-либо новостей и важных событий как в прямом эфире, так и в записи. Мобильное приложение позволяет получить доступ к контенту радиостанции из любого места, в котором имеется соединение с сетью. Оно может сочетать в себе не только средства для воспроизведения потока с сервера, но и множество других методов быстрого и удобного доступа к источникам информации различных типов. В статье описаны способы передачи данных от сервера к клиентам, требуемый базовый функционал приложения на основе аналитики, собранной за время тестирования приложения, структура разработанной версии мобильного приложения для онлайн-радио Тверского государственного технического университета и приведены алгоритмы работы некоторого его функционала. Дано также описание аспектов работы с API-запросами, с данными в формате JSON, самих этих данных, приведены примеры API-запросов.
Abstract:The article considers the problem of informing the students and applicants of higher education institutions. The authors suggest solving this problem partially using student media and mobile applications, in particular a student radio. A student radio is not just a platform for training of journalists and specialists working with sound equipment, but is also a great mechanism for treatment of news and important events, live or not. An announcer during thematic broadcasting may announce whatever he will be asked or make a note which will include the etheric grid, thus the people listening to the broadcasting at this point will already be aware of what is happening. The mobile application allows accessing radio content from any location with a connection to the network. It may combine not only the means for reproducing the stream from the server, but also many other methods of quick and easy access to different information sources. The article describes data transfer methods from the server to clients, required basic functionality based on analytics for testing tie and the structure of the developed mobile application for on-line radio of the Tver State Technical University. There are also operating algorithms of its services. This article describes the aspects of working with the API requests and JSON data. It also gives the examples of API requests.
Авторы: Бычковский Д.Ю. (mealtris@gmail.com) - Тверской государственный технический универс (студент), Тверь, Россия, Абу-Абед Ф.Н. (aafares@mail.ru) - Тверской государственный технический университет (доцент, декан), Тверь, Россия, кандидат технических наук, Хабаров А.Р. (al_xabarov@mail.ru) - Тверской государственный технический университет (доцент), Тверь, Россия, кандидат технических наук, Карельская К.А. (kak69@yandex.ru) - Тверской государственный технический универс (доцент), Тверь, Россия, кандидат технических наук
Ключевые слова: api, потоковое аудио, разработка клиент-серверного по, мобильные приложения
Keywords: api, streaming audio, client-server software, mobile application
Количество просмотров: 8174
Версия для печати
Выпуск в формате PDF (7.11Мб)
Скачать обложку в формате PDF (0.37Мб)

Размер шрифта:       Шрифт:

В настоящее время информирование студентов и абитуриентов вузов традиционными способами становится все более и более проблемным. Молодежь предпочитает получать информацию по сети Интернет, большие текстовые публикации, как правило, ею игнорируются. Поэтому в Тверском государственном техническом университете (ТвГТУ) было принято решение о создании собственной радиостанции информационно-развлекательного характера, предназначенной для сообщения важной информации в более привычном для молодого поколения формате.

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

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

Необходимый функционал приложения

Во время разработки приложения для ТвГТУ изучался функционал приложений крупных радиостанций региона и проводился опрос среди студентов вуза. Был определен базовый функционал для подобных приложений и выявлен ряд их недостатков.

Так как приложение прежде всего является му- зыкальным плеером, оно должно отображать название текущей играющей композиции, хранить историю воспроизведения и иметь возможность сохранения списка избранных композиций. Также необходимо реализовать поиск музыки в магазине, а сам плеер связать с системными элементами управления музыкой и сделать возможным его работу в фоновом режиме для обеспечения возможности управления плеером из любого места системы. В мобильных операционных системах [1] есть элементы управления музыкой, к которым можно получить доступ из любого места системы и приложения. Подключение к этим элементам (на примере iOS) осуществляется путем подписки на системное событие [2], возникающее при нажатии на один из этих элементов.

Чтобы пользователи могли знать о времени трансляции той или иной передачи, нужно реализовать блок расписания трансляций, в котором устанавливается напоминание о них из приложения в системный календарь. Для этого нужно запросить разрешение у пользователя на редактирование календаря, определить на текущую или следующую неделю напоминание в зависимости от того, прошла эта трансляция или нет, добавить описание, а затем установить новое событие в календарь [3].

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

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

Нельзя игнорировать и сервисные части приложения. Приложение сохраняет все настройки, которые выбирает пользователь, в память устройства и туда же кеширует данные, загружаемые в новостных или любых других блоках клиент-серверной части. Необходимо реализовать функции, которые позволили бы совершить сброс этих данных к стандартным параметрам для восстановления стабильности при обнаружении сбоев в работе приложения. Также необходим раздел для обращения в техподдержку для помощи пользователям в настройке приложения или разрешения различного рода проблем, связанных с его работой.

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

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

Этапы реализации приложения

Ранее было разработано мобильное приложение для онлайн-радио ТвГТУ, для которого и проводилась аналитика потребностей функционала в подобных приложениях. Сначала тестировался базовый функционал, имеющийся у приложений крупных радиостанций региона, а именно:

-      сам плеер;

-      отображение названия играющей композиции;

-      возможность просмотра новостей;

-      меню в виде отдельного окна в приложении;

-      ручной выбор аудиопотока с сервера.

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

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

-      изменение оформления приложения пользователем путем выбора из готовых вариантов и из картинок с устройства пользователя, а также фотографирования;

-      просмотр расписания программ на неделю с возможностью установки напоминания;

-      прослушивание записей прошедших трансляций внутри приложения;

-      просмотр видео в новостях;

-      открытие изображений из новости в полноэкранном виде с возможностью увеличения;

-      просмотр истории воспроизведения композиций за время текущего сеанса работы приложения;

-      сохранение понравившейся композиции в список избранных с возможностью его редактирования;

-      поиск выбранной композиции в магазине или сети Интернет;

-      управление разработанным алгоритмом контроля трафика, следящего за стабильностью соединения и алгоритмом контроля ресурсов системы, отключающего неиспользуемые графические элементы в целях экономии заряда аккумулятора;

-      отправка вопроса в техподдержку;

-      сброс приложения к заводским параметрам;

-      авторизация в соцсети, требующая ввода данных учетной записи только один раз, выполняющая последующие запросы доступа автоматически, при этом не сохраняя никакие данные об учетной записи пользователя в памяти.

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

Была изучена аналитика просмотров и загрузок приложения в магазине, и с ее учетом принято решение о добавлении в приложение автоматически меняющейся локализации всего текста на английский язык, если системный язык не является русским или украинским. На рисунке 1 показана аналитика сервиса от компании Apple для разработ- чиков, собранная с устройств, на которых было разрешено отправление данных о работе приложений сторонних разработчиков в настройках системы. Эти данные могут отличаться от фактиче- ских.

Внешний вид и внутренняя структура

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

На рисунке 2 изображен главный экран с элементами управления плеером, переключателями отображения истории прослушанных композиций, анонса срочной информации и избранных записей. В правой части изображения находится меню приложения, доступное из любого его окна, через которое осуществляются переходы между окнами.

Изменить оформление можно путем выбора нового фонового изображения. В дальнейшем оно размывается и затемняется приложением, а затем сохраняется в его данных так, чтобы любое окно могло его получить. Каждое окно вынимает готовое изображение и устанавливает его себе в качестве фонового.

После внедрения подобной системы вопросы относительно оформления больше не поступали. В дальнейшем планируются только добавление возможности переключения темного режима на светлый и модификация внешнего вида некоторых других окон приложения.

При реализации приложения в качестве потокового плеера был выбран бесплатный пакет классов STK Audio Player [4], позволяющий подключаться к потоку по заданной ссылке и воспроизводить его. Этот плеер более стабильно работает при плохих условиях связи, чем стандартный системный, имеет возможность усиливать звук и способен возвращать метрику выходной громкости аудиосигнала, на основе данных из которой были построены анимация, визуализация и аудио на главном экране приложения. Внедрение этого плеера увеличило скорость подключения к потоку и исправило проблему, из-за которой при плохих условиях связи приложение могло аварийно завершить работу.

Для реализации бокового меню, доступного из всех окон приложения, был использован бесплатный пакет классов AM Slide Menu [5], добавляющий возможность организации той иерархии приложения, которую можно видеть сейчас. К сожалению, в iOS нет стандартного решения для организации меню подобных типов, поэтому и был использован этот пакет классов. Он позволяет организовать и модифицировать меню так, как требуется, и не вызывает особой сложности при внедрении в проект.

При реализации голосований, расписания, сообщений анонсов и техподдержки был использован сервис хранения БД Firebase, предоставляющий удобное SDK для работы с ним на мобильных платформах. Этот сервис способен в реальном времени обновлять информацию, изменяющуюся в базе, на устройствах, подключенных к сервису и просматривающих эти данные. Этот сервис идеально подошел для реализации голосований, в которых нужна актуальная информация, обновляющаяся автоматически.

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

Принцип работы

В сетях IP существуют три основных способа передачи данных: Unicast, Broadcast, Multicast [6]  (рис. 4). Тип передачи данных Unicast (индивидуальный) используется для обычной передачи данных от хоста к хосту. Способ Unicast работает в клиент-серверных и пиринговых (peer-to-peer, от равного к равному) сетях. Тип передачи Multicast разрабатывался для сбережения пропускной способности в IP-сетях. Такой тип уменьшает трафик, позволяя хостам отправить один пакет выбранной группе хостов. Broadcast (бродкаст) – процесс отправки пакета от одного хоста ко всем хостам в сети.

Для обеспечения трансляции эфиров лучше использовать Multicast, чтобы снизить требования к пропускной способности сервера [7].

При нажатии на кнопку воспроизведения в главном окне приложения плеер осуществляет подключение к выбранному пользователем потоку сервера и начинает его воспроизведение в случае успеха, при этом на каждом этапе подключения плеер сообщает главному окну о своем состоянии методом рассылки событий (рис. 5), а само главное окно уже меняет индикаторы и сообщения о состоянии на основе полученных данных (рис. 6).

Тот же плеер во время своей работы раз в какой-то заданный промежуток времени должен обращаться к серверу для обновления информации о текущей играющей композиции. При получении этой информации он должен опре- делить, началась новая композиция или все еще звучит старая. В случае новой композиции плеер должен записать ее в историю воспроизведения и сообщить главному окну об обновлении дан- ных (рис. 7).

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

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

Приложение должно реагировать на обрывы соединения и снижение или повышение скорости интернет-соединения. При повышении скорости соединения клиента можно перевести на поток с более высоким качеством звучания, а при понижении для обеспечения беспрерывного прослушивания – на поток с менее высоким качеством. Для этого во время буферизации нужно измерить скорость соединения, выбрать оптимальный для пользователя поток и переключиться на него при первой же возможности (рис. 9). Нужно помнить, что не у всех пользователей есть возможность постоянного про- слушивания потока с максимальным качеством звучания, поэтому нужно предусмотреть возможность отключения его автоматического переключения и реализации ручного выбора. В случае мобильных устройств, использующих беспроводные технологии доступа к сети [8], часто во время воспроизведения происходит обрыв соединения. Тогда, если модуль передачи данных устройства активен, приложение должно немедленно выполнить переподключение.

Работа с API

API (application programming interface – интерфейс программирования приложений, интерфейс прикладного программирования) – набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) или операционной системой для использования во внешних программных продуктах [9].

При разработке новостных блоков, разделов расписания, техподдержки, голосований, записей трансляций необходимо использовать API для получения данных. Обычно в ответ на API-запрос сервер возвращает данные в JSON-формате, содержащем запрошенную информацию, которую нужно получить, разобрав полученные данные на нужные части.

JSON (JavaScript Object Nota­tion) – простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером [10]. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition – December 1999. JSON – текстовый формат, полностью не зависящий от языка реализации, но использующий соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.

Коллекция пар ключ/значение. В разных языках эта концепция реализована как объект, запись, структура, словарь, хэш, именованный список или ассоциативный массив.

Упорядоченный список значений. В большинстве языков это реализовано как массив, вектор, список или последовательность.

Универсальные структуры данных. Почти все современные языки программирования поддерживают их в какой-либо форме. Логично предполо- жить, что формат данных, не зависящий от языка программирования, должен быть основан на этих структурах.

Состав JSON

Объект – неупорядоченный набор пар ключ/ значение. Объект начинается с открывающей фигурной скобки и заканчивается закрывающей фигурной скобкой. Каждое имя сопровождается двоеточием, пары ключ/значение разделяются запятой.

Массив – упорядоченная коллекция значений. Массив начинается с открывающей квадратной скобки и заканчивается закрывающей квадратной скобкой. Значения разделены запятой.

Значение может быть строкой в двойных кавычках, числом, true, false, null, объектом или массивом. Эти структуры могут быть вложенными.

Для реализации блоков новостей, записей трансляций и хранения их данных в случае с приложением ТвГТУ были использованы социальная сеть vk.com и ее API [11]. В этой социальной сети удобно хранить музыкальный и различный новостной контент, располагая его в группах. Большая часть API доступна для использования без аутентификации [12] пользователя, например, получение ленты новостей группы или человека. Разберем запрос на получение новостей: http://api.vk.com/ method/wall.get?&domain=id-1& count=10&own=1&offset=0.

Здесь wall.get – метод получения записей выбранной страницы; domain – идентификатор страницы, состоящий из строки id и номера (между id и номером ставится знак «-», если вы собираетесь получить записи из сообщества, а не из чьей-то личной страницы); count – количество запрашиваемых записей; own – фильтр записей автора (ставится «1», если вы хотите получить записи, опубликованные от лица этой страницы, и «0», если хотите получить любые записи, находящиеся на ней); offset – смещение выборки записей (здесь задается номер, с которого начнется отсчет count записей).

Введя запрос, вы получите данные в формате JSON. В данном случае – библиотеку, в ключе responce которой находится массив с общим количеством записей в группе и заданным количеством записей в нем в виде библиотек, где находятся все данные, из которых состоит конкретная запись. 

Для того же метода получения аудиозаписей уже требуется аутентификация пользователя. Для ее выполнения в этой социальной сети нужно создать приложение и зарегистрировать его в ней. После регистрации приложения в соцсети можно отправить запрос на аутентификацию пользователя и получение прав доступа к нужным частям его аккаунта, а ключ, полученный в ответе на запрос, использовать для решения задач (рис. 10).

Пример запроса на получение токена:

https://oauth.vk.com/authorize?client_id=12345&scope=audio,video,groups

&redirect_uri=http://api.vk.com/blank.html&display=mobile

&response_type=token

Здесь client_id – идентификатор приложения, от имени которого будет запрошен доступ к аккаунту пользователя; scope – привилегии, нужные вашему приложению для работы; redirect_uri – страница, на которую будет переведен пользователь после ввода логина и пароля и предоставления вашему приложению запрашиваемых привилегий; display – выбор типа страницы (мобильная версия или полная); response_type=token – получение токена на этой странице.

После ввода подобного запроса у вас появится окно авторизации в данной социальной сети, в котором нужно ввести ваш логин и пароль, после чего будет предложено разрешить приложению с идентификатором client_id доступ к возможностям, указанным в scope. После подтверждения вас переведут на следующую страницу, в адресной строке которой будет находиться токен.

Чтобы воспользоваться токеном, нужно в конце API-запроса добавить строку &token=(полученный токен), после чего нужный метод будет вызван от лица авторизованного пользователя.

Срок жизни у токенов не бесконечен. Если сервер пришлет в ответ на запрос сообщение об ошибке, следует запросить новый токен.

Для реализации разделов расписания, голосований, техподдержки и блока анонса важных событий социальные сети уже будут не так удобны. Здесь лучше всего воспользоваться сервисами, предоставляющими бесплатные услуги хранения БД, например Firebase [13], который хранит все данные в JSON-формате и имеет удобное SDK для всех платформ, позволяющее работать с этой БД в режиме реального времени, присылая все измененные значения в приложение сразу же, как только они будут изменены в самой БД. Этот сервис идеально подходит для хранения информации, которую важно иметь в приложении самой свежей, или просто в случае, если нужно сделать автоматическое обновление данных.

При реализации расписаний с возможностью установки напоминаний важно учитывать, что выбранное пользователем событие могло уже пройти на этой неделе или может быть отменено на этой неделе. Тогда нужно либо запретить установку напоминания об этом событии, либо перенести его на следующую неделю. В приложении для онлайн-радио ТвГТУ это работает по алгоритму, представленному на рисунке 11.

Нужно помнить, что каждая новость, включающая изображения или видео, каждая прослушанная запись трансляции, как и любая другая информация, загруженная приложением, может быть сохранена им же в кэше. Иногда это может приводить к ошибкам или некорректной работе приложения. Чтобы не принуждать пользователя удалять, а затем заново загружать приложение для исправления редко возникающих ошибок, связанных с кэшем, нужно добавить в корневой класс, который уйдет из памяти только вместе с закрытием приложения, функцию, восстанавливающую исходные параметры приложения (рис. 12). В нашем приложении эта функция вызывается из раздела «О приложении» выбором пункта «Сброс настроек». Приложение спросит у пользователя согласие на выполнение операции, а в случае подтверждения удалит весь кэш, данные пользователя, его настройки и вернется к стандартным параметрам, заложенным в корневом классе.

В заключение отметим, что правильно построенное мобильное приложение информационной направленности может сильно упростить поиск пользователями самой важной информации. Студенческая радиостанция призвана доносить информацию вуза в информационно-развлекательном формате до студентов, а мобильные приложения помогут организовать доступ к этой информации из любого места, в котором у пользователя есть доступ к сети Интернет, и сделать его более удобным и структурированным.

В новую версию приложения были внедрены системы тематических голосований и голосований в реальном времени, предназначенные для использования во время фестиваля «Студенческая весна-2016», что должно повысить количество загрузок данного приложения еще на 15 %.

Рассмотренное в данной статье приложение участвовало в различных конкурсах и олимпиадах. С ним была одержана победа во всероссийском конкурсе в сфере развития органов студенческого самоуправления «Студенческий актив» в номинации «Лучший проект в сфере развития научно-исследовательской деятельности студентов» в 2015 году, а также было занято первое место в ЦФО и пятое место по России в олимпиаде «IT-Планета 2014/15» в конкурсе «Разработка мобильных приложений». Это доказывает, что приведенная в данной статье структура и предложенный необходимый функционал имеют право на жизнь.

Литература

1.     Операционная система. URL: https://ru.wikipedia.org/ wiki/Операционная_система (дата обращения: 02.03.2016).

2.     Системные события в iOS. URL: https://developer.apple. com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Introduction/Introduction.html (дата обращения: 02.03.2016).

3.     Календарь iOS. URL: https://developer.apple.com/library/ prerelease/ios/documentation/EventKit/Reference/EKEventStore ClassRef/ (дата обращения 02.03.2016).

4.     STK Audio Player. URL: https://github.com/tumtumtum/ StreamingKit (дата обращения: 02.03.2016).

5.     AM Slide Menu. URL: https://github.com/SocialObjects-Software/AMSlideMenu (дата обращения: 02.03.2016).

6.     Unicast, Multicast, Broadcast. URL: http://infocisco.ru/ types_communication.html (дата обращения: 02.03.2016).

7.     Сервер. URL: https://ru.wikipedia.org/wiki/Сервер_(аппа ратное_обеспечение) (дата обращения: 02.03.2016).

8.     Беспроводные технологии. URL: https://ru.wikipedia. org/wiki/Беспроводные_технологии (дата обращения: 02.03.2016).

9.     API. URL: https://en.wikipedia.org/wiki/Application_programming_interface (дата обращения: 02.03.2016).

10.  JSON. URL: http://json.org/json-ru.html (дата обращения: 02.03.2016).

11.  VK API. URL: https://vk.com/dev/api_requests (дата обращения: 02.03.2016).

12.  Аутентификация. URL: https://ru.wikipedia.org/wiki/ Аутентификация (дата обращения: 02.03.2016).

13.  Firebase. URL: https://www.firebase.com/docs/ (дата обращения: 02.03.2016).

14.  Download Radi-ON TvSTU online radio for iOS. URL: https://itunes.apple.com/ru/app/radion-tvstu-online-radio/id949659 884?mt=8 (дата обращения: 02.03.2016).


Постоянный адрес статьи:
http://swsys.ru/index.php?page=article&id=4167
Версия для печати
Выпуск в формате PDF (7.11Мб)
Скачать обложку в формате PDF (0.37Мб)
Статья опубликована в выпуске журнала № 2 за 2016 год. [ на стр. 185-194 ]

Возможно, Вас заинтересуют следующие статьи схожих тематик: