Xamarin.Forms ile Katmanlı Mimariye Giriş – 6 (Analytics, Versioning)

Merhabalar,

Serimizin bu yazısında projemizi genişletip yeni özellikler ekleyeceğiz. Mobil uygulamalar için olmazsa olmaz Error, Exception, Analytics ve Versioning çok önemli konular. Geliştirdiğiniz mobil uygulamalarınızı hangi platformda veya hangi teknoloji ile geliştirdiğinizin önemi olmadan AppCenter üzerinden tüm bu işlemleri çok kısa bir sürede aktif edebilirsiniz.

Bu yazımızda sadece Analytics ve Versioning konularına değineceğim.

AppCenter

Önceki yazılarımda ve videolarımda AppCenter platformunun yetenekleri detaylı bir şekilde anlattım. Çok kısa bir giriş yapmak gerekirse, AppCenter; Platform ve dil bağımsız bir şekilde build, test, release işlemlerini çok kolay bir şekilde yapabileceğiniz ve uygulamanızı uçtan uca monitor etmenize yarayan bir arkadaş.

İlk önce yapmamız gereken işlem kaç tane işletim sistemine uygulama geliştireceksek AppCenter üzerinden o kadar app açıyoruz.

Gerekli paketleri projelerimize yüklüyoruz.

GlobalSetting

Uygulamamızı genişletirken ilk yapmamız gereken işlem GlobalSetting sınıfımıza bazı propertyler eklemek olacak.

        public bool IsTest { get; set; } = false;
        public bool UseAppCenter { get; set; } = false;
        public string AppCenterAndroidKey { get; set; }
        public string AppCenteriOSKey { get; set; }
        public string AppCenterUWPKey { get; set; }

IsTest: Uygulama test versiyonunda ise AppCenter verion update işlemini çalıştırmamamız gerekecek.

UseAppCenter: AppCenter kullanıp kullanmadığımızı belirtiyoruz.

AppCenterAndroidKey, AppCenteriOSKey, AppCenterUWPKey: Platformlar için AppCenter üzerinden aldığımız secret key

IAppCenterService

    public interface IAppCenterService : IServiceBase
    {
        void Init();
    }

AppCenterService

    public class AppCenterService : IAppCenterService
    {
        public void Init()
        {
            StringBuilder _appCenterBuild = new StringBuilder();
            if (!String.IsNullOrEmpty(GlobalSetting.Instance.AppCenterAndroidKey))
                _appCenterBuild.Append($"android={GlobalSetting.Instance.AppCenterAndroidKey}");
            if (!String.IsNullOrEmpty(GlobalSetting.Instance.AppCenteriOSKey))
                _appCenterBuild.Append($"ios={GlobalSetting.Instance.AppCenteriOSKey}");
            if (!String.IsNullOrEmpty(GlobalSetting.Instance.AppCenterUWPKey))
                _appCenterBuild.Append($"uwp={GlobalSetting.Instance.AppCenterUWPKey}");

            if (String.IsNullOrEmpty(_appCenterBuild.ToString()))
                throw new Exception("You have to set AppCenter secret key");

            if (!GlobalSetting.Instance.IsTest)
                Distribute.CheckForUpdate();

            Microsoft.AppCenter.AppCenter.Start(_appCenterBuild.ToString(),
              typeof(Analytics), typeof(Crashes), typeof(Distribute));
        }
    }

GlobalSetting.Instance.IsTest propertysi ile kontrol edip, AppCenter version check işlemini yapıyorum.

ViewModelLocator > Init

            if (GlobalSetting.Instance.UseAppCenter)
            {
                var _appCenter = Resolve<Services.AppCenter.IAppCenterService>();
                _appCenter.Init();
            }

Uygulamamızda kullanacağımız her servis çağrısının event bazlı loglanmasını sağlayacağız. Tüm servislerimizin içerisindeki tüm methodlara gidip TrackEvent yapmamız anlamsız olacağı için bu işlemleri tek bir method altında yöneteceğiz. Zaten yapımızı oluştururken bu kısımları düşünerek oluşturmuştuk. Kullanacağımız methodları belirleyip, genişleteceğiz ve istediğimiz yapıda kullanıma sunacağız.

IApiRequestSelector

    public interface IApiRequestSelector<T> : IServiceBase
    {
        T GetApiRequestByPriority(IApiRequest<T> apiRequest, PriorityType priorityType, [CallerMemberName] string methodName = "");
    }

Burada propertyi CallerMemberName olarak eklemekteki amacımız runtime’da kullanılan methodu bize verebiliyor olması. Direkt string methodName olarak ekleseydim yine gidip tüm methodlarda değişiklik yapmam gerekecekti. Amacımızın en başından beri değişime kapalı, gelişime açık bir şekilde proje geliştirmek olduğunu unutmamalıyız.

ApiRequestSelector

public T GetApiRequestByPriority(IApiRequest<T> apiRequest, PriorityType priorityType, [CallerMemberName] string methodName = "")
        {
            Analytics.TrackEvent($"CallerMemberName: {methodName}",
                new Dictionary<string, string>
                {
                    {
                        "Time", DateTime.Now.ToString()
                    }
                });

            switch (priorityType)
            {
                case PriorityType.Speculative:
                    return apiRequest.Speculative;
                case PriorityType.UserInitiated:
                    return apiRequest.UserInitiated;
                case PriorityType.Background:
                    return apiRequest.Background;
                default:
                    return apiRequest.UserInitiated;
            }
        }

TrackEvent methodunu istediğiniz şekilde genişletebilirsiniz.

App.xaml.cs

            GlobalSetting.Instance.UseAppCenter = true;
            GlobalSetting.Instance.AppCenterAndroidKey = "298a2e08-5c19-4da3-b6f8-953d64c49ff2;";

UserService altındaki Get methodunu çalıştırdığımda direkt event log attığını görüyoruz.

Versioning test için AppCenter portal menüsündeki Distribute > Releases kısmına bir version çıkmamız gerekmektedir. Çok detaylı bir konu değil zaten linkten tüm özelliklerini inceleyebilirsiniz.

Yiğit

Xamarin Developer, Consultant & Architect. Community Leader and Director of Xamarin Türkiye

Post A Reply