В прошлой статье мы создавали аккаунт разработчика для использования Huawei Mobile Services и подготавливали проект к их использованию. Теперь пора приступить к встраиванию конкретных сервисов.
Вот полный список статей из цикла:
- Создаём аккаунт разработчика, подключаем зависимости, подготавливаем код к внедрению. тык
- Встраиваем Huawei Analytics. < вы тут
- Используем геолокацию от Huawei.
- Huawei maps. Используем вместо Google maps для AppGallery.
Как должен выглядеть код в уже готовом проекте
Начнём с аналитики. И исходить будем из того, что она у вас спрятана за примерно такой абстракцией:
interface Analytics {
fun send(event: AnalyticsEvent)
}
interface AnalyticsEvent {
val key: String
val data: Map<String, Any>
}
fun Map<String, Any>.toBundle() =
Bundle().apply {
forEach { (key, value) ->
when (value) {
is String -> putString(key, value)
is Int -> putInt(key, value)
is Boolean -> putBoolean(key, value)
is Double -> putDouble(key, value)
is Float -> putFloat(key, value)
else -> throw IllegalArgumentException("Unknown data type: ${value::class.simpleName}")
}
}
}
open class SimpleEvent(override val key: String) : AnalyticsEvent {
override val data: Map<String, Any> = hashMapOf()
override fun toString(): String = "AnalyticsEvent { key = $key, data = $data }"
}
open class ParamsEvent(key: String, vararg params: Pair<String, Any>): SimpleEvent(key) {
override val data = params.toMap()
}
class EventOpenSomeScreen : SimpleEvent("screen_some_screen")
Соответственно, где требуется какое-то событие отправить, вы делаете что-то такое:
@Inject
lateinit var analytics: Analytics
...
analytics.send(EventOpenSomeScreen())
Используем разные реализации аналитики
Если всё вышеописанное верно, то подставлять разные реализации аналитики в разных сборках проще простого.
- Указываем, что для huawei
flavor
-а мы используем одну библиотеку, а для google — другую:
dependencies {
huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.3.1.300'
huaweiImplementation 'com.huawei.hms:hianalytics:5.0.0.301'
googleImplementation 'com.google.firebase:firebase-analytics:17.2.3'
}
- В DI биндим для типа
Analytics
экземпляр классаAnalyticsImpl
. Сам жеAnalyticsImpl
у нас будет в двух вариантах. Один — в папкеsrc/huawei/kotlin/com/example
и выглядеть так:
class AnalyticsImpl(context: Context) : Analytics {
private val analytics = HiAnalytics.getInstance(context)
override fun send(event: AnalyticsEvent) {
analytics.onEvent(event.key, event.data.toBundle())
}
}
Другой в папке src/google/kotlin/com/example
:
class AnalyticsImpl(context: Context) : Analytics {
private val firebaseAnalytics = FirebaseAnalytics.getInstance(context)
override fun send(event: AnalyticsEvent) {
firebaseAnalytics.logEvent(event.key, event.data.toBundle())
}
}
Вот собственно и всё с аналитикой. API библиотек очень похожи и никаких проблем не возникает.
Проверяем, что всё работает
Также, очень удобно можно проверить, что Huawei аналитика работает. Для этого надо:
- Подсоединить девайс к компьютеру.
- Выполнить в консоли
adb shell setprop debug.huawei.hms.analytics.app ТУТ_APPLICATION_ID_ВАШЕГО_ПРИЛОЖЕНИЯ
- Открыть консоль разработчика в браузере, перейти в AppGallery Connect -> Мои приложения -> Выбрать приложение -> Раздел "Разработка" -> Управление -> Отладка приложения.
- Теперь отправленные из приложения события вы будете видеть в реальном времени прямо на сайте.
- Чтобы отключить режим отладки выполните
adb shell setprop debug.huawei.hms.analytics.app .none.
Вот так режим отладки выглядит в браузере:
Дальше — геолокация
С аналитикой мы разобрались, в следующей статье покажем как встроить определение геолокации от Huawei в приложение, которое уже использует аналог от Google.
Весь код, который есть в этом цикле статей вы можете посмотреть в репозитории на GitHub. Вот ссылка.
Stan_1
А что мешает в приложение, которые мы ставим в AppGallery, запилить GA и Firebase? Или Google понимает, что запущено МОЕ приложение на Huawei и режет аналитику?
kuchanov Автор
Дело в том, что на новых девайсах от Huawei нет сервисов от гугла. Засим, всё что с ними связано работать не будет. В т.ч. аналитика. Можно, конечно, поставить вручную сервисы от гугла, однако это зачастую нетривиальная задача и вот в таких случаях гугл да, может это отслеживать и вмешиваться в работу своих сервисов, например их отключая
Stan_1
Хм… Допустим, у меня есть приложение под Андроид. В него встроена SDK Google Analytycs. Решил расширить воронку, и выйти на AppGallery. Что произвойдет? Мне нужно выпилить SDK GA? Или SDK будет работать, но GA не будет принимать ивенты от приложения?
kuchanov Автор
Выпиливать SDK не обязательно. Можно одновременно использовать несколько сервисов аналитики (что является довольно распространённой практикой). А вот будет ли оно (отправка аналитики через GA) работать — зависит от наличия на девайсе, на который будет приложение установлено, сервисов от гугла. Если сервисы есть — аналитика будет работать. Иначе — не должна) Сам факт того, откуда установлено приложение гугл, в данный момент, насколько мне известно, не волнует. Но они, конечно, могут начать блокировать работу своих сервисов по любым причинам в любой момент.
PrinceKorwin
А почему это SDK аналитики не должна работать? Санкции? Ну так весь андроид напичкан гугловым API, но работает же?
kuchanov Автор
На новых девайсах Huawei не может предустанавливать гугловые сервисы, а их установка вручную — по идее — нарушение лицензии. Соответственно, гугл в праве эти нарушение пресекать, отслеживая девайсы и отключая функционал своих сервисов. В интернете по этому поводу довольно много информации, беглое гугление например такую статейку выдало, с упоминанием проблемы: https://www.forbes.com/sites/zakdoffman/2020/03/15/huawei-mate-30-and-p40-now-have-surprise-one-click-google-install-heres-what-you-must-know/#8af18b27cf30
PrinceKorwin
Так SDK Google Analytycs идет как часть устанавливаемого приложения (не гуглового). Всё, что делает это SDK — делает запросы на домены Google. Любой Браузер точно также делает запросы на домены Google.
Теперь на девайсах Huawei нет ни одного браузера? Или firewall из коробки настроен так чтобы любой гугловый IP был недоступен?
kuchanov Автор
Кажется, я понял о чём вы)
Будет работать или нет, на девайсе без гугло-сервисов не пробовал. И под аналитикой имел в виду Firebase аналитику. Попробую в свободное время проверить, будет ли аналитика работать на девайсе без гугло-сервисов и напишу тут.
PrinceKorwin
я рад :)
Да, говорим гугл аналитика и подразумеваем Firebase уже давно как. У самого huawei телефон, но еще с гугл сервисами, проверить не могу. Если вам не трудно, то как проверите можно попросить вас написать о результате?