Skip to main content
Из вашего нативного приложения можно открыть приложение ExodeBiz сразу на нужном экране — выбрать школу, при необходимости авторизовать пользователя по токену и открыть урок. Достаточно открыть ссылку-схему штатным способом (Intent.ACTION_VIEW на Android / UIApplication.open на iOS).

Формат ссылки

Deep link использует URL-схему приложения exodebizapp://. Все параметры кладутся в один параметр data — это URL-кодированная query-строка:
exodebizapp://?data=<url-encoded "action=open-page&domain=...&pageId=...&params=...&extra=...">
Параметры внутри data:
action
string
required
Всегда open-page.
domain
string
required
Домен (FQDN) школы, например my-school.com или my-school.exode.biz.
pageId
string
required
Идентификатор экрана. Для урока — см. раздел «Открыть урок».
params
string (JSON)
required
JSON с параметрами экрана, например {"page":"1","courseId":"42","lessonId":"123"}.
extra
string (base64url)
Список дополнительных действий (например авторизация). См. раздел «extra».
Значения параметров содержат спецсимволы и требуют двойного кодирования: сначала соберите query-строку action=...&domain=... (значения URL-кодированы), затем закодируйте её целиком и положите в data. Не собирайте вручную — используйте стандартные сборщики (URLSearchParams, Uri.Builder, URLComponents), см. примеры кода ниже.

Открыть урок

ПолеЗначение
pageId/courses/:page([0-9]+)/:courseId([0-9]+)/study/:lessonId([0-9]+)
params{"page":"1","courseId":"<ID курса>","lessonId":"<ID урока>"}
  • page — страница в списке курсов; для перехода на урок укажите "1".
  • courseId, lessonId — идентификаторы курса и урока в вашей школе.
Готовая ссылка — подставьте DOMAIN, COURSE_ID, LESSON_ID:
exodebizapp://?data=action%3Dopen-page%26domain%3DDOMAIN%26pageId%3D%252Fcourses%252F%253Apage%2528%255B0-9%255D%252B%2529%252F%253AcourseId%2528%255B0-9%255D%252B%2529%252Fstudy%252F%253AlessonId%2528%255B0-9%255D%252B%2529%26params%3D%257B%2522page%2522%253A%25221%2522%252C%2522courseId%2522%253A%2522COURSE_ID%2522%252C%2522lessonId%2522%253A%2522LESSON_ID%2522%257D

Другие экраны

Меняя pageId и params, можно открыть любой экран:
ЭкранpageIdparams
Урок/courses/:page([0-9]+)/:courseId([0-9]+)/study/:lessonId([0-9]+){"page":"1","courseId":"42","lessonId":"123"}
Курс/course/:courseId([0-9_A-Za-z]+){"courseId":"42"}
Нужен другой экран — напишите в поддержку, подскажем корректные pageId и параметры.

extra — вложенные действия (авторизация)

Параметр extra позволяет прокинуть в приложение список действий, которые выполнятся вместе с открытием — например авторизацию по токену. extra — это base64url(JSON.stringify({ actions: [...] })). Структура JSON:
{
  "actions": [
    { "type": "login-by-token", "token": "USER_TOKEN" }
  ]
}
Поддерживаемые действия:
typeПоляОписание
login-by-tokentokenАвторизация пользователя по токену
open-pagepageId, paramsНавигация на экран
Порядок выполнения гарантирован: сначала — действия из extra (по порядку в массиве), затем — навигация из open-page. То есть ссылка open-page + extra:[{login-by-token}] даёт ровно: открыть приложение → авторизоваться → открыть страницу.
1

Получите токен сессии пользователя

Токен создаётся методом Создание токена сессии (POST /saas/v2/user/session/auth-token). Возьмите значение поля token из ответа.
2

Соберите extra

extra = base64url(JSON.stringify({ actions: [{ type: 'login-by-token', token }] })).Пример (с placeholder-токеном USER_TOKEN):
eyJhY3Rpb25zIjpbeyJ0eXBlIjoibG9naW4tYnktdG9rZW4iLCJ0b2tlbiI6IlVTRVJfVE9LRU4ifV19
3

Добавьте extra в data

Добавьте extra к query-строке внутри data — приложение переключит школу, авторизует пользователя и откроет урок.
Ссылка с login-by-token даёт вход под конкретным пользователем — любой, у кого есть ссылка, залогинится под ним. Такие ссылки должны быть короткоживущими / персональными и не публиковаться.
Используйте именно base64url (-/_ вместо +//, без =-padding) — обычный base64 может некорректно пройти через query-строку.

Сборка и открытие ссылки в коде

const SCHEME = 'exodebizapp';
const LESSON = '/courses/:page([0-9]+)/:courseId([0-9]+)/study/:lessonId([0-9]+)';

const b64url = (obj) =>
  btoa(String.fromCharCode(...new TextEncoder().encode(JSON.stringify(obj))))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

function buildLessonLink({ domain, courseId, lessonId, page = 1, token }) {
  const inner = new URLSearchParams({
    action: 'open-page',
    domain,
    pageId: LESSON,
    params: JSON.stringify({
      page: String(page), courseId: String(courseId), lessonId: String(lessonId),
    }),
  });

  // опционально: автологин
  if (token) {
    inner.set('extra', b64url({ actions: [{ type: 'login-by-token', token }] }));
  }

  return `${SCHEME}://?data=${encodeURIComponent(inner.toString())}`;
}

Поведение

  • Deep link срабатывает только если приложение установлено. Если нет — ОС ничего не откроет: обработайте это сами и покажите fallback (магазин приложений или сайт школы). На Android ловите ActivityNotFoundException, на iOS — success == false в completion-handler open.
  • Если школа ещё не была добавлена в приложении — она добавится автоматически и станет активной.
  • Навигация подчиняется обычной авторизации: без extra-логина неавторизованный пользователь увидит экран входа.

Диагностика

СимптомПричина / решение
Ничего не происходит при открытии ссылкиПриложение не установлено, либо контекст не распознаёт кастомные схемы. Реализуйте fallback.
Открылось не на том урокеПроверьте pageId (символ-в-символ) и значения в params; убедитесь, что data собран корректно (двойное кодирование).
«Школа не найдена»Неверный domain. Укажите точный FQDN школы.
Открывается экран входаПользователь не авторизован / нет доступа. Для автологина используйте extra с login-by-token.