Спойлер: данная статья предназначена для React Native разработчиков, которые смогут быстро скопипастить отсюда код, чтобы нормально подключить последнюю версию аппметрики, а не использовать устаревшую библиотеку.
Данная статья актуальна для версии реакт нейтива 0.73.3.
В статье будут опущены многие подробности и будет больше практики. Если нужны будут дополнительные пояснения - обращайтесь в комментариях.
С чего все началось
Совсем недавно на одном из моих проектов потребовалось подключить аппметрику в реакт нейтивском приложении и я, как нормальный разработчик, сразу пошел гуглить готовое решение для этой библиотеки.
В итоге, я нашел готовое решение, аж от яндекса - https://github.com/yandexmobile/react-native-appmetrica.
И что можно у него выделить из плюсов: это готовое решение для подключения аппметрики.
А из минусов:
В ишьюсах полным-полно запросов на обновление этой библиотеки, но бедным разработчикам никто не отвечает и им приходится писать патчи или обращаться к форкам этого репозитория.
Я попробовал установить эту библиотеку, приложение не собиралось, пришлось писать патчи, пришлось смотреть на фиксы других людей, и так далее, и так далее, и в конце концов все запустилось, только потом никакие ивенты в аппметрику не отправлялись, и я подумал, что я не хочу больше разбираться в этой чересчур закостыленной мною библиотеке и решил самостоятельно все подключить и настроить.
Самостоятельно подключаем аппметрику
Подключение аппметрики будет состоять из нескольких шагов:
Нативная установка и инициализация аппметрики;
Создание нативных модулей для обращения к методам аппметрики из JS.
На самом то деле, для нативного подключения аппметрики достаточно открыть документацию по установке на iOS и Android, но у многих реакт нейтив разработчиков это может вызвать ужас, поэтому я вам по пальцам распишу, что делать.
Начнем с iOS
Заходим в директорию ios;
Открываем файл Podfile;
Ищем там
target 'yourappname' do
и внутри него добавляем подpod 'YandexMobileMetrica', '4.5.2'
;Запускаем в консоли
pod install
.
Примерно Podfile будет выглядеть так:
Для JS разрабов, далеких от айос разработки:
Podfile - это как package.json;
pod - это либа, которую вы ставите обычно с помощью npm/yarn или еще чего;
pod install - это npm i/yarn.
Далее:
Открываем xCode;
Открываем AppDelegate (который с буквой m);
Делаем импорт
#import <YandexMobileMetrica/YandexMobileMetrica.h>
;Ищем там didFinishLaunchingWithOptions;
Вставляем туда код:
YMMYandexMetricaConfiguration *configuration = [[YMMYandexMetricaConfiguration alloc] initWithApiKey:@"ваш ключ"]; [YMMYandexMetrica activateWithConfiguration:configuration];
Чтобы получилось так:
Перезапустите ваше приложение (полностью, а не просто в метро R нажмите) и, если вы все сделали правильно, в аппметрике вы увидите как минимум один новый профиль:
Ура, на этом пока что с айосом закончим, попробуем подключить андроид.
Установим аппметрику на Android
Заходим в build.gradle, который внутри app;
В dependencies кладем
implementation 'com.yandex.android:mobmetricalib:5.3.0'
(это как установить что-то в package.json);Я обычно после этого запускаю приложение на телефоне, чтобы автоматически все что надо установилось, но вы можете зайти в Android Studio и синкануть все, что надо.
Так как у большинства приложение не самой последней версии, у вас может быть код на джаве, а у меня на котлине. Не бойтесь, пожалуйста, джавы, я верю в вас, вы сможете переписать последующий код с котлина на джаву. После этого:
Открываем MainApplication.kt;
Импортируем
import com.yandex.metrica.YandexMetrica
import com.yandex.metrica.YandexMetricaConfig
После этого идем в onCreate
Пишем
val config = YandexMetricaConfig.newConfigBuilder("ваш ключ").build()
YandexMetrica.activate(this.applicationContext, config)
ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager)
Получаем в итоге такое:
Полностью перезапускаем приложение и что мы видим:
Успех.
Но на этом не останавливаемся. Как минимум аппметрику подключают для того, чтобы отправлять какие-то ивенты. Этим сейчас и займемся.
Что у нас есть:
У нас нативно установлена аппметрика;
У нас нативно активирована аппметрика.
Теперь, нам надо каким-то образом со стороны жаваскрипта получать доступ к методам этой аппметрики, установленной нативно. Что надо делать? Ага, писать нативные модули. Мы будем писать именно обычные нативные модули, а не турбо модули, потому что турбо модули писать дольше и вообще можете на них забить, если не пишите что-то, требующее передачи большого количества данных с жаваскрипта в нативку и обратно.
Нативный модуль для iOS
Мы опустим подробности создания заголовочного файла и файла с кодом (обратитесь к официальной документации реакт нейтива если что) и сразу приступим к делу.
Создаем первый файл, заголовочный (который h), который выглядит до ужаса просто:
#import <React/RCTBridgeModule.h>
@interface YandexMetrica : NSObject <RCTBridgeModule>
@end
Далее создаем файлик m и летим в него. Там уже для вас я полностью подготовил код:
#import "YandexMetrica.h"
#import <YandexMobileMetrica/YandexMobileMetrica.h>
@implementation YandexMetrica
RCT_EXPORT_MODULE(YandexMetrica);
RCT_EXPORT_METHOD(sendEvent:(NSString *)name params:(NSDictionary *)params) {
[YMMYandexMetrica reportEvent:name parameters:params onFailure:^(NSError *error) {
NSLog(@"REPORT ERROR: %@", [error localizedDescription]);
}];
}
@end
Давайте потестим, что там отправляется/не отправляется. Зайдем в App.tsx, напишем следующее:
import {NativeModules} from 'react-native';
// ...
const {YandexMetrica} = NativeModules;
// ...
// Внутри компонента какого-нибудь
useEffect(() => {
YandexMetrica.sendEvent('Dver', {
prodal: 'azerbaijancy',
platform: Platform.OS,
});
}, []);
Запускаем наше приложение и ждем. Событие может не сразу отобразиться у вас в дашборде. В итоге, получим:
Вот так вот. Аппметрика работает. Но только на айосе. Надо еще сделать тоже самое на андроиде.
Нативный модуль для Android
Тут я тоже не буду пояснять вам, что такое модуль и что такое пекедж. Если надо - либо обращайтесь в документацию, либо пишите в комменты.
Открываем Android Studio;
Создаем новый файл с новым классом:
package com.yandex
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.ReadableMap
import com.yandex.metrica.YandexMetrica
class YandexMetricaModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
override fun getName() = "YandexMetrica"
@ReactMethod fun sendEvent(name: String, params: ReadableMap) {
YandexMetrica.reportEvent(name, params.toHashMap());
}
}
Создаем еще один файл с еще одним классом:
package com.yandex
import android.view.View
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ReactShadowNode
import com.facebook.react.uimanager.ViewManager
class YandexMetricaPackage : ReactPackage {
override fun createViewManagers(
reactContext: ReactApplicationContext
): MutableList<ViewManager<View, ReactShadowNode<*>>> = mutableListOf()
override fun createNativeModules(
reactContext: ReactApplicationContext
): MutableList<NativeModule> = listOf(YandexMetricaModule(reactContext)).toMutableList()
}
В MainApplication.kt добавляем в getPackages
add(YandexMetricaPackage())
;
И усе. Запускаем наше приложение, ждем, открываем дашборд и что видим:
Видим, что ивент с платформой на андроиде был отправлен. Что говорит о том, что интеграция прошла успешно.
Выводы, плюсы и минусы
Таким образом мы самостоятельно установили аппметрику на айос и андроид. Что это нам дает:
Мы сами решаем, какая версия аппметрики у нас будет - самая последняя (не то, что в готовой, устаревшей, неподдерживаемой, еле работающей либе);
Мы указываем только те методы, которые нам по факту нужны (это якобы мы умные разработчики, которые экспоузят только те методы, которые нужны, а остальные скрывают);
Мы повышаем спрос на нас самих же, ибо реакт нейтив разработчики, умеющие делать такие вещи - очень ценные.
Какие минусы:
Надо все руками устанавливать, что может занять время;
Надо иметь более-менее базовые знания разработки на айосе/андроиде (ну или по крайней мере уметь копипастить из интернета);
В случае, если нам понадобится какой-то другой метод из аппметрики - нам надо будет лезть в нативные модули и добавлять эти методы (что также может занять время).