13 Haziran 2020 Cumartesi

Android uygulama kill olduğunda push notification almama sorununun çözümü


Bir süredir sıklıkla Xamarin.Forms uygulamamda push notification'lar ile cebelleşmekteydim. Bu seferki "mono laneti" değil, tamamen bilgisizlik. :D Böyle böyle öğreniyoruz işte güzel de oluyor. Şimdi sıra unutmamak için bloguma not etmekte. (ÖVUN : Unutmama ve Öğrenme Notu :P)

Kısaca neden her şey sorunsuz çalışırken notificationlar ile ilgili sorun yaşamaya başladığımdan bahsedeyim; çünkü düz notificationlardan sıkılmıştım ve heyecan arıyordum. Notification'ıma butonlar resimler sesler fln eklemek istedim :) Bunu da AppCenter'ın simple push notification'ı ile yapmak mümkün değil. Yani notification ortamımı değiştirip Firebase'e geçiş yaptıım.. Bunu nasıl yaptığımla ilgili de bloguma ÖVUN ekleyeceğim ama ilk olarak beni 2 gün boyunca uğraştıran uygulama kill olduğunda notification gelmeme sorununun çözümünü paylaşayım.

iOS'u implemente ettik sıkıntı yok, ama Android'e gelince uygulama arka planda olmadığı müddetçe notification hiç gelmiyor gibi davranıyordu.
Sorun düz notification atmıyor oluşumdu. Yani içinde karmaşık bir data bulunduran ve notification'ı alıp işleyip butonlu resimli bir hale getirmem gerekliliği notification alamıyor oluşumun nedeniydi.



Yukarıdaki görüntü çoğu yazılımcı için tanıdıktır. Araştırma, tab tab tab, örnek projeler, stackoverflowlar. Gerçekten gocunmuyorum severim workaround dolaşmayı. Ama bu kadar mı çözümsüz çözümler sunulabilir, mümkün değil diyenlerle, ama o zaman x-y uygulaması nasıl yapıyor diyenlerin birbirine girmesi. Garip garip "hackvari" çözümler vs.. Xamarin forumu zaten komple acziyet doluydu. Neyse :D 

Sağlıklı çözüme araştırmalarımdan ulaşamadım maalesef. Ama meğer araştırmayı bilmiyormuşum. Uzmanımın yol göstermesiyle notification gelme olayında başarılı olan bir uygulamanın apk'sını indirip biraz karıştırdık ve çözüme bu şekilde ulaşmış olduk.

Çözüm manifest dosyasına birkaç ayar eklemek kadar basitti aslında. Anahtar kelimemiz; 

android:stopWithTask="false"

Peki bu ayarı nasıl ekliyoruz? Manifest'i source code editor ile açıp application taglarının içine aşağıdaki komutu yapıştırıyoruz; 

<service android:name="com.mybundle.myapp.MyBackgroundMessagingService" android:exported="false" android:stopWithTask="false">
     <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
          <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
     </intent-filter>
</service>

Tahmin edebileceğiniz gibi "com.mybundle.myapp.MyBackgroundMessagingService" kısmına kendi uygulamanızı ve servisinizi yazmanız gerekiyor.

Bir de direkt olarak etkisi var mıdır emin olmamakla birlikte şu permission'ları da ekledim;

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.VIBRATE" />

Artık application'ızı kill edip edip içinde datası olan da olmayan da yakışıklı notification'larınızın keyfini yaşayıp yaşatabilirsiniz.