Разработка → Делаем звонок в один клик

barsulka 14 января 2014 в 12:07 16,2k
«Звонок в один клик» или Push2Dial (P2D) — ещё одна функция, которая была анонсирована с новым 2ГИС. Суть проста — выбираете организацию, кликаете на номер телефона — и он готов к набору на вашем смартфоне.

Фича избавляет от необходимости самостоятельно набирать номер телефона, а значит шансы ошибиться и попасть не туда стремятся к нулю.



Звонить в один клик можно как из бета-версии нового онлайнового 2ГИС, так и из старого доброго офлайнового. Оба они делают это через API, написанный по такому случаю, о котором мы и расскажем.

API P2D, как вы можете догадаться из названия, работает с системой push-уведомлений. На мобильных устройствах ее использование оправдано тем, что если позволить приложениям бесконтрольно залезать в интернет, когда им вздумается, анекдоты про Android и розетку станут суровой реальностью.

Кстати, в зависимости от платформы, работа с системой уведомлений немного отличается. На iOS push-уведомления — часть API системы. Приложение 2ГИС взаимодействует непосредственно с APNS.
На Android же наше приложение сначала связывается с библиотекой Google Play Services, которая, в свою очередь, взаимодействует с Google Cloud Messaging.

Итак, что происходит после того, как пользователь нажимает на иконку телефонной трубки в мобильном 2ГИС? Ему предложат связать устройство с 2ГИС для ПК или же с beta.2gis.ru. Мобильный 2ГИС подключается к системе push-нотификаций (или пытается это сделать), посылает серверу API Push2Dial запрос, содержащий в себе token телефона и данные об его платформе (iOS или Android).



API Push2Dial генерирует pin-код для этого телефона и создает связку “pin->устройство”, которую кладет в memcache на 10 минут. В ответ API Push2Dial возвращает этот pin телефону.

API Push2Dial написан на Lua. Для работы с memcache мы используем библиотеку lua-resty-memcached от разработчика по имени Yichun Zhang. Как ни странно, lua-resty-memcached, написанный на Lua, оказался быстрее и устойчивее, чем нативный модуль для nginx HttpMemcModule, написанный им же.

Код, который работает с memcache, простой и короткий. Вот так, например, Lua записывает связку:

-- подключаем memcached
memcached = require("memcached");

-- коннектимся
local memc, err = memcached:new();
local connected, err = memc:connect(хост, порт);

-- записываем для пин-кода токен и платформу
-- ttl = 10 минут
memc:set(PIN, json.encode({['token'] = token, ['platform'] = platform}), 600);


Пользователь получил pin-код и вводит его на компьютере. От «большого» 2ГИС в API отправляется запрос на существование связки “pin->устройство”. Если такая связка найдена, то API Push2Dial перекладывает данные о телефоне из мемкэша в базу данных и отдаёт продукту (онлайновому или офлайновому 2ГИС) идентификатор из базы, соответствующий устройству.

Возможно, вы обращали внимание, что в новом 2ГИС появилась авторизация. Если в этот момент пользователь оказался авторизован, то API Push2Dial записывает его авторизационный id. Таким образом, в следующий раз, где бы юзер не авторизовался, его привязка вступит в силу и он сможет сразу совершать звонки. Конечно же, в один клик.

Собственно, о звонках. Когда пользователь нажимает на номер телефона организации в 2ГИС на компьютере, создается запрос на генерацию push-уведомления, содержащий ID устройства. API P2D находит в базе этот ID и генерирует push-уведомление в формате XML или JSON, в зависимости от платформы. Которое, в свою очередь, уходит на соответствующий сервер Google или Apple, а оттуда — на телефон пользователя.



На этом этапе можно отметить еще один нюанс. На iOS набор номера всегда происходит через приложение 2ГИС, после того, как пользователь нажмет на уведомление. На Android в реальном времени запускается наш код (сразу по получению уведомления), который открывает дайлер. Таким образом, если приложение 2ГИС не было запущено, оно и не станет запускаться.

Если вы еще не пробовали звонок в один клик, самое время это сделать. К вашим услугам 2ГИС для iOS или Android, новый 2ГИС и старый знакомый, 2ГИС для ПК.
Проголосовать:
+22
Сохранить: