Press ESC to close

Xamarin Forms Firebase Analytics

Merhaba arkadaşlar. Bu yazımızda Xamarin Forms’da Firebase ile nasıl event gönderilir ve nasıl bu eventler debug edilir bundan bahsedeceğiz. Öncelikle bir Firebase üzerinden bir proje açmamız gerekiyor. Sonrasında ise bu projeden 2 farklı uygulama oluşturacağız. Bunlardan birisi iOS için diğeri ise Android için olacak.

Proje içinde uygulama oluştururken bundle id’nin doğru olduğundan emin olunuz. Uygulama oluşturmanın en son adımı olan Android için google-services.json ve iOS için GoogleServiceInfo.plist dosyalarını indirip projemize eklememiz gerekiyor. Burada dikkat etmemiz gereken nokta ise; Android tarafında json dosyasını ekledikten sonra BuildAction kısmında bunun bir GoogleServicesJson olduğunu belirtmemiz gerekiyor. Eğer bu seçenek gelmiyorsa VS For Mac’in saçmalığı tamamen. Projenin android tarafında csproj dosyasını editlemeniz gerekiyor.

Csproj dosyanızı herhangi bir editörle açtığınızda muhtemelen google-services.json dosyanızın None şeklinde olduğunuzu göreceksiniz. Bunu kendini GoogleServicesJson olarak ekleyip, projenizi tekrar çalıştırdığınızda düzelmiş olduğunu göreceksiniz.

Ardından iOS tarafında ise eklediğimiz GoogleServices-Infp.plist dosyasının ise Build Action seçeneğinden BundleResource olarak set edildiğinden emin olmalıyız

Şimdi Xamarin tarafına gelebiliriz. Burada her platform için farklı işlemler yapacağımız için DependencyService üzerinden ilerleyeceğiz. Eğer DependencyService nedir daha fazla bilgi almak isterseniz, burada daha detaylı bir anlatımı mevcut. İlk olarak bu serviste hangi fonksiyonları kullanacaksak bunlar için bir arayüz tasarlıyoruz. Ben sadece bir event loglayacağım için bu interface işimi görecektir. Siz kendi ihtiyaçlarınıza göre özelleştirebilirsiniz.

using System;
namespace XamFirebaseEvents.DependencyServices
{
    public interface IFirebaseEvents
    {
        void LogEvent(string Id, string name, string value);
    }
}

Sonrasında ilk olarak Android tarafına geçiyorum. Burada paket yüklememiz gerekiyor. Bu paketler;

Paketleri yükledikten sonra Android katmanında FirebaseEvents sınıfı oluşturup IFirebaseEvents’ten kalıtım almasını sağlıyorum. Sonrasında eklediğim paketler sayesinde eventleri loglayabiliyorum. Burada dikkat etmeniz gereken kısım, FirebaseAnalytics’ten bir instance almaya çalıştığında sizden bir activity istiyor. MainActivity üzerinde static bir değişken tanımladıktan sonra onCreate fonksiyonun MainActivity’nin kendisini set ederseniz sorun çözülecektir.

using System;
using Android.OS;
using Firebase.Analytics;
using XamFirebaseEvents.DependencyServices;
[assembly: Xamarin.Forms.Dependency(typeof(IFirebaseEvents))]
namespace XamFirebaseEvents.Droid.DependencyServices
{
    public class FirebaseEvents : IFirebaseEvents
    {
        public void LogEvent(string Id, string name, string value)
        {
            var firebaseAnalytics = FirebaseAnalytics.GetInstance(MainActivity.activity);
            var bundle = new Bundle();
            bundle.PutString(name, value);

            firebaseAnalytics.LogEvent(Id, bundle);
        }
    }
}

Bir sonraki aşama ise iOS kısmı. Burada yine Android tarfında yaptığımız gibi yeni bir sınıf oluşturup; bu sınıfın, oluşturduğumuz interface’ten kalıtım almasını sağlıyoruz. Sonrasında ise Xamarin.Firebase.iOS.Analytics paketini eklememiz gerekiyor.

Paketi ekledikten sonra oluşturduğumuz sınıfa bu kodları eklememiz gerekiyor.

using System;
using System.Collections.Generic;
using Firebase.Analytics;
using Foundation;
using XamFirebaseEvents.DependencyServices;
[assembly: Xamarin.Forms.Dependency(typeof(IFirebaseEvents))]
namespace XamFirebaseEvents.iOS.DependencyServices
{
    public class FirebaseEvents : IFirebaseEvents
    {
        public void LogEvent(string Id, string name, string value)
        {
            var keys = new List<NSString>()
            {
                new NSString(name)
            };
            var values = new List<NSString>()
            {
                new NSString(value)
            };
            Analytics.LogEvent(Id, NSDictionary<NSString, NSObject>.FromObjectsAndKeys(values.ToArray(), keys.ToArray(), keys.Count));
        }
    }
}

En son işlem ise AppDelegate üzerinde olacak. Burada Firebase’i configure etmek gerekiyor.

using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;

namespace XamFirebaseEvents.iOS
{
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS.
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());

            Firebase.Core.App.Configure();

            return base.FinishedLaunching(app, options);
        }
    }
}

Burada dikkat etmemiz gereken nokta ise; logladığımız eventler ertesi gün console’a düşüyor. Eventleri test ederken debug yapabilirsiniz. Bunun için bir sonraki yazıya bakmanız yararınıza olacaktır.

Sormak istediğiniz yerleri mail veya yorum atarak sorabilirsiniz. İyi çalışmalar.

Comments (3)

  • Locsays:

    Pazartesi Ocak 17th, 2022 at 13:24

    var firebaseAnalytics = FirebaseAnalytics.GetInstance(MainActivity.activity); this line required a Context so it should be
    => var firebaseAnalytics = FirebaseAnalytics.GetInstance(Forms.Context);
    And when I check the “firebaseAnalytics” it said:

    FirebaseInstanceId = Java.Lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.xxxx. Make sure to call FirebaseApp…

    Am I missing something?
    Btw amazing article!!!

    • omersezersays:

      Pazartesi Ocak 17th, 2022 at 13:49

      Hi,

      First of all thank you for your comment. Did you add FirebaseApp.InitializeApp() to your MainActivity? If you can share your project with me on Github, i can help to you. My github username is omersezer.

      Good works.

      • Locsays:

        Salı Ocak 18th, 2022 at 07:11

        Thank you for your reply. My problem was that my “package_name” in the google-services.json did not match the app’s package name. Even though it also happened on the IOS side when the “BUNDLE_ID” in the GoogleService-Info.plist does not correspond with the “Bundle identifier” in Info.plist, but it worked excellent :D. You want to pay more attention when working with those files.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir