При срабатывании функция должна вызывать один из наших серверных API.
Функция успешно развертывается, и она работает правильно, когда я тестирую ее с помощью инструментов тестирования консоли Firebase. Однако проблема в том, что функция не запускается в реальном времени в производственной среде — она никогда не срабатывает при возникновении фактического события app_remove.
Вот что я уже проверил:
- Функция развертывается без ошибок
- Тестирование с помощью встроенного симулятора событий Firebase работает
- В журналах нет записей о запуске функции в рабочей среде.
- Приложение Android правильно регистрирует другие события Analytics.
Будем очень признательны за любые рекомендации о том, как обеспечить надежное выполнение этой функции в реальном сценарии удаления Android.
Облачная функция Firebase:
import * as functions from "firebase-functions";
import axios from "axios";
import * as qs from "qs";
export const onAppRemove = functions.analytics
.event("app_remove")
.onLog(async (event) => {
try {
console.log("Start function..");
const eventMainType = "app_event";
const eventType = "app_remove";
const userId = event.user?.userId || "unknown";
const userProps = event.user?.properties || {};
const appInfo = event.appInfo || {};
const timestamp = event.timestampMicros;
// Extract Firebase user properties
const appVersion = userProps["app_version"]?.value || appInfo.appVersion || "unknown";
const isProduction = userProps["isProduction"]?.value || "unknown";
const deviceMake = userProps["deviceMake"]?.value || "unknown";
const deviceModel = userProps["deviceModel"]?.value || "unknown";
const osVersion = userProps["osVersion"]?.value || appInfo.appPlatform || "unknown";
// Map uninstall data in same style as Android events
const params = {
eventName: eventType,
userId,
appVersion,
isProduction,
deviceMake,
deviceModel,
osVersion,
timestamp,
};
// Format query string just like Android
const queryParams = qs.stringify(params);
const fullUrl = `https://example.com/postback/${eventMai ... ueryParams}`;
console.log("Sending uninstall postback:", fullUrl);
const response = await axios.get(fullUrl);
console.log("Postback sent successfully:", response.status);
} catch (error) {
console.error("Error sending uninstall postback:", error);
}
});
Со стороны Android:
lateinit var firebaseAnalytics: FirebaseAnalytics
try {
firebaseAnalytics = Firebase.analytics
// Configure Firebase Analytics for 16KB page size compatibility
firebaseAnalytics.setAnalyticsCollectionEnabled(true)
// Set session timeout to handle potential memory page size issues
firebaseAnalytics.setSessionTimeoutDuration(1800000) // 30 minutes
trackUserLogin()
Log.d("MyApplication", "Firebase Analytics initialized successfully")
} catch (e: Exception) {
Log.e("MyApplication", "Failed to initialize Firebase Analytics: ${e.message}")
Sentry.captureException(e)
// Fallback initialization with minimal configuration
try {
firebaseAnalytics = FirebaseAnalytics.getInstance(this)
trackUserLogin()
Log.d("MyApplication", "Firebase Analytics fallback initialization successful")
} catch (fallbackException: Exception) {
Log.e("MyApplication", "Firebase Analytics fallback initialization failed: ${fallbackException.message}")
Sentry.captureException(fallbackException)
}
}
private fun trackUserLogin() {
try {
CoroutineScope(Dispatchers.IO).launch {
with(firebaseAnalytics) {
setUserId(getAdvertiserId())
setUserProperty("app_version", "V${BuildConfig.VERSION_NAME}")
setUserProperty("isProduction", "${BuildConfig.IS_PRODUCTION}")
setUserProperty("deviceMake", Build.MANUFACTURER)
setUserProperty("deviceModel", Build.MODEL)
setUserProperty("osVersion", Build.VERSION.RELEASE)
}
}
Log.d("MyApplication", "Analytics: User ID set in Firebase Analytics")
} catch (e: Exception) {
Log.e("MyApplication", "Analytics: Failed to set User ID: ${e.message}")
Sentry.captureException(e)
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... production
Мобильная версия