| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // FirebaseAnalytics.js
- let firebaseAnalyticsInstance = null;
- class FirebaseAnalytics {
- /**
- * @param {Object} config
- * @param {string} config.measurementId - Measurement ID (例如:G-XXXXXXXXXX)
- * @param {string} config.apiSecret - API Secret
- * @param {string} config.firebaseAppId - Firebase App ID
- * @param {string} config.clientId - 客户端ID,通常来自客户端 cookie 或设备唯一标识
- */
- constructor({ measurementId, apiSecret, firebaseAppId, clientId }) {
- this.measurementId = measurementId;
- this.apiSecret = apiSecret;
- this.firebaseAppId = firebaseAppId;
- this.clientId = clientId;
- // 构造上报的 URL,参考 Measurement Protocol 规范
- this.endpoint = `https://www.google-analytics.com/mp/collect?firebase_app_id=${this.firebaseAppId}&api_secret=${this.apiSecret}`;
- }
- /**
- * 上报事件到 Firebase Analytics
- * @param {string} eventName - 事件名称,例如 "user_sign_in"
- * @param {Object} params - 事件参数(键值对),例如 { page: 'home', duration: 123 }
- * @returns {Promise<Response>} 返回 fetch 的响应结果
- */
- async sendEvent(eventName, params = {}) {
- // 构造 Measurement Protocol 所要求的 payload
- const payload = {
- app_instance_id: this.clientId,
- events: [
- {
- name: eventName,
- params: params
- }
- ]
- };
- try {
- const response = await fetch(this.endpoint, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(payload)
- });
- if (!response.ok) {
- throw new Error(`事件上报失败,状态码:${response.status}`);
- }
- return response;
- } catch (error) {
- console.error('FirebaseAnalytics 上报错误:', error);
- throw error;
- }
- }
- }
- // Initialize Firebase Analytics
- const initializeFirebaseAnalytics = (measurementId, apiSecret, firebaseAppId='',clientId='') => {
- if (!firebaseAnalyticsInstance) {
- firebaseAnalyticsInstance = new FirebaseAnalytics({measurementId, apiSecret, firebaseAppId,clientId});
- console.log('Firebase Analytics initialized');
- } else {
- console.warn('Firebase Analytics is already initialized');
- }
- };
- // Interface function for external calls
- const fa_trackEvent = (eventName, eventParams) => {
- if (!firebaseAnalyticsInstance) {
- console.error('Firebase Analytics is not initialized. Please call initializeFirebaseAnalytics first.');
- return;
- }
- firebaseAnalyticsInstance.sendEvent(eventName, eventParams);
- };
- // Example usage
- // initializeFirebaseAnalytics('YOUR_MEASUREMENT_ID', 'YOUR_API_SECRET', 'YOUR_FIREBASE_APP_ID');
- // fa_trackEvent('example_event', { param1: 'value1', param2: 'value2' });
- export { initializeFirebaseAnalytics, fa_trackEvent };
|