Інтеграція Однокласники API в мобільний додаток
Помилка підпису — головний біль при інтеграції OK API. Без правильного підпису API повертає PARAM_SESSION_EXPIRED або PERMISSION_DENIED. Типова проблема — передача секретного ключа на клієнт, що веде до компрометації. Цього можна уникнути, використовуючи бекенд-проксі, який підписує запити, не розкриваючи ключ. Передача application_secret_key на клієнт робить додаток вразливим до реверс-інжинірингу та крадіжки ключа. Використання HTTPS з сертифікатом не вирішує проблему — ключ повинен зберігатися тільки на бекенді. Архітектура з проксі-сервером гарантує, що секретний ключ ніколи не покине вашу інфраструктуру. Клієнт відправляє запит на ваш сервер, сервер додає підпис і проксіює його в OK API.
Однокласники (OK.ru) — друга за розміром російськомовна соцмережа з аудиторією 35+. Вона актуальна для рітейлу, медіа та сімейних сервісів. Наш досвід — 7+ років мобільної розробки, більше 50 проєктів з інтеграцією соцмереж. Інтеграція OK API включає три ключові завдання: авторизацію через OAuth 2.0, підпис запитів і публікацію контенту. Кожна вимагає точного дотримання протоколу. Отримайте консультацію з інтеграції OK API — ми оцінимо ваш проєкт за 1 день.
Як працює підпис запитів до OK API?
Це головна відмінність API. Кожен запит підписується:
sig = MD5(params_sorted_alphabetically + MD5(access_token + application_secret_key))
Згідно з документацією OK, підпис обов'язковий для всіх запитів до API.
Кроки:
- Беремо всі параметри запиту крім
sig і access_token.
- Сортуємо за ім'ям параметра, конкатенуємо в рядок
key=value.
- Рахуємо
session_secret = MD5(access_token + application_secret_key) — це session_secret обчислюється на сервері, секрет не передається клієнту.
-
sig = MD5(params_string + session_secret).
Передавати application_secret_key на клієнт не можна — тільки через бекенд-проксі. Архітектура: клієнт запитує ваш бекенд → бекенд додає підпис → проксіює запит до OK API.
Реєстрація додатку та ключі
На dev.ok.ru створюємо додаток, тип — «Mobile». Отримуємо три ключі: application_id, application_key (публічний), application_secret_key (приватний, тільки на сервері). Для iOS вкажіть bundle ID, для Android — package name та SHA1-відбиток.
Які SDK використовувати для інтеграції з Однокласниками?
| Платформа |
SDK |
Доступність |
Статус |
| iOS |
OKLoginSDK (CocoaPods/SPM) |
Обмежена (неофіційний) |
Ручна реалізація |
| Android |
ok-android-sdk (Gradle) |
Офіційний |
Активний |
iOS: Офіційного Swift SDK немає — зазвичай реалізують OAuth-потік вручну через ASWebAuthenticationSession.
Android: Офіційний ok-android-sdk на GitHub. Підключення:
implementation 'ru.ok.android:sdk:3.0.18'
Авторизація:
OkAuthManager.startOkAutoExternal(activity, listOf(OkScope.GET_EMAIL, OkScope.VALUABLE_ACCESS))
val token = OkAuthManager.onActivityResult(requestCode, resultCode, data, listener)
Офіційний Android SDK у 2 рази прискорює інтеграцію порівняно з самописним OAuth-потоком.
Як уникнути помилок підпису при інтеграції з OK API?
Помилки підпису — часте джерело проблем. Ось типові сценарії та їх вирішення:
- Виключення access_token з параметрів підпису:
access_token не бере участі в генерації sig. Якщо випадково включити його, підпис стане недійсним. За статистикою, ~70% запитів з помилкою підпису викликані цією причиною.
- Порядок параметрів: Сортування за алфавітом строге. Навіть один параметр не на місці — помилка
PARAM_SESSION_EXPIRED.
- Кодування: Параметри повинні бути в UTF-8, без URL-кодування. Подвійне кодування ламає підпис.
- Термін життя session_secret: Обчислюється один раз і кешується на час сесії. Не перераховуйте його на кожен запит.
Авторизація: OAuth 2.0 + підпис запитів
Авторизація через WebView або системний браузер:
https://connect.ok.ru/oauth/authorize?client_id=YOUR_APP_ID&scope=GET_EMAIL;VALUABLE_ACCESS;PHOTO_CONTENT&response_type=code&redirect_uri=yourapp://oauth
Після отримання code — обмінюємо на access_token через POST на https://api.ok.ru/oauth/token.do.
Що потрібно для публікації контенту?
Scope VALUABLE_ACCESS обов'язковий. Публікація через mediatopic.post:
POST https://api.ok.ru/fb.do
method=mediatopic.post
&type=USER_STATUS
&attachment={"media":[{"type":"text","text":"Текст поста"}]}
Для публікації з фото: спочатку завантажуємо через photosV2.getUploadUrl, потім використовуємо photo token в attachment.
Отримання даних користувача
GET https://api.ok.ru/fb.do?method=users.getCurrentUser&fields=NAME,PIC_1,LOCATION,EMAIL,GENDER&access_token=...&application_key=...&sig=...&format=json
| Поле |
Опис |
NAME |
Ім'я користувача |
LAST_NAME |
Прізвище |
PIC_1 |
Аватар 50x50 |
PIC_3 |
Аватар 128x128 |
EMAIL |
Email (тільки з scope GET_EMAIL) |
GENDER |
Стать |
LOCATION |
Локація |
Помилки та їх обробка
-
PARAM_SESSION_EXPIRED — токен вичерпався. OK токени живуть 30-60 днів, refresh token — довше.
-
PERMISSION_DENIED — недостатньо scope.
-
SERVICE_UNAVAILABLE — API тимчасово недоступний, повтор через експоненційний backoff.
Чому варто обрати нашу інтеграцію?
Гарантуємо коректний підпис запитів та безпеку ключів. Входимо до пулу сертифікованих розробників зі стажем 7+ років. Надаємо документацію та підтримку після впровадження. Замовте інтеграцію OK API під ключ — ми реалізуємо повний цикл від налаштування OAuth до публікації контенту.
Терміни та обсяг робіт
Авторизація через OK + імпорт профілю з бекенд-проксі — 2-3 дні. Публікація з медіа — ще 1-2 дні. Вартість розраховується індивідуально.
Зв'яжіться з нами для оцінки вашого проєкту.
Розробка чатів та соціальних функцій: чат, VoIP, стрічка та реакції
Ми проектуємо чат не як «просто WebSocket + повідомлення», а як систему з офлайн-доступом, відображенням історії при поганому з'єднанні, індикаторами друку, статусами прочитання та push-повідомленнями. Це має працювати на Android 8 з 512 MB RAM без ANR — інакше користувачі просто йдуть. Ми маємо 5+ років досвіду у розробці соціальних модулів, понад 50 реалізованих проектів — від стартапів до enterprise. Розробка чатів — наш ключовий напрям.
Як ми підходимо до розробки чатів?
Вибір протоколу та сховища — перша точка, де помиляються. WebSocket, XMPP або готовий SDK — кожен варіант диктує бюджет часу та надійність.
Як обрати протокол для чату?
- Готовий чат SDK (SendBird, Stream Chat, Cometchat) дає UI-компоненти, серверну інфраструктуру, push та модерацію. Швидко, надійно, але vendor lock-in та recurrent costs. Для MVP — оптимально. Ліцензія SendBird для проекту з 10К користувачів — ~$400/міс.
- Firebase Realtime Database / Firestore — для простих чатів без вимог до масштабованості >100K конкуретних з'єднань. Realtime Database зручніше для впорядкованих списків повідомлень, Firestore — для структурованих даних. Typing indicators та presence реалізуються окремо через onDisconnect().
- Власний бекенд з WebSocket — повний контроль, максимальна кастомізація. Стек: Node.js +
socket.io або Phoenix Channels (Elixir), PostgreSQL + Redis для pub/sub. На мобільному: Starscream (iOS Swift), OkHttp WebSocket (Android), socket_io_client (Flutter). Час розробки в 2–3× більше, але zero vendor risk. Кастомний WebSocket дає в 2 рази меншу затримку, ніж Firebase для високочастотних чатів. В одному проекті ми обрали кастомний WebSocket і зменшили витрати на ліцензії на $12 000 на рік.
| Функція |
Готовий SDK |
Кастомна реалізація |
| Базовий чат |
SendBird, Stream |
WebSocket + Room/GRDB |
| VoIP |
Twilio, Agora |
WebRTC + CallKit |
| Стрічка |
— |
Paging 3 / DiffableDataSource |
| Push для соц. подій |
Firebase FCM/APNs |
APNs direct |
Чому важливо продумувати офлайн-режим заздалегідь?
Офлайн-режим — найтрудомісткіша частина чату. Повідомлення зберігаються в SQLite (iOS: GRDB, Android: Room) з локальним ID, синхронізуються при відновленні з'єднання. Конфлікти при одночасному відправленні вирішуються через vector clock або server-timestamp ordering. Якщо не закласти це в архітектуру з першого спринту, переписувати половину коду доведеться за 2–3 тижні до релізу. В одному проекті ми скоротили час переписування з 4 до 1,5 тижня, застосувавши cursor-based pagination замість offset — при вставці нових елементів курсор не зсувається, дублі не виникають. Середня затримка доставки повідомлення після оптимізації — менше 150 мс.
VoIP: CallKit, ConnectionService та WebRTC
VoIP у мобільному додатку розбивається на два сценарії: системний UI (виглядає як дзвінок телефону) або дзвінок всередині додатку. CallKit (iOS) інтегрується через CXProvider + CXCallController — показує вхідний виклик на Lock Screen, працює з Bluetooth та перериває інші аудіо. Додаток запускається через VoIP push (PKPushKit) навіть коли вбито.
На Android аналог — ConnectionService API. Інтеграція складніша, поведінка варіюється між виробниками (Xiaomi, Samsung агресивно вбивають фонові процеси через battery optimization). WebRTC — транспорт для P2P медіа. Сигнальний сервер (SDP, ICE candidates) — зазвичай через той же WebSocket канал. STUN/TURN обов’язкові: без TURN ~15–20% користувачів за симетричним NAT не побачать виклик. coturn — open source рішення, Twilio NTS та Metered TURN — managed.
Стрічка та реакції
Нескінченна стрічка — UICollectionView з UICollectionViewDiffableDataSource на iOS, LazyColumn з Paging 3 на Android. Pagination через cursor-based підхід — він не зсувається при вставці нових елементів, на відміну від offset. Реакції (емодзі на повідомлення): кожна реакція — запис (message_id, user_id, emoji), агрегація на сервері GROUP BY emoji. WebSocket-подія reaction_added оновлює лічильник у реальному часі. Анімація появи — через withSpring (Reanimated) або Core Animation spring. У проекті з соціальною мережею ми обслуговували до 80 000 одночасних з’єднань на одному інстансі — стрічка залишалася чуйною.
Push-повідомлення для соціальних подій: @згадка, відповідь, новий підписник — через APNs та FCM. Для rich notifications (прев’ю медіа) на iOS — Notification Service Extension, який завантажує медіа до показу. Після впровадження таких повідомлень утримання користувачів зросло на 30%.
Що входить в роботу: повний список deliverables
Ми постачаємо не тільки код — ось повний перелік того, що ви отримуєте:
- Проектування схеми даних (SQLite, Firestore, PostgreSQL) з урахуванням offline-first та масштабування до 1M користувачів.
- Реалізація клієнт-серверного протоколу (WebSocket, REST, GraphQL) з підтримкою reconnection та heartbeat.
- Інтеграція push-повідомлень (APNs, FCM) з генерацією сертифікатів та налаштуванням ключів.
- Налаштування TURN-серверів або вибір managed-провайдера (наприклад, Twilio NTS) для VoIP.
- Документація API та схема міграцій (включаючи rollback-план).
- Доступ до репозиторію, CI/CD (GitHub Actions + Fastlane), TestFlight / Google Play Console.
- Навчання команди (code review перших 2 спринтів) та передача знань.
- On-call підтримка протягом 2 тижнів після релізу.
Типові помилки при розробці чатів та як їх уникнути
- Відсутність reconnection стратегії. Клієнт просто відключається без черги невідправлених повідомлень. Рішення: heartbeat, exponential backoff, локальне зберігання вихідних з позначкою pending.
- Offset пагінація в стрічці. При вставці нових постів користувач бачить дублі. Рішення: cursor-based pagination — вона в 5 разів стабільніша при частих оновленнях.
- Ігнорування battery optimization на Android. ConnectionService не доживає до вхідного виклику. Рішення: foreground service з постійним повідомленням або інтеграція через Firebase Cloud Messaging для пробудження.
- Голий WebSocket без протоколу поверх. Це винахід велосипеда. Використовуйте platform-agnostic JSON або MessagePack з type-флагом.
Стек технологій, що використовується в типовому проекті:
- iOS: Swift 5.9+, SwiftUI, Combine, async/await, Starscream, GRDB
- Android: Kotlin, Jetpack Compose, OkHttp WebSocket, Room, Hilt DI
- Cross‑platform: Flutter 3.x (Dart) або React Native (TypeScript)
- Backend: Node.js + socket.io або Phoenix (Elixir) + PostgreSQL + Redis
- Push: APNs / FCM з сертифікатами та ключами
- VoIP: WebRTC + coturn TURN server
⏱ Терміни орієнтовно
| Модуль |
Оцінка |
| Базовий чат з історією та push |
4–6 тижнів |
| VoIP дзвінки з CallKit / ConnectionService |
3–5 тижнів |
| Соціальна стрічка + реакції + коментарі |
від 3 місяців |
Вартість розраховується індивідуально після аналізу вашого технічного завдання та існуючої архітектури. Напишіть нам для оцінки проекту — ми запропонуємо дві опції: швидке впровадження через готові SDK або повністю кастомізоване рішення. Отримайте консультацію та точний кошторис протягом 2 робочих днів. Замовте розробку чату вже сьогодні — ми гарантуємо коректну роботу на Android 8+ та iOS 14+.