Решение проблем

Начните с включения отладочных логов: они показывают, что именно сделал SDK и почему. См. Отладочные логи. Ищите тег Unolink в Logcat или [Unolink] в консоли Xcode.

В панели ничего не появляется

  • Включите «Включать тестовые устройства» в Воронке или «Путях». Debug-сборки считаются тестовыми устройствами и по умолчанию скрыты.
  • Проверьте, что configure выполняется. Его нужно вызвать один раз и рано: Application.onCreate() на Android, init() @main App на iOS, корневой layout в React Native, main() во Flutter.
  • Отправьте события сейчас. События уходят каждые 15 секунд, пока приложение открыто, и когда оно уходит в фон. Нажмите «Домой» или вызовите flush().
  • Проверьте сеть. Без сети события ждут на устройстве и отправляются, когда она появится.

«Invalid SDK key (401)»

Ключ неверный, от другого приложения или отозван. Скопируйте его снова в приложении → Настройки → Ключи SDK. Если вы не сохранили его при создании, создайте новый ключ: полный ключ показывается только один раз. После ответа 401 ничего не отправляется до следующего запуска.

SDK входит в тариф Pro и выше. Владельцу приложения нужно перейти на него в разделе Оплата. До тех пор SDK ничего не отправляет и ничего не держит в очереди.

Часть событий пропадает

  • Недопустимое имя. Имена событий начинаются с латинской буквы и содержат только латинские буквы, цифры, _ и ., не длиннее 64 символов. Недопустимые отклоняются и записываются в лог.
  • Слишком много свойств. Не больше 20 на событие, строки до 200 символов, всего 4 КБ.
  • Недопустимые ID экранов онбординга. step и flow подчиняются тому же правилу, что и имена событий: how_heard, а не how-heard. В development-сборках SDK для React Native (0.3.1 и новее) предупреждает в консоли.
  • Лимит месяца сильно превышен. При достижении лимита ничего не блокируется. Только после превышения лимита вдвое ваши собственные (custom) события отклоняются с quota_exceeded; стандартные события воронки записываются всегда.
  • Вызов до configure. Нативные SDK для iOS и Android игнорируют вызовы, сделанные до configure. React Native (0.3.1 и новее) сохраняет их и отправляет сразу после него.
  • Отслеживание отключено. setEnabled(false) останавливает отслеживание и запоминается между запусками.

Покупки или пробные периоды учитываются дважды или не учитываются вовсе

  • RevenueCat подключён? Тогда о пробных периодах и покупках сообщает RevenueCat, а вызовы purchase и trialStarted из приложения игнорируются. Можете их убрать, если хотите; вреда от них нет.
  • Покупки из RevenueCat не привязываются к установке? Сообщайте собственный app user ID RevenueCat. В SDK 0.3.2 и новее connectRevenueCat поддерживает его в актуальном состоянии (см. RevenueCat). Иначе вызывайте с ним setUserId (Purchases.shared.appUserID, Purchases.sharedInstance.appUserID, Purchases.getAppUserID() или Purchases.appUserID) после Purchases.configure, после каждого Purchases.logIn и Purchases.logOut и при каждом запуске. Покупка, которая приходит раньше, чем приложение сообщило своего пользователя, ждёт и привязывается, как только это произойдёт. Учитываются все ID пользователя, которые сообщала установка, поэтому гость, который купил, а потом создал аккаунт, сохраняет покупку. Если приложение сообщает только ID аккаунта, покупка гостя привязывается только со следующим событием RevenueCat для этого клиента (например, с первым продлением). См. Гости и аккаунты.
  • Нет RevenueCat? Вызывайте purchase с ценой в виде десятичного числа и трёхбуквенным кодом валюты, после того как магазин её подтвердит.
  • На iPhone так и должно быть. У Apple нет реферера установки, поэтому отложенные диплинки есть только на Android.
  • Устанавливайте из Google Play. У установок вручную и из Android Studio нет реферера Play. Используйте внутреннее тестирование или debugInstallReferrer в debug-сборке. См. Тестирование.
  • Только первый запуск. Реферер читается один раз на установку. Чтобы протестировать снова, удалите приложение или очистите его данные.
  • Задайте диплинк для ссылки. В панели: Ссылки → ⋯ → Изменить → Диплинк. Ссылка без него всё равно засчитывает установку, но открывать нечего.
  • Зарегистрируйте слушатель. Его можно добавить после configure: ссылка, пришедшая раньше, всё равно будет доставлена. В React Native для этого нужна версия 0.3.1 или новее; в 0.3.0 подписывайтесь сразу после configure.
  • Экран находится за онбордингом или входом в аккаунт? Слушатель срабатывает один раз на установку. Когда онбординг завершён, прочитайте getPendingDeferredDeepLink(), откройте ссылку, затем вызовите consumeDeferredDeepLink(). Начиная с 0.3.3 ссылка ждёт, пока вы её не используете, даже если приложение за это время закрывали (до 30 дней). См. Откройте её после онбординга.
  • Одна и та же ссылка открывается при каждом запуске? Вызовите consumeDeferredDeepLink(), когда откроете её.

Каждый клик засчитывается только одной установке. После переустановки Google Play может снова передать приложению тот же реферер, и эта вторая установка не засчитывается ссылке повторно. Unolink никогда не гадает.

React Native и Flutter

  • Expo Go не работает. В SDK есть нативный код: сделайте development build (npx expo prebuild или EAS Build).
  • «Native module not found» или MissingPluginException. Пересоберите приложение после установки. Перезагрузка JavaScript или hot restart во Flutter не загружают новый нативный код.
  • Сборка iOS падает после установки. Выполните pod install в папке ios (React Native без Expo), затем соберите снова.

Всё ещё не получается?

Напишите на [email protected], указав название приложения, платформу, версию SDK и отладочный лог одного запуска приложения.