3 заметки с тегом: Android
Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»
3 заметки с тегом

Android

PHP сервер для рассылки Push на Android и iOS

2 октября 2015, 14:13

Долгое время искал в интернете нормальное решение для массовой рассылки Push сообщений на Android и iOS, но ничего подходящего и нормально работающего не попадалось.

В Delphi долгое время приходилось использовать компоненты Kinvey (или Pasre). При этом возникали новые проблемы зависимости от платформы, ключей и пр. С любым серьёзным изменением приходилось изменять, как сам проект, так и настройки проекта. В некоторых случаях сторонние компоненты отказывались работать на той или иной платформе по не понятной причине. А так же, огромным минусом Kinvey, было то, что при получении Push сообщения на iOS не воспроизводилось звуковое уведомление. В конце концов, зависимость от третьей стороны всегда является определённым минусом любого проекта.

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

Принцип работы скрипта достаточно прост. В нём имеются функции для регистрации (удаления) токенов устройств, ну и собственно сами функции рассылки. Большая часть мануалов? которые мне удалось найти были написаны либо неправильно, либо попросту были неполными.

Введение

Немного теории. Для отправки Push сообщений используются сервисы APNS у Apple и GCM у Google. Наш скрипт может выступать в качестве самостоятельного сервера рассылки Push через сервера Apple и Google, а так же принимать токены устройств регистрируемых в базе данных.

Apple, iOS и ApnsPHP

Начнём с более сложной части.
Я не стану изобретать велосипед и воспользуюсь уже имеющимися в сети, бесплатными, библиотеками написанными на PHP. Набор библиотек ApnsPHP представляет собой набор классов для работы с Push сообщениями APNS. Скачать их с примерами можно на GitHub по ссылке.

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

Генерация сертификата для отправки Push сообщений

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

  1. Запускаем утилиту «Связка ключей» и в левой части выбираем раздел «Мои сертификаты».
  2. Раскрываем сертификат интересующего нас проекта. БУДЬТЕ ВНИМАТЕЛЬНЫ! Есть две версии сертификатов, Developer (используется при отладке и разработке) и Production (используется для рабочей версии). Выбираем сертификат и закрытый ключ данного сертификата.
  3. Нажимаем правой кнопкой и выбираем пункт «Экспортировать объектов: 2». Сохраняем полученные сертификаты. Я сохранил с именами server_certificates_bundle_sandbox.p12 (для сертификата разработки) и server_certificates_bundle_prod.p12 (для сертификата публикации). Внимание! При экспорте поле пароля оставляем пустым. В дальнейшем вы сможете усложнить систему защиты и выгрузить сертификаты с указанием пароля.

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

  1. Переходим на сайт загрузки корневых сертификатов.
  2. Выбираем «Personal Use and Secure Server Installation» и нажимаем кнопку «Download Certificates».
  3. Нажимаем на «Root Certificates».
  4. Нас интересуют два сертификата «entrust_ssl_ca.cer» и «entrust_2048_ca.cer». Скачиваем их. Вообще, в изначальном описании написано, что сертификат «entrust_ssl_ca.cer» используется в Prodution режиме, а «entrust_2048_ca.cer» в режиме Development. Но есть пометка, что после 22 декабря 2010 в качестве Production сертификата так же можно использовать «entrust_2048_ca.cer». Т. е. данный сертификат можно использовать в обоих режимах работы, меняя лишь сертификаты пользователя.
Открываем Экспортируем сертификаты

Далее, нам необходимо открыть скачанные сертификаты на Mac'е, т. е. импортировать их в «Связку ключей». Для этого просто делаем двойной клик на каждом сертификате.

  1. Открываем в левой части «Связки ключей» раздел «Вход» («Сертификаты»).
  2. Находим наш сертификат и экспортируем его «entrust_root_certification_authority_2048.pem».
Открываем корневой сертификат. Экспортируем сертификат.

На данный момент, мы получили 3 основных файла для работы с сервисом APNS:

  • «entrust_root_certification_authority_2048.pem» — корневой сертификат.
  • «server_certificates_bundle_sandbox.p12» — сертификат пользователя для режима Development.
  • «server_certificates_bundle_prod.p12» — сертификат пользователя для режима Production.

Как можно заметить, сертификаты пользователя имеют расширение *.p12, но для работы нам необходимы файлы формата *.pem.

Для конвертации я воспользовался бесплатным набором утилит OpenSSL для Windows.
После установки пакета, для простоты выполнения команд я использовал TotalCommander.

  1. Открываем в левой части каталог установленного OpenSSL и переносим туда наши сертификаты.
  2. В нижней части TotalCommander в командной строке выполняем следующие команды:
openssl pkcs12 -in server_certificates_bundle_sandbox.p12 -out server_certificates_bundle_sandbox.pem -nodes -clcerts
openssl pkcs12 -in server_certificates_bundle_prod.p12 -out server_certificates_bundle_prod.pem -nodes -clcerts

На запрос ввода пароля, просто нажимаем Enter.

Подготавливаем сертификаты и программу. Сертификаты. Выполнение команд конвертации сертификатов. Просто нажимаем Enter. Готовые сертификаты.

И так, теперь у нас есть набор необходимых сертификатов для работы с Push сообщениями на iOS.

Google и GCM

Для работы с Google и GCM мы будем использовать библиотеку GCM PHP Server Library. Скачанный архив библиотек и пример работы из коробки у меня по какой-то причине отказался работать, поэтому пришлось немного модифицировать код.

Для работы с GCM нам потребуется API ключ проекта. Выполняем следующие действия:

  1. Открываем консоль разработчика Google.
  2. Выбираем интересующий нас проект.
  3. Открываем раздел «APIs & auth» — «Credentials» и копируем ключ Server Key.
  4. Если вы ещё не создавали ключи, то вам потребуется включить API «Google Cloud Messaging for Android».

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

База данных

Для рассылки Push сообщений на устройства пользователей используются токены устройств, которые выдаётся серверами Google и Apple, т. е. для получения Push сообщения, токен устройства должен быть зарегистрирован в системе. Наш сервер так же отправки Push сообщений будет использовать токены устройств. Для хранения токено устройств, ID устройств и платформы я использовал базу данных.

Текст скрипта для создания базы данных выглядит так.

CREATE TABLE devices (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Уникальный идентификатор  записи в таблице',
  deviceID varchar(255) NOT NULL COMMENT 'Идентификатор устройства',
  deviceToken varchar(255) NOT NULL COMMENT 'Токен устройства',
  devicePlatform varchar(255) NOT NULL COMMENT 'Платформа устройства',
  PRIMARY KEY (id),
  UNIQUE INDEX deviceID (deviceID)
)
ENGINE = MYISAM
AUTO_INCREMENT = 20
AVG_ROW_LENGTH = 166
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Зарегистрированные устройства для рассылки PUSH сообщений';
Таблица для хранения токенов.

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

Сервер

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

В состав сервера входит файл конфигурации. Приведу отдельно его текст.

<?php

# Переменные для работы  с базой данных
$config['db']['host'] = "localhost";
$config['db']['name'] = "Имя БД";
$config['db']['user'] = "Пользователь БД";
$config['db']['pass'] = "Пароль БД";

# Управление рассылкой. True - рассылка производится, false - рассылка отключена.
$config['apn']['send'] = true;
$config['gcm']['send'] = true;

# Ключи для доступа к сервисам
# Ключ для доступа Google Server API
$config['gcm']['apikey'] = "ВАШ API КЛЮЧ";
# Путь к сертификатам APN для подключения к серверу рассылки
$config['apn']['sert'] = 'Certificates/server_certificates_bundle_sandbox.pem';
$config['apn']['sert_prod'] = 'Certificates/server_certificates_bundle_prod.pem';
$config['apn']['RootCertificat'] = 'Certificates/entrust_root_certification_authority_2048.pem';
$config['apn']['production'] = false;

?>

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

Параметры:

$config['apn']['send'] = true;
$config['gcm']['send'] = true;

Отвечают за включение или отключение рассылки Push сообщений, если значение false, то рассылка на указанную платформу не производится.

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

# Ключи для доступа к сервисам
# Ключ для доступа Google Server API
$config['gcm']['apikey'] = "ВАШ API КЛЮЧ";
# Путь к сертификатам APN для подключения к серверу рассылки
$config['apn']['sert'] = 'Certificates/server_certificates_bundle_sandbox.pem';
$config['apn']['sert_prod'] = 'Certificates/server_certificates_bundle_prod.pem';
$config['apn']['RootCertificat'] = 'Certificates/entrust_root_certification_authority_2048.pem';

Отдельно рассмотрим ключ:

$config['apn']['production'] = false;

Данный ключ переключает режим работы сервера. Development или Production режимы рассылки.

Как можно заметить, все сертификаты необходимо положить в каталог «Certificates» рядом со скрипом.

Если при генерации сертификатов Apn использовался пароль, то в настройках, необходимо указать пароль:

$config['apn']['sertPass'] = 'пароль сертификата';

Работа со скриптом

После заполнения файла конфигурации скрипт готов к работе, осталось зарегистрировать устройства.
Скрипт сервера push.php принимает 2 значения параметра action:

  • register-device
  • send-push

В каждом действии требуются дополнительные параметры. Для регистрации устройства дополнительными параметрами являются:

  • did — Идентификатор устройства (не используется, но на всякий случай).
  • token — токен устройства, используется для рассылки Push сообщений.
  • platform — платформа устройства, используется функциями рассылки. Может принимать 2 значения: ios или andoid.

Для рассылки Push сообщений используется действие send-push и принимается всего 1 дополнительный параметр: text — текст Push сообщения.

Примеры запросов:

Регистрация устройства iOS

http://example.ru/push.php?action=register-device&did=DC92EFED-9271&token=feaab9d122f53a4fdca&platform=ios

Регистрация устройства Android

http://example.ru/push.php?action=register-device&did=DC92EFED-9271&token=feaab9d122f53a4fdca&platform=andoid

Отправка Push сообщений

http://example.ru/push.php?action=send-push&text=Добрый день, мой господин!

Первые два запроса регистрируют устройства в базе данных и в момент рассылки скрипты выбирает токены устройств по полю platform и производит отправку Push сообщений.

Второй запрос производит рассылку Push сообщения все зарегистрированным устройствам.

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

Delphi

Настало время рассмотреть небольшой код написанный для Delphi, который позволяет регистрировать токены устройств на нашем сервере. Каждое мобильное устройство после запуска приложения получает свой DeviceID и токен, после чего отправляет полученные данные на наш сервер.

В разделе public нашего юнита добавляем следующие строки:

public
    { Public declarations }
    APushService : TPushService;
    AServiceConnection : TPushServiceConnection;

А в раздел type добавляем описание 2-х функций:

procedure OnReceiveNotificationEvent(Sender: TObject; const ANotification : TPushServiceNotification);
    procedure OnServiceConnectionChange(Sender: TObject; AChange : TPushService.TChanges);

В момент отображения формы добавляем код получения DID и токена. Будьте внимательны, значение PROJECTNUM необходимо заменить на свой номер проекта из личного кабинета Google разработчика.

/// На данном этапе происходит регистрация устройства для получения Push.
procedure TMainForm.FormShow(Sender: TObject);
var
  ADeviceID, ADeviceToken : string;
begin

  // Получение и отправка токена устройства
  {$ifdef ANDROID}
    // Для Android
    APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
    APushService.AppProps[ TPushService.TAppPropNames.GCMAppID ] := 'PROJECTNUM';
  {$else}
    // Для iOS
    APushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.APS);
  {$endif}
  // Создаём подключение к серверу
  AServiceConnection := TPushServiceConnection.Create( APushService );
  // Активируем подключение
  AServiceConnection.Active   := True;
  // Подключаем делегаты
  AServiceConnection.OnChange := OnServiceConnectionChange;
  AServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;

  ADeviceID    := APushService.DeviceIDValue[ TPushService.TDeviceIDNames.DeviceID ];
  ADeviceToken := APushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ];

  if (ADeviceID <> '') AND (ADeviceToken <> '') then
  begin

    // Регистрируем устройство на сервере для отправки push сообщений
    RegisterDevice(ADeviceID, ADeviceToken);

  end;

end;

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

/// Устройства не всегда успевают получить токен,
/// поэтому при изменении состояния опять проверяем токен
procedure TMainForm.OnServiceConnectionChange(Sender: TObject;
  AChange : TPushService.TChanges);
var
  ADeviceID, ADeviceToken : string;
begin
    // При измении состояния компонента
    ADeviceID    := APushService.DeviceIDValue[ TPushService.TDeviceIDNames.DeviceID ];
    ADeviceToken := APushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ];

    if (ADeviceID <> '') AND (ADeviceToken <> '') then
    begin

      // Регистрируем устройство на сервере для отправки push сообщений
      RegisterDevice(ADeviceID, ADeviceToken);

    end;
end;

Для вывода Push сообщения добавляем функцию:

/// Процедура вывода сообщение при получении Push уведомления от сервера
procedure TMainForm.OnReceiveNotificationEvent(Sender: TObject;
  const ANotification : TPushServiceNotification);
var
  MessageText : string;
begin
  // Получаем текст сообщения в зависимости ль платформы
  {$ifdef ANDROID}
    MessageText := ANotification.DataObject.GetValue('message').Value;
  {$else}
    MessageText := ANotification.DataObject.GetValue('alert').Value;
  {$endif};

  // Выводим сообщение
  ShowNotification(MessageText, 0);
end;

В результате мы получаем почти готовую программу. Кто был более внимательным, заметил, что в коде есть несколько функций, не объявленных ранее, таких как ShowNotification или RegisterDevice. Для удобства, я вынес их в отдельный файл global.pas. Достаточно добавить данный файл в проект, чтобы не копипастить функции. В данном файле вам потребуется заменить константу DOMAIN для указания пути к файлу скрипта на сервере, и если вы положили скрипт не в корне сервера, а в случайный каталог, то потребуется внести дополнительные изменения для указания точной адресации.

Так же имеется функция SendPush, которая позволяет отправлять Push сообщения прямо с устройства.

Все функции в файле global.pas имеют подробное описание и думаю их использование не вызовет никаких вопросов.

Таким образом мы получаем устройства, которые регистрируются в системе, отправляя свои DID и токены скрипту, а скрипт записывает их в базу данных для дальнейшего использования при отправке Push сообщений. Если в базе имеются токены устройств, на которых программа не установлен (удалена), то такие токены будут удалены из базы данных после попытки отправки Push сообщений.

Зарегистрированные устройства.

Используемые файлы.

Файл global.pas
PHP сервер Push сообщений

Заключение

В данной статье я попытался максимально подробно изложить принципы и алгоритмы работы с Push сообщениями с использованием дополнительных библиотек GCMMessage и ApnsPHP в php скрипте и взаимодействие с программным обеспечением (в моём случае Windows приложения и мобильные платформы).

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

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

UPDATE

Для удобства, загрузил проект на GitHub.

Аудио-плеер на Delphi для Android с применением библиотеки BASS.

24 марта 2015, 9:48

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

И так, сегодня я подробно опишу, как создать простой плеер потокового вещания.

Для работы нам понадобятся среда программирования Code Gear RAD Studio XE7, работать я рекомендую именно в данной версии программы, т. к. в используемых библиотеках, имеются некоторые не стыковки в работе с предыдущими версиями.

По причине того, что встроенных средств проигрывания интернет потока не имеется, мы воспользуемся замечательной библиотекой BASS, для написания приложения для Android (для iOS следует использовать другие компоненты).

Для корректной работы библиотеки BASS я рекомендую так же установить компоненты DPF Android Native Components, я в своём примере буду использовать версию 2.8.6.

Начало

Ну я думаю процесс установки Code Gear RAD Studio XE7 описывать не стоит, поэтому сразу переходим к установке дополнительных компонентов и библиотек, потому что именно эта часть вызывает наибольшие проблемы, и именно поэтому данный этап я опишу наиболее подробно.

BASS

Идём на официальный сайт un4seen.com библиотеки, нажимаем в левом меню на ссылку BASS и скачиваем там последнюю версию для Android. На момент написания данной статьи на сайте опубликована версия 2.4 от 13 марта 2015 года. Прямая ссылка на скачивание библиотеки с официального сайта. Ссылка на скачивание с моего сайта.

Сайт библиотеки BASS Ссылки на скачивание библиотек

Примечание: я рекомендую использовать именно данную версию библиотеки, потому что предыдущие версии не работают с XE7, и при инициализации библиотеки появляется ошибка.

BASSFunctions

Для корректной работы с библиотекой, нам потребуется ещё один дополнительный файл, это BASSFunctions.pas. Данный файл опубликовал на форуме пользователь с ником 3delite.Ссылка на оригинальный файл.

DPF Android Native Components

Для корректной работы библиотек BASS, часто требуется установка компонентов DPF Android Native Components, т. к. в их составе имеется компонент для работы с аудио, без которого компилятор будет просто выдавать ошибку.

Идём на официальный сайт и скачиваем последнюю версию компонентов. Или вы можете скачать версию 2.8.6 с моего сайта.

Поехали

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

Начнём с DPF Android Native Components. Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.Android.Native.Components.v2.8.6 в корень диска C.

В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех кто в школе учил немецкий, я опишу процесс установки компонентов подробно.

Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools->Options->Delphi Options->Library.

В выпадающем списке справа выбираем платформу «32-bit Windows» и добавляем в раздел «Library path» путь к нашим компонентам.

Теперь то же самое проделываем для платформы «Android».

Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.

Открываем проект DPFAndroidPackagesXE7.dproj

Далее нам надо скомпилировать проект и установить полученные компоненты.

Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт «Build», начнётся построение проекта.

После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт «Install».

Компоненты готовы к работе. Приступим к созданию проекта.

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

Для работы в библиотекой BASS, нам потребуется в каталог с проектом добавить файл BASSFunctions.pas и указать его в разделе uses.

Добавляем файл BASSFunctions.pas. Добавляем в раздел uses.

Теперь собственно сама библиотека libbass.so. Нам необходимо добавить данную библиотек в наш проект, иначе ничего не заработает.

Открываем архив bass24-android.zip и видим... Множество папок, нас интересует на данный момент только одна libs. Распаковываем её в каталог нашего проекта.

В каталоге libs, есть три подкаталога, нас интересуют 2 из них:

  • armeabi-v7a
  • armeabi

В них находятся два разных файла libbass.so.

После того, как мы скопировали данный каталог в каталог проекта, снова возвращаемся к среде программирования и открываем раздел Deployment, для добавления наших библиотек в программу.

Deployment Добавляем библиотеки

После того, как мы добавили библиотеки в наш проект, надо поменять параметр «Remote Path» для каждой библиотеки соответственно на «library\lib\armeabi» и на «library\lib\armeabi-v7a». Данную процедуру надо проделать для обеих конфигураций «Debug» и «Release».

Библиотеки Конфигурации

Ну что, вот всё и готово к началу написания кода, а код на самом деле достаточно простой.

Объявляем глобальную переменную.

var
  uStream:HSTREAM;

В момент создания формы инициализируем библиотеку.

procedure TmainForm.FormCreate(Sender: TObject);
begin
  // Загружаем и инициализируем библиотеку
  Loadbass;
  BASS_Init(-1,44100,0,Handle,nil);
end;

На кнопку «Играть» вещаем обработчик:

procedure TmainForm.mainToolbarBarItems1Click(Sender: TObject);
var
  otStream : TStringStream;
  Result : integer;
begin
  try

    // Включаем индикатор загрузки контента
    ind1.Enabled := True;
    ind1.Visible := True;

    // Код проигрывателя
    Result := 0;

    // Закрываем старый поток
    BASS_StreamFree(uStream);

    // Создаём новый поток
    uStream :=
      BASS_StreamCreateURL(PChar('http://motochelyabinsk.ru:8000/play'),0,BASS_STREAM_STATUS or BASS_UNICODE,nil,nil);

    // Включаем проигрывание
    BASS_ChannelPlay(uStream, True);

    // Получаем и выводим название текущего трека из скрипта на сайте
    // Создаём поток UTF8
    otStream := TStringStream.Create('', CP_UTF8);
    // Делаем запрос к скрипту сайта
    IdHTTP1.Get('motochelyabinsk.ru/current-track.php', otStream);
    IdHTTP1.Disconnect;
    // Записываем название трека в Label
    Label1.Text := otStream.DataString;
    // Очищаем переменную потока
    otStream.Free;

    // Запустить таймер отслеживания изменений названия трека
    Timer1.Enabled := True;

    // Включаем и отключаем кнопки
    btn1.Enabled := False;
    btn2.Enabled := True;

  except on E: Exception do
    begin
      ShowMessage('Ошибка доступа к сети!');
    end;
  end;

end;

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

Мотосообщество и новые проекты

22 июня 2014, 21:20

Как-то давно я не писал ничего в блог, видимо потому, что стало значительно меньше свободного времени и меньше времени для размышлений. Но тем не менее жизнь идёт своим чередом и за период времени с середины прошедшей зимы мы с группой единомышленников создали проект взамипомомощи среди мотоциклистов и назвали проект KTeam (сокращение от Кировка Тим).

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

И так 17 мая 2014 на открытии мотосезона состоялась презентация нашего небольшого, но крайне полезного проекта.

Приложение KTeam

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

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

Так же, с приходом тепла мы стали заниматься не только разработкой приложения и сайта, но и продумывать и организовывать различные социальные мероприятия. Недавно состоялась поездка в детский приют в пос. Солнечный. Хотелось бы сказать огромное СПАСИБО всем тем, кто откликнулся и помог финансово, морально и физически организовать столь замечательное мероприятие.

P.S. Ждите новых мероприятий и принимайте активное участие!