19 Eylül 2018 Çarşamba

Xamarin.iOS handling notifications at foreground or background and reaching the custom data in it


İngilizce başlıktan sonra abesle iştigal edip yazımı türkçe yazacağım. :)

Bir süredir notification'larla boğuşuyorum. Boğuşmamın nedeni ise sürekli değişen bir altyapı olmuş sanırım ve birr dolu farklı dökümantasyondaki yolları izleyip denemem gerekti. Temiz ve düzenli bilgiye maalesef ulaşamadım, zaten örnek de fazla bulabilmiş değilim.

Her neyse deneye yanıla ios kısmındaki notification yönetimini şu şekilde yaptım;

AppDelegate class'ındaki FinishedLaunching'e aşağıdaki gibi kodlar nakşedilir. Bu kısım foreground yani uygulama açıkken çalışacak kısmı ifade ediyor.



public
 override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            Forms.Init();
// … kodlar kodlar … //
// … kodlar kodlar … //

            if (UIDevice.CurrentDevice.CheckSystemVersion(80))
            {
                var notificationSettings = UIUserNotificationSettings.GetSettingsForTypes(
                    UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null
                );

                app.RegisterUserNotificationSettings(notificationSettings);
            }

            // Foreground notifications için.
            UNUserNotificationCenter.Current.Delegate = new UserNotificationCenterDelegate();


            return base.FinishedLaunching(app, options);
        }





Nedir buradaki UserNotificationCenterDelegate() ? UNUserNotificationCenter'dan türetip metodlarını override ettiğimiz bir class. İşte şöyle;


public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {

#region Override Methods
        public override void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
        {   
              // custom data böyle alınıyormuş.. bunu bir türlü bulamamıştım.      
            var customData = response.Notification.Request.Content.UserInfo;

            
// … kodlar kodlar … //
            // … kodlar kodlar … //

            switch (response.ActionIdentifier)
            {
                    // Bu actionlar custom actionlar
                    // Yani notification’a buton eklediyseniz butonun id'sine göre buralar çalışıyor.
                    //Bu ayrı bir yazı konusu. :) 
                case "approve":
                    
// … kodlar kodlar … //
                    break;
                case "decline":
                    
// … kodlar kodlar … //
                    break;
                default:
                    // Bu actionlar default actionlar
                    // Yani notification’ın üzerine tıklandığında burası çalışıyor.
                    //haliyle custom datayı en çok burada kullandım.
                    if (response.IsDefaultAction)
                    {
                        if (_notificationCustomData != null)
                        {
                            
// … custom data ile dans eden kodlar … //
                        }
                    }
                    else if (response.IsDismissAction)
                    {
                        // Buraya düşüremedim uğraşmadım da gerçi
J
                    }
                    break;
            }
            // Inform caller it has been handled
            completionHandler();
        }

        public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
        {
            try
            {
                
// … kodlar kodlar … //
                // burada da custom data böyle alınıyormuş..
                var customData = notification.Request.Content.UserInfo;
               
                if (customData != null)
                {
                    
// … kodlar kodlar … //
                }else{
                
          // uygulama açıkken de isterseniz üstten notification gösterebilirsiniz, local notification oluşturabilirsiniz vs. tüm daha elinizde.
          // bu alert kısmı None olsa idi hiç notification göstermemiş olacaktık.
     completionHandler(UNNotificationPresentationOptions.Alert);
                    }
                }                
            }
            catch (Exception ex)
            {               
                System.Diagnostics.Debug.WriteLine(ex);
            }
        }
}



Bu arada AppCenter'ı kullandık notification'lar için. İnşallah örnek bir github projesi de oluşturmak istiyorum, o zaman daha kapsamlı bir yazı yazmak isterim nasipse kısmetseee :P

Şimdilik sadecee blogun yazarından bir mum duruşuuu :D

(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ )

Hay Allah :S