Using Firebase Analytics in your Xamarin.Forms app

Bhuwan 881 Reputation points
2023-02-13T08:05:56.3466667+00:00

I am working on firebase analytics in Xamarin forms and integrated code both Android and iOS and its working fine as per below reference URL.

https://thewissen.io/using-firebase-analytics-in-your-xamarin-forms-app/

but how to pass a list of items firebase google analytics like when click add to card or place order line of items.

as per suggested i am doing like this and it's working but i can't define 2 to 3 items because some time 5 items comes or sometime 10 items comes

for your reference URLs

https://firebase.google.com/docs/analytics/measure-ecommerce#java

https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event#ADD_TO_CART

https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag

User's image

User's image

i am changing my code like this


/// <summary>

        /// FirebaseClassData

        /// </summary>

        public class FirebaseClassData

        {

            /// <summary>

            /// KeyName

            /// </summary>

            public string KeyName { get; set; }

            /// <summary>

            /// KeyValues

            /// </summary>

            public List<Dictionary<string,string>> KeyValues { get; set; }

        }


#region Firebase Google Analytics
            try
            {
                if (selectedProducts?.Count > 0)
                {
                    IFirebaseAnalyticsService firebaseAnalyticsService = DependencyService.Get<IFirebaseAnalyticsService>();
                    List<Constants.FirebaseClassData> firebaseClassDatas = new List<Constants.FirebaseClassData>();
                    decimal totalItemPrice = 0;
                    List<Dictionary<string, string>> listItems = new List<Dictionary<string, string>>();
                    foreach (var itemProduct in selectedProducts)
                    {
                        Dictionary<string, string> itemList = new Dictionary<string, string>()
                                {
                                    { "item_id", itemProduct.SkuId },
                                    { "item_name", itemProduct.Name },
                                    { "price", itemProduct.ListPrice.ToString() },
                                    { "quantity", itemProduct.SelectedQuanity }
                                };
                        totalItemPrice += Math.Round(Convert.ToDecimal(itemProduct.ListPrice * Convert.ToInt32(itemProduct.SelectedQuanity)), 2);
                        listItems.Add(itemList);
                    }

                    Constants.FirebaseClassData firebaseClassData = new Constants.FirebaseClassData();
                    firebaseClassData.KeyName = "items";
                    firebaseClassData.KeyValues = listItems;
                    firebaseClassDatas.Add(firebaseClassData);

                    Dictionary<string, string> addtocartProp = new Dictionary<string, string>()
                                {
                                    { "currency", "USD" },
                                    { "value", totalItemPrice.ToString() }
                                };
                    firebaseAnalyticsService.LogEvent("add_to_cart", addtocartProp, firebaseClassDatas);
                }
            }
            catch (Exception) { }
            #endregion


/// <summary>
        /// LogEvent
        /// </summary>
        /// <param name="eventId"></param>
        /// <param name="parameters"></param>
        /// <param name="items"></param>
        public void LogEvent(string eventId, IDictionary<string, string> parameters, List<Constants.FirebaseClassData> items)
        {
            try
            {
                Task.Run(() =>
                {
                    var fireBaseAnalytics = FirebaseAnalytics.GetInstance(CrossCurrentActivity.Current.AppContext);

                    if (parameters == null)
                    {
                        fireBaseAnalytics.LogEvent(eventId, null);
                        return;
                    }

                    var bundle = new Bundle();

                    foreach (var item in parameters)
                    {
                        bundle.PutString(item.Key, item.Value);
                    }

                    if (items != null && items.Count > 0)
                    {
                        foreach (var headerItem in items)
                        {
                            List<Bundle> innerChildItemWithIndex = new List<Bundle>();
                            foreach (var childItem in headerItem.KeyValues)
                            {
                                Bundle bundleItem = new Bundle();
                                foreach (var innerChildItem in childItem)
                                {
                                    bundleItem.PutString(innerChildItem.Key, innerChildItem.Value);
                                }
                                innerChildItemWithIndex.Add(bundleItem);
                            }
                            bundle.PutParcelableArrayList(headerItem.KeyName, new IParcelable[] { bundleItem });
                        }
                    }

                    fireBaseAnalytics.LogEvent(eventId, bundle);
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
Developer technologies | .NET | Xamarin
{count} votes

1 answer

Sort by: Most helpful
  1. Bhuwan 881 Reputation points
    2023-03-06T04:03:29.03+00:00

    Hi @Anonymous

    got the solution for Android and iOS is pending .

    below solution for android regarding how to pass items to firebase.

    /// <summary>
            /// LogEvent
            /// </summary>
            /// <param name="eventId"></param>
            /// <param name="parameters"></param>
            /// <param name="items"></param>
            public void LogEvent(string eventId, IDictionary<string, string> parameters, List<Constants.FirebaseClassData> items)
            {
                try
                {
                    Task.Run(() =>
                    {
                        var fireBaseAnalytics = FirebaseAnalytics.GetInstance(CrossCurrentActivity.Current.AppContext);
    
                        if (parameters == null)
                        {
                            fireBaseAnalytics.LogEvent(eventId, null);
                            return;
                        }
    
                        var bundle = new Bundle();
    
                        foreach (var item in parameters)
                        {
                            switch (item.Key)
                            {
                                case "currency":
                                    bundle.PutString(FirebaseAnalytics.Param.Currency, item.Value);
                                    break;
                                case "value":
                                    bundle.PutDouble(FirebaseAnalytics.Param.Value, Convert.ToDouble(item.Value));
                                    break;
                                case "shipping":
                                    bundle.PutDouble(FirebaseAnalytics.Param.Shipping, Convert.ToDouble(item.Value));
                                    break;
                                case "tax":
                                    bundle.PutDouble(FirebaseAnalytics.Param.Tax, Convert.ToDouble(item.Value));
                                    break;
                                case "coupon":
                                    bundle.PutString(FirebaseAnalytics.Param.Coupon, item.Value);
                                    break;
                                default:
                                    bundle.PutString(item.Key, item.Value);
                                    break;
                            }
                        }
                        if (items != null && items.Count > 0)
                        {
                            List<Bundle> paracebleArray = new List<Bundle>();
                            foreach (var headerItem in items)
                            {
                                foreach (var childItem in headerItem.KeyValues)
                                {
                                    Bundle bundleItem = new Bundle();
                                    foreach (var innerChildItem in childItem)
                                    {
                                        switch (innerChildItem.Key)
                                        {
                                            case "price":
                                                bundleItem.PutDouble(FirebaseAnalytics.Param.Price, Convert.ToDouble(innerChildItem.Value));
                                                break;
                                            case "quantity":
                                                bundleItem.PutInt(FirebaseAnalytics.Param.Quantity, Convert.ToInt32(innerChildItem.Value));
                                                break;
                                            case "item_id":
                                                bundleItem.PutString(FirebaseAnalytics.Param.ItemId, innerChildItem.Value);
                                                break;
                                            case "item_name":
                                                bundleItem.PutString(FirebaseAnalytics.Param.ItemName, innerChildItem.Value);
                                                break;
                                            case "discount":
                                                bundle.PutDouble(FirebaseAnalytics.Param.Discount, Convert.ToDouble(innerChildItem.Value));
                                                break;
                                            default:
                                                bundleItem.PutString(innerChildItem.Key, innerChildItem.Value);
                                                break;
                                        }
                                    }
                                    paracebleArray.Add(bundleItem);
                                }
                            }
                            if (paracebleArray != null && paracebleArray.Count > 0)
                                bundle.PutParcelableArray(FirebaseAnalytics.Param.Items, paracebleArray.ToArray());
                        }
                        fireBaseAnalytics.LogEvent(eventId, bundle);
                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
    
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.