{"id":33632,"date":"2025-11-05T09:31:16","date_gmt":"2025-11-05T06:31:16","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/"},"modified":"2025-11-05T09:31:16","modified_gmt":"2025-11-05T06:31:16","slug":"firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/","title":{"rendered":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak"},"content":{"rendered":"<p><body><\/p>\n<p>Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token&#8217;lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token&#8217;lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.<\/p>\n<p>Mobil uygulama geli\u015ftiricileri olarak, kullan\u0131c\u0131lar\u0131m\u0131zla anl\u0131k ve etkili bir \u015fekilde ileti\u015fim kurmak, uygulaman\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Firebase Cloud Messaging (FCM), bu ileti\u015fimi sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir platform sunar. Uygulaman\u0131zdaki \u00f6nemli geli\u015fmelerden haberdar etmek, yeni i\u00e7erikleri duyurmak, i\u015flem onaylar\u0131 g\u00f6ndermek veya sadece kullan\u0131c\u0131lar\u0131 yeniden etkile\u015fime sokmak i\u00e7in push bildirimleri alt\u0131n bir anahtard\u0131r. Ancak bu g\u00fc\u00e7l\u00fc anahtar\u0131 do\u011fru kullanmak, temel bir kavram\u0131 do\u011fru anlamakla ba\u015flar: Firebase push token&#8217;lar\u0131n\u0131n do\u011fas\u0131.<\/p>\n<p>Pek \u00e7ok geli\u015ftirici, ne yaz\u0131k ki, Firebase push token&#8217;lar\u0131n\u0131 do\u011frudan kullan\u0131c\u0131lara ba\u011flama e\u011filimindedir. Yani, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, o kullan\u0131c\u0131ya ait oldu\u011funu d\u00fc\u015f\u00fcnd\u00fckleri bir token&#8217;\u0131 veritabanlar\u0131nda tek bir giri\u015f olarak kaydederler. Bu yakla\u015f\u0131m, ilk bak\u0131\u015fta mant\u0131kl\u0131 gibi g\u00f6r\u00fcnse de, Firebase&#8217;in temel prensipleriyle \u00e7eli\u015fir ve uygulaman\u0131zda zamanla ciddi sorunlara yol a\u00e7ar. Bir kullan\u0131c\u0131 birden fazla cihazda uygulaman\u0131z\u0131 kullan\u0131yorsa veya bir cihazda farkl\u0131 kullan\u0131c\u0131lar oturum a\u00e7\u0131p kapat\u0131yorsa, bu hatal\u0131 yakla\u015f\u0131m bildirimlerin yanl\u0131\u015f ki\u015filere gitmesine, \u00f6nemli bildirimlerin ka\u00e7\u0131r\u0131lmas\u0131na veya g\u00fcvenlik zafiyetlerine neden olabilir.<\/p>\n<p>Bu makalede, Firebase push token&#8217;lar\u0131n\u0131n neden cihazlara \u00f6zel oldu\u011funu, bu yanl\u0131\u015f anlaman\u0131n getirdi\u011fi tehlikeleri ve en \u00f6nemlisi, bu sorunu a\u015fmak i\u00e7in uygulamalar\u0131n\u0131zda nas\u0131l do\u011fru bir refaktoring yapman\u0131z gerekti\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n bildirim altyap\u0131s\u0131n\u0131 daha g\u00fcvenilir, \u00f6l\u00e7eklenebilir ve kullan\u0131c\u0131 dostu hale getirerek, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n her zaman do\u011fru zamanda do\u011fru bilgiyi almas\u0131n\u0131 sa\u011flamakt\u0131r. Haz\u0131r m\u0131s\u0131n\u0131z? \u00d6yleyse, Firebase Cloud Messaging&#8217;in temel ta\u015flar\u0131n\u0131 yeniden in\u015fa etmeye ba\u015flayal\u0131m.<\/p>\n<h2>Temel Ta\u015flar: Firebase Cloud Messaging ve Cihaz Belirte\u00e7leri Nelerdir?<\/h2>\n<p>Firebase Cloud Messaging (FCM), Google taraf\u0131ndan sa\u011flanan, Android, iOS ve web uygulamalar\u0131na bildirim ve mesaj g\u00f6ndermek i\u00e7in \u00e7apraz platform bir \u00e7\u00f6z\u00fcmd\u00fcr. Geli\u015ftiricilerin, kullan\u0131c\u0131lar\u0131n\u0131 uygulamay\u0131 kullanmad\u0131klar\u0131 zamanlarda bile bilgilendirmelerine olanak tan\u0131r. FCM, mesajlar\u0131 g\u00fcvenilir bir \u015fekilde hedeflenen cihazlara ula\u015ft\u0131r\u0131r ve \u00e7e\u015fitli mesaj tiplerini destekler: bildirim mesajlar\u0131 (notification messages) ve veri mesajlar\u0131 (data messages).<\/p>\n<p>Bir uygulaman\u0131n FCM \u00fczerinden bildirim alabilmesi i\u00e7in, her cihaz\u0131n benzersiz bir tan\u0131mlay\u0131c\u0131ya ihtiyac\u0131 vard\u0131r. \u0130\u015fte bu noktada &#8220;cihaz belirteci&#8221; veya &#8220;cihaz token&#8217;\u0131&#8221; (genellikle sadece &#8220;FCM token&#8221; veya &#8220;registration token&#8221; olarak an\u0131l\u0131r) devreye girer. Bir kullan\u0131c\u0131 uygulaman\u0131z\u0131 ilk kez ba\u015flatt\u0131\u011f\u0131nda, Firebase SDK&#8217;s\u0131 otomatik olarak bu benzersiz token&#8217;\u0131 olu\u015fturur ve FCM sunucular\u0131na kaydeder. Bu token, uygulaman\u0131z\u0131n y\u00fckl\u00fc oldu\u011fu belirli bir cihaza \u00f6zeldir ve mesajlar\u0131n o cihaza y\u00f6nlendirilmesini sa\u011flar.<\/p>\n<p>Token&#8217;\u0131n cihaza \u00f6zel olmas\u0131 ne anlama geliyor? \u015eunu d\u00fc\u015f\u00fcn\u00fcn: Bir kullan\u0131c\u0131 iPhone&#8217;unda uygulaman\u0131z\u0131 y\u00fckler ve bir token olu\u015fturulur. Ayn\u0131 kullan\u0131c\u0131 daha sonra iPad&#8217;ine de ayn\u0131 uygulamay\u0131 y\u00fcklerse, iPad&#8217;de farkl\u0131 bir token olu\u015fturulur. Yani, ayn\u0131 kullan\u0131c\u0131n\u0131n farkl\u0131 cihazlar\u0131 i\u00e7in farkl\u0131 token&#8217;lar mevcuttur. Dahas\u0131, bir kullan\u0131c\u0131 telefonunda uygulaman\u0131z\u0131 silip yeniden y\u00fckledi\u011finde bile, genellikle yeni bir token olu\u015fturulur. Ayn\u0131 cihaz \u00fczerinde, uygulama verileri temizlendi\u011finde veya baz\u0131 nadir durumlarda, Firebase SDK&#8217;s\u0131 var olan token&#8217;\u0131 yenileyebilir ve yeni bir token atayabilir. Bu yenilenme, bildirimlerin kesintisiz bir \u015fekilde devam etmesi i\u00e7in y\u00f6netilmesi gereken kritik bir s\u00fcre\u00e7tir.<\/p>\n<p>Bu belirte\u00e7ler, FCM altyap\u0131s\u0131nda cihaz ile uygulaman\u0131z aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Sunucu taraf\u0131n\u0131zdan bir bildirim g\u00f6ndermek istedi\u011finizde, bu token&#8217;\u0131 kullanarak FCM API&#8217;sine hangi cihaza bildirim g\u00f6ndermesi gerekti\u011fini s\u00f6ylersiniz. FCM, bu token&#8217;\u0131 kullanarak mesaj\u0131 ilgili cihaza y\u00f6nlendirir. Bu mimari, bildirimlerin y\u00fcksek \u00f6l\u00e7ekte ve g\u00fcvenilir bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar. Ancak, bu mekanizman\u0131n temelini olu\u015fturan token&#8217;lar\u0131n cihaz-spesifik do\u011fas\u0131n\u0131 do\u011fru anlamak ve y\u00f6netmek, uygulaman\u0131z\u0131n bildirim deneyiminin ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Aksi takdirde, en iyi niyetlerle tasarlanm\u0131\u015f bildirim ak\u0131\u015f\u0131n\u0131z bile kaosa d\u00f6n\u00fc\u015febilir.<\/p>\n<h2>Yayg\u0131n Hata: Token&#8217;lar\u0131 Kullan\u0131c\u0131 Kimli\u011fiyle E\u015fle\u015ftirmeye \u00c7al\u0131\u015fmak Neden Yanl\u0131\u015f?<\/h2>\n<p>Bir\u00e7ok geli\u015ftirici, Firebase push token&#8217;lar\u0131n\u0131 veritaban\u0131nda direkt olarak kullan\u0131c\u0131 kimlikleriyle (User ID) e\u015fle\u015ftirerek &#8220;bir kullan\u0131c\u0131ya bir token&#8221; mant\u0131\u011f\u0131yla ilerleme e\u011filimindedir. Bu, ilk bak\u0131\u015fta kolay ve pratik bir \u00e7\u00f6z\u00fcm gibi g\u00f6r\u00fcnse de, Firebase&#8217;in \u00e7al\u0131\u015fma prensipleri ve ger\u00e7ek d\u00fcnya kullan\u0131m senaryolar\u0131 d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde ciddi sorunlara yol a\u00e7an bir <a href=\"https:\/\/tr.wikipedia.org\/wiki\/Antipattern\">antipattern<\/a>&#8216;dir. Peki, bu yakla\u015f\u0131m neden hatal\u0131d\u0131r ve hangi tehlikeleri bar\u0131nd\u0131r\u0131r?<\/p>\n<h3>Neden &#8220;Tek Token, Tek Kullan\u0131c\u0131&#8221; Yakla\u015f\u0131m\u0131 Yanl\u0131\u015f?<\/h3>\n<ul>\n<li><strong>\u00c7oklu Cihaz Problemi:<\/strong> G\u00fcn\u00fcm\u00fcz d\u00fcnyas\u0131nda kullan\u0131c\u0131lar uygulamalar\u0131 birden fazla cihazda (telefon, tablet, web taray\u0131c\u0131s\u0131 vb.) kullan\u0131r. E\u011fer veritaban\u0131n\u0131zda bir kullan\u0131c\u0131ya sadece tek bir token kaydederseniz, kullan\u0131c\u0131n\u0131n di\u011fer cihazlar\u0131 bildirim alamaz. \u00d6rne\u011fin, telefonunda oturum a\u00e7m\u0131\u015f bir kullan\u0131c\u0131 tabletinde de oturum a\u00e7t\u0131\u011f\u0131nda, veritaban\u0131na sadece son kaydedilen cihaz\u0131n token&#8217;\u0131 yaz\u0131l\u0131r ve di\u011fer cihaz\u0131n token&#8217;\u0131 silinir veya g\u00fcncelli\u011fini yitirir. Bu durumda, kullan\u0131c\u0131ya g\u00f6nderilen bildirimler sadece son oturum a\u00e7\u0131lan cihaza ula\u015f\u0131r, di\u011ferleri bildirim alamaz. Bu, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir eksikliktir.<\/li>\n<li><strong>Cihaz\u0131n Sahip De\u011fi\u015ftirmesi veya Misafir Kullan\u0131m:<\/strong> Bir cihazda bir kullan\u0131c\u0131 oturum a\u00e7t\u0131ktan sonra oturumunu kapat\u0131p ba\u015fka bir kullan\u0131c\u0131 oturum a\u00e7t\u0131\u011f\u0131nda ne olur? E\u011fer token do\u011frudan \u00f6nceki kullan\u0131c\u0131ya ba\u011fl\u0131ysa, yeni kullan\u0131c\u0131 uygulamay\u0131 kullan\u0131rken \u00f6nceki kullan\u0131c\u0131n\u0131n bildirimlerini alabilir. Bu sadece kullan\u0131c\u0131 deneyimi i\u00e7in k\u00f6t\u00fc olmakla kalmaz, ayn\u0131 zamanda ciddi bir gizlilik ve g\u00fcvenlik riski olu\u015fturur. Kullan\u0131c\u0131lar, ki\u015fisel bildirimlerinin ba\u015fkalar\u0131na gitmesini kesinlikle istemez.<\/li>\n<li><strong>Token Yenileme ve Ge\u00e7ersizle\u015fme:<\/strong> Firebase token&#8217;lar\u0131 kal\u0131c\u0131 de\u011fildir; zaman zaman yenilenebilir veya tamamen ge\u00e7ersiz hale gelebilirler. Uygulama g\u00fcncellemeleri, uygulama verilerinin temizlenmesi veya Firebase sunucular\u0131ndaki baz\u0131 i\u00e7 de\u011fi\u015fiklikler bu yenilenmeyi tetikleyebilir. E\u011fer veritaban\u0131n\u0131zda eski, ge\u00e7ersiz bir token varsa, o token&#8217;a g\u00f6nderilen bildirimler ba\u015far\u0131s\u0131z olur ve kullan\u0131c\u0131ya ula\u015fmaz. &#8220;Tek token&#8221; mant\u0131\u011f\u0131, bu yenilemeleri d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmeyi zorla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc her yenileme durumunda hangi eski token&#8217;\u0131n silinip hangi yeni token&#8217;\u0131n eklenece\u011fi karma\u015f\u0131k hale gelir.<\/li>\n<li><strong>Performans ve \u00d6l\u00e7eklenebilirlik Sorunlar\u0131:<\/strong> Yanl\u0131\u015f bir token y\u00f6netimi, zamanla veritaban\u0131n\u0131zda kullan\u0131lmayan veya ge\u00e7ersiz hale gelmi\u015f binlerce token birikmesine neden olabilir. Bu, bildirim g\u00f6nderme s\u00fcre\u00e7lerinizin yava\u015flamas\u0131na, sunucu kaynaklar\u0131n\u0131n gereksiz yere t\u00fcketilmesine ve genel sistem performans\u0131n\u0131n d\u00fc\u015fmesine yol a\u00e7ar. Her bildirim g\u00f6nderme denemesinde ba\u015far\u0131s\u0131z olan token&#8217;larla u\u011fra\u015fmak, maliyetli ve zaman al\u0131c\u0131d\u0131r.<\/li>\n<\/ul>\n<h3>Vaka Analizi: E-Ticaret Uygulamas\u0131<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131 Ay\u015fe, hem cep telefonundan hem de tabletinden uygulamaya giri\u015f yap\u0131yor. E\u011fer uygulaman\u0131n backend&#8217;i Ay\u015fe&#8217;nin kullan\u0131c\u0131 kimli\u011fine sadece bir Firebase token&#8217;\u0131 ba\u011fl\u0131yorsa, son oturum a\u00e7t\u0131\u011f\u0131 cihaz\u0131n token&#8217;\u0131 kaydedilir. Diyelim ki Ay\u015fe telefonunda sepete bir \u00fcr\u00fcn ekledi. &#8220;Sepetinizde \u00fcr\u00fcn var!&#8221; bildirimi sadece son oturum a\u00e7t\u0131\u011f\u0131 cihaza gider. E\u011fer bu cihaz tableti ise, telefonu bildirim alamaz. Bu, Ay\u015fe&#8217;nin \u00f6nemli bir hat\u0131rlatmay\u0131 ka\u00e7\u0131rmas\u0131na ve potansiyel olarak al\u0131\u015fveri\u015fi tamamlamamas\u0131na neden olabilir. Daha da k\u00f6t\u00fcs\u00fc, Ay\u015fe telefonunda oturumu kapat\u0131p arkada\u015f\u0131 Zeynep ayn\u0131 telefonda kendi hesab\u0131yla oturum a\u00e7arsa ve sistem hala Ay\u015fe&#8217;nin eski token&#8217;\u0131n\u0131 Zeynep&#8217;in cihaz\u0131nda tutuyorsa, Zeynep Ay\u015fe&#8217;nin sepet bildirimlerini alabilir. Bu, kullan\u0131c\u0131 g\u00fcvenli\u011fi ve gizlili\u011fi a\u00e7\u0131s\u0131ndan kabul edilemez bir durumdur. Bu t\u00fcr senaryolar, do\u011fru token y\u00f6netiminin ne kadar kritik oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu sorunu \u00e7\u00f6zmek i\u00e7in mimarimizi yeniden yap\u0131land\u0131rmam\u0131z gerekiyor.<\/p>\n<h2>Do\u011fru Mimari: Cihaza \u00d6zel Firebase Token&#8217;lar\u0131 Kullan\u0131c\u0131 Kimlikleriyle Nas\u0131l \u0130li\u015fkilendirilir?<\/h2>\n<p>Firebase push token&#8217;lar\u0131n\u0131n cihaz-spesifik oldu\u011funu kabul ettikten sonra, do\u011fru mimariyi kurmak \u00e7ok daha net hale gelir. Ama\u00e7, bir kullan\u0131c\u0131 birden fazla cihazda oturum a\u00e7t\u0131\u011f\u0131nda, her cihaz\u0131n benzersiz token&#8217;\u0131n\u0131 o kullan\u0131c\u0131ya ba\u011flamak ve bu token&#8217;lar\u0131 etkili bir \u015fekilde y\u00f6netmektir. \u0130\u015fte bu kritik refaktoring ad\u0131mlar\u0131:<\/p>\n<h3>Veritaban\u0131 \u015eemas\u0131n\u0131 Yeniden Yap\u0131land\u0131rma<\/h3>\n<p>Veritaban\u0131 yap\u0131n\u0131z, bu yakla\u015f\u0131m\u0131n temelini olu\u015fturur. Art\u0131k bir kullan\u0131c\u0131n\u0131n tek bir token&#8217;a sahip oldu\u011funu varsaymak yerine, her kullan\u0131c\u0131n\u0131n birden fazla cihaza ve dolay\u0131s\u0131yla birden fazla token&#8217;a sahip olabilece\u011fini hesaba katmal\u0131y\u0131z. \u00d6nerilen yap\u0131 genellikle a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre><code class=\"language-json\">\n  \/\/ Kullan\u0131c\u0131 koleksiyonu (\u00f6rnek: Firestore veya MongoDB)\n  {\n    \"users\": [\n      {\n        \"userId\": \"user_id_123\",\n        \"email\": \"user123@example.com\",\n        \"name\": \"Ahmet Y\u0131lmaz\",\n        \"devices\": [ \/\/ Her cihaza \u00f6zel token'lar\u0131 tutan bir alt koleksiyon veya dizi\n          {\n            \"deviceId\": \"device_uuid_abc\", \/\/ Cihaz\u0131 benzersiz tan\u0131mlayan bir ID\n            \"fcmToken\": \"fcm_token_string_for_device_abc\",\n            \"platform\": \"android\", \/\/ veya \"ios\", \"web\"\n            \"lastLogin\": \"2023-10-27T10:00:00Z\",\n            \"isActive\": true\n          },\n          {\n            \"deviceId\": \"device_uuid_def\",\n            \"fcmToken\": \"fcm_token_string_for_device_def\",\n            \"platform\": \"ios\",\n            \"lastLogin\": \"2023-10-27T11:30:00Z\",\n            \"isActive\": true\n          }\n        ]\n      }\n    ]\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, her <code class=\"language-text\">userId<\/code> alt\u0131nda bir <code class=\"language-text\">devices<\/code> alt koleksiyonu veya dizisi bulundurur. Her cihaz giri\u015fi kendi benzersiz <code class=\"language-text\">deviceId<\/code>'sine (uygulaman\u0131z\u0131n her cihaz i\u00e7in olu\u015fturdu\u011fu UUID veya platforma \u00f6zel bir kimlik), <code class=\"language-text\">fcmToken<\/code>'\u0131na, platform bilgisine ve di\u011fer ilgili verilere (\u00f6rne\u011fin son oturum a\u00e7ma zaman\u0131) sahip olur.<\/p>\n<h3>\u0130stemci Taraf\u0131nda Token Y\u00f6netimi<\/h3>\n<p>Uygulaman\u0131z\u0131n istemci taraf\u0131nda (mobil veya web), Firebase SDK's\u0131n\u0131 kullanarak FCM token'\u0131n\u0131 alman\u0131z ve bu token'\u0131 sunucuya g\u00f6ndermeniz gerekir. Bu s\u00fcre\u00e7, genellikle kullan\u0131c\u0131 ba\u015far\u0131yla oturum a\u00e7t\u0131ktan sonra veya uygulama ilk ba\u015flat\u0131ld\u0131\u011f\u0131nda ger\u00e7ekle\u015fir.<\/p>\n<pre><code class=\"language-javascript\">\n  \/\/ Firebase SDK ile FCM token'\u0131n\u0131 alma (\u00d6rnek: JavaScript\/React Native)\n  import messaging from '@react-native-firebase\/messaging';\n  import firestore from '@react-native-firebase\/firestore';\n  import { getUniqueId } from 'react-native-device-info'; \/\/ Cihaz ID'si i\u00e7in \u00f6rnek k\u00fct\u00fcphane\n\n  async function registerDeviceForNotifications(userId) {\n    try {\n      const fcmToken = await messaging().getToken();\n      const deviceId = getUniqueId(); \/\/ Cihaz i\u00e7in benzersiz ID\n\n      if (fcmToken) {\n        console.log(\"FCM Token:\", fcmToken);\n        console.log(\"Device ID:\", deviceId);\n\n        \/\/ Sunucuya veya do\u011frudan Firestore'a token'\u0131 kaydet\n        await firestore().collection('users').doc(userId).collection('devices').doc(deviceId).set({\n          fcmToken: fcmToken,\n          platform: Platform.OS, \/\/ 'ios' veya 'android'\n          timestamp: firestore.FieldValue.serverTimestamp(),\n          isActive: true\n        }, { merge: true }); \/\/ Var olan verileri koruyarak g\u00fcncelle\n        console.log(\"Cihaz token'\u0131 ba\u015far\u0131yla kaydedildi.\");\n      }\n    } catch (error) {\n      console.error(\"FCM token kaydederken hata olu\u015ftu:\", error);\n    }\n  }\n\n  \/\/ Kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra bu fonksiyonu \u00e7a\u011f\u0131r\u0131n\n  \/\/ registerDeviceForNotifications(currentUser.uid);\n\n  \/\/ Token'\u0131n yenilenme durumunu dinlemek i\u00e7in (\u00f6nemli!)\n  messaging().onTokenRefresh(async newToken => {\n    console.log(\"FCM Token yenilendi:\", newToken);\n    const deviceId = getUniqueId();\n    const userId = \/* Mevcut oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131n\u0131n ID'si *\/;\n\n    if (userId) {\n      await firestore().collection('users').doc(userId).collection('devices').doc(deviceId).update({\n        fcmToken: newToken,\n        timestamp: firestore.FieldValue.serverTimestamp()\n      });\n      console.log(\"Yeni token ba\u015far\u0131yla g\u00fcncellendi.\");\n    }\n  });\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, kullan\u0131c\u0131 oturum a\u00e7t\u0131\u011f\u0131nda, uygulaman\u0131n benzersiz bir <code class=\"language-text\">deviceId<\/code> olu\u015fturdu\u011funu (genellikle cihaz\u0131n benzersiz kimli\u011fi) ve <code class=\"language-text\">fcmToken<\/code> ile birlikte <code class=\"language-text\">users\/{userId}\/devices\/{deviceId}<\/code> yoluna kaydetti\u011fini g\u00f6r\u00fcyoruz. <code class=\"language-text\">onTokenRefresh<\/code> metodunun do\u011fru bir \u015fekilde implemente edilmesi, token'lar yenilendi\u011finde uygulaman\u0131z\u0131n da g\u00fcncel token'\u0131 veritaban\u0131na kaydetmesini sa\u011flar. Bu, bildirimlerin s\u00fcrekli olarak do\u011fru cihazlara ula\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<h3>Sunucu Taraf\u0131nda Token Kayd\u0131 ve Kullan\u0131m\u0131<\/h3>\n<p>Backend sunucunuzun rol\u00fc, istemciden gelen token'lar\u0131 almak, bunlar\u0131 do\u011fru kullan\u0131c\u0131 kimlikleriyle ili\u015fkilendirmek ve bildirim g\u00f6ndermek istedi\u011finizde bu token'lar\u0131 kullanarak FCM'ye istek g\u00f6ndermektir. Bildirim g\u00f6nderme zaman\u0131 geldi\u011finde, ilgili kullan\u0131c\u0131n\u0131n t\u00fcm cihaz token'lar\u0131n\u0131 veritaban\u0131ndan \u00e7ekmeniz ve her birine ayr\u0131 ayr\u0131 bildirim g\u00f6ndermeniz veya bunlar\u0131 toplu bir istekle FCM'ye iletmeniz gerekir.<\/p>\n<pre><code class=\"language-javascript\">\n  \/\/ Node.js ile Firebase Admin SDK kullanarak bildirim g\u00f6nderme (\u00d6rnek)\n  const admin = require('firebase-admin');\n  const serviceAccount = require('.\/path\/to\/your\/serviceAccountKey.json');\n\n  admin.initializeApp({\n    credential: admin.credential.cert(serviceAccount)\n  });\n\n  async function sendNotificationToUser(userId, title, body, data = {}) {\n    try {\n      const userDevicesSnapshot = await admin.firestore()\n        .collection('users')\n        .doc(userId)\n        .collection('devices')\n        .where('isActive', '==', true) \/\/ Sadece aktif cihazlara g\u00f6nder\n        .get();\n\n      if (userDevicesSnapshot.empty) {\n        console.log(<code>Kullan\u0131c\u0131 ${userId} i\u00e7in aktif cihaz bulunamad\u0131.<\/code>);\n        return;\n      }\n\n      const registrationTokens = userDevicesSnapshot.docs.map(doc => doc.data().fcmToken);\n\n      const message = {\n        notification: {\n          title: title,\n          body: body\n        },\n        data: data,\n        tokens: registrationTokens, \/\/ Birden fazla token'a ayn\u0131 anda g\u00f6nderim\n      };\n\n      const response = await admin.messaging().sendEachForMulticast(message);\n      console.log('Bildirim g\u00f6nderim \u00f6zeti:', response);\n\n      \/\/ Ba\u015far\u0131s\u0131z olan token'lar\u0131 veritaban\u0131ndan temizleme\n      if (response.responses) {\n        response.responses.forEach(async (resp, index) => {\n          if (!resp.success && resp.error) {\n            const error = resp.error;\n            const token = registrationTokens[index];\n            console.warn(<code>Token ${token} i\u00e7in bildirim ba\u015far\u0131s\u0131z:<\/code>, error.code);\n\n            \/\/ Token'\u0131n art\u0131k ge\u00e7erli olmad\u0131\u011f\u0131n\u0131 kontrol et (\u00f6rne\u011fin \"messaging\/invalid-registration-token\")\n            if (error.code === 'messaging\/invalid-registration-token' ||\n                error.code === 'messaging\/registration-token-not-registered') {\n              console.log(<code>Ge\u00e7ersiz token ${token} veritaban\u0131ndan siliniyor.<\/code>);\n              \/\/ \u0130lgili cihaz kayd\u0131n\u0131 bulup silin\n              const deviceToDelete = userDevicesSnapshot.docs.find(doc => doc.data().fcmToken === token);\n              if (deviceToDelete) {\n                await deviceToDelete.ref.delete();\n                console.log(<code>Cihaz ${deviceToDelete.id} silindi.<\/code>);\n              }\n            }\n          }\n        });\n      }\n    } catch (error) {\n      console.error(\"Kullan\u0131c\u0131ya bildirim g\u00f6nderirken hata olu\u015ftu:\", error);\n    }\n  }\n\n  \/\/ \u00d6rnek kullan\u0131m\n  \/\/ sendNotificationToUser('user_id_123', 'Yeni Mesaj\u0131n\u0131z Var', 'Merhaba, nas\u0131ls\u0131n\u0131z?');\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Bildirim g\u00f6nderimlerinde Firebase Admin SDK's\u0131n\u0131n <code>sendEachForMulticast<\/code> veya <code>sendAll<\/code> gibi toplu g\u00f6nderim metotlar\u0131n\u0131 kullanmak, tek tek token'lara bildirim g\u00f6ndermekten \u00e7ok daha verimlidir. Bu metotlar, FCM'nin HTTP v1 API'sini kullanarak ayn\u0131 anda y\u00fczlerce veya binlerce token'a bildirim g\u00f6ndermenizi sa\u011flar ve i\u015flem maliyetini d\u00fc\u015f\u00fcr\u00fcr. Ayr\u0131ca, bu metotlar\u0131n geri d\u00f6n\u00fc\u015flerini (<code>responses<\/code>) kontrol ederek ba\u015far\u0131s\u0131z olan token'lar\u0131 temizlemeyi unutmay\u0131n! Bu, veritaban\u0131n\u0131z\u0131n g\u00fcncel ve temiz kalmas\u0131n\u0131 sa\u011flar.\n<\/div>\n<p>Bu yakla\u015f\u0131m, bir kullan\u0131c\u0131n\u0131n birden fazla cihaz\u0131 olsa bile t\u00fcm cihazlar\u0131na bildirim g\u00f6nderilmesini sa\u011flar. Ayr\u0131ca, <code class=\"language-text\">isActive<\/code> alan\u0131 veya son oturum a\u00e7ma zaman\u0131 gibi ek bilgilerle, sadece aktif ve g\u00fcncel cihazlara bildirim g\u00f6nderilmesini de sa\u011flayabilirsiniz. Bu, bildirimlerinizin her zaman do\u011fru yerlere, do\u011fru zamanda ve g\u00fcvenilir bir \u015fekilde ula\u015fmas\u0131n\u0131 garanti eden sa\u011flam bir altyap\u0131 olu\u015fturur.<\/p>\n<h2>Geli\u015fmi\u015f Stratejiler: Token Yenileme, \u0130ptali ve G\u00fcvenlik En \u0130yi Uygulamalar\u0131<\/h2>\n<p>Firebase token y\u00f6netimini do\u011fru bir \u015fekilde kurmak sadece token'lar\u0131 kaydetmekten ibaret de\u011fildir. Token'lar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc anlamak ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapatmak, daha sa\u011flam bir bildirim altyap\u0131s\u0131 i\u00e7in elzemdir. \u0130\u015fte bu konuda dikkat etmeniz gereken baz\u0131 ileri d\u00fczey stratejiler ve en iyi uygulamalar:<\/p>\n<h3>FCM Token Ya\u015fam D\u00f6ng\u00fcs\u00fc ve onNewToken Y\u00f6netimi<\/h3>\n<p>Daha \u00f6nce de bahsetti\u011fimiz gibi, FCM token'lar\u0131 herhangi bir zamanda yenilenebilir. Bu, a\u015fa\u011f\u0131daki durumlar\u0131 i\u00e7erebilir:<\/p>\n<ul>\n<li>Uygulama, yeni bir cihaza y\u00fcklendi\u011finde.<\/li>\n<li>Kullan\u0131c\u0131 uygulama verilerini temizledi\u011finde.<\/li>\n<li>Uygulama, cihazda uzun bir s\u00fcre kullan\u0131lmad\u0131\u011f\u0131nda.<\/li>\n<li>G\u00fcvenlik nedenleriyle Firebase taraf\u0131ndan token yenileme karar\u0131 al\u0131nd\u0131\u011f\u0131nda.<\/li>\n<\/ul>\n<p>Bu yenilenmeleri yakalamak ve veritaban\u0131n\u0131z\u0131 g\u00fcncellemek i\u00e7in istemci taraf\u0131nda <code class=\"language-text\">onNewToken<\/code> (Android) veya <code class=\"language-text\">onTokenRefresh<\/code> (iOS\/React Native\/Web) metodunu mutlaka implemente etmelisiniz. Bu metot \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, yeni token'\u0131 al\u0131p kullan\u0131c\u0131n\u0131n <code class=\"language-text\">deviceId<\/code>'si ile ili\u015fkilendirerek veritaban\u0131n\u0131zdaki ilgili cihaz kayd\u0131n\u0131 g\u00fcncellemeniz gerekir. Bu, eski token'\u0131n ge\u00e7ersiz kalmamas\u0131n\u0131 ve bildirim ak\u0131\u015f\u0131n\u0131n kesintiye u\u011framamas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Token \u0130ptali ve Temizli\u011fi (Garbage Collection)<\/h3>\n<p>Token'lar sadece yenilenmekle kalmaz, ayn\u0131 zamanda tamamen ge\u00e7ersiz hale de gelebilir. Bir kullan\u0131c\u0131 uygulaman\u0131z\u0131 bir cihazdan kald\u0131rd\u0131\u011f\u0131nda veya oturumu kapatt\u0131\u011f\u0131nda, o cihaz\u0131n token'\u0131 art\u0131k kullan\u0131lmamal\u0131d\u0131r. FCM, ge\u00e7ersiz token'lara bildirim g\u00f6ndermeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda genellikle hata koduyla geri bildirimde bulunur (\u00f6rne\u011fin, <code class=\"language-text\">messaging\/invalid-registration-token<\/code> veya <code class=\"language-text\">messaging\/registration-token-not-registered<\/code>). Sunucu taraf\u0131n\u0131zda, bu hata kodlar\u0131n\u0131 yakalayarak ilgili token'\u0131 ve cihaz kayd\u0131n\u0131 veritaban\u0131n\u0131zdan silmek i\u00e7in bir mekanizma kurmal\u0131s\u0131n\u0131z. Bu \"garbage collection\" s\u00fcreci, veritaban\u0131n\u0131z\u0131n \u015fi\u015fmesini engeller ve bildirim g\u00f6nderme performans\u0131n\u0131z\u0131 art\u0131r\u0131r.<\/p>\n<p>Ek olarak, kullan\u0131c\u0131 oturumunu kapatt\u0131\u011f\u0131nda veya hesab\u0131n\u0131 sildi\u011finde, istemci uygulaman\u0131z\u0131n <code class=\"language-text\">messaging().deleteToken()<\/code> metodunu \u00e7a\u011f\u0131rarak Firebase'den o cihaz i\u00e7in token'\u0131 kald\u0131rmas\u0131 ve sunucunuza bir istek g\u00f6ndererek veritaban\u0131n\u0131zdaki ilgili cihaz kayd\u0131n\u0131 silmesini sa\u011flaman\u0131z \u00f6nemlidir. Bu, kullan\u0131c\u0131n\u0131n gizlili\u011fini korur ve art\u0131k uygulaman\u0131zla etkile\u015fimi olmayan cihazlara bildirim g\u00f6ndermenizi engeller.<\/p>\n<h3>G\u00fcvenlik Hususlar\u0131: Token H\u0131rs\u0131zl\u0131\u011f\u0131 ve Yetkilendirme<\/h3>\n<p>FCM token'lar\u0131 hassas bilgiler olmasa da, k\u00f6t\u00fc niyetli ki\u015filer taraf\u0131ndan ele ge\u00e7irilip spam bildirimleri g\u00f6ndermek i\u00e7in kullan\u0131labilir. Bu nedenle, token y\u00f6netiminde g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 takip etmek \u00f6nemlidir:<\/p>\n<ul>\n<li><strong>Token'lar\u0131 Do\u011frudan Kullan\u0131c\u0131lardan Almay\u0131n:<\/strong> M\u00fcmk\u00fcnse, Firebase Admin SDK's\u0131n\u0131 veya g\u00fcvenli bir backend hizmetini kullanarak token'lar\u0131 do\u011frulay\u0131n ve kaydedin. Kullan\u0131c\u0131n\u0131n do\u011frudan bir token g\u00f6ndermesine izin vermek yerine, token'\u0131 ve kullan\u0131c\u0131n\u0131n kimli\u011fini (\u00f6rne\u011fin Firebase Authentication UID) birlikte bir API endpoint'ine g\u00f6nderin ve sunucunuzda bu bilgileri do\u011frulay\u0131n.<\/li>\n<li><strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong> Token'lar\u0131 kaydeden veya silen t\u00fcm API endpoint'lerinin g\u00fc\u00e7l\u00fc kimlik do\u011frulama ve yetkilendirme mekanizmalar\u0131na sahip oldu\u011fundan emin olun. Sadece oturum a\u00e7m\u0131\u015f ve yetkili kullan\u0131c\u0131lar\u0131n kendi cihaz token'lar\u0131 \u00fczerinde i\u015flem yapmas\u0131na izin verin.<\/li>\n<li><strong>Token'lar\u0131 Saklarken Hassasiyet:<\/strong> Token'lar herkese a\u00e7\u0131k de\u011fildir, ancak veritaban\u0131n\u0131zda saklarken yine de dikkatli olun. Veritaban\u0131 g\u00fcvenlik \u00f6nlemlerinizi (\u015fifreleme, eri\u015fim kontrol\u00fc) g\u00fc\u00e7l\u00fc tutun.<\/li>\n<\/ul>\n<h3>Konu Bazl\u0131 Bildirimler ve Hedefleme<\/h3>\n<p>Bazen belirli bir kullan\u0131c\u0131ya do\u011frudan bildirim g\u00f6ndermek yerine, belirli bir kullan\u0131c\u0131 segmentine (\u00f6rne\u011fin, \"haberler\" grubuna abone olanlar veya \"premium\" \u00fcyeler) bildirim g\u00f6ndermek isteyebilirsiniz. Firebase Topics, bu senaryo i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. Kullan\u0131c\u0131lar\u0131n\u0131z\u0131 belirli konulara abone edebilir ve sunucu taraf\u0131nda o konuya bildirim g\u00f6ndererek, o konuya abone olan t\u00fcm cihazlara bildirim ula\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Ancak bu, cihaz bazl\u0131 token g\u00f6nderiminin yerine ge\u00e7mez; genellikle ikisi birlikte kullan\u0131l\u0131r. Kullan\u0131c\u0131 bir konuya abone oldu\u011funda, o cihaza \u00f6zel token'\u0131n o konuya abone edildi\u011fini Firebase'e bildirirsiniz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Ge\u00e7ersizle\u015fen token'lar\u0131 temizleme i\u015flemini otomatikle\u015ftirmek i\u00e7in, bildirim g\u00f6nderme API'nizde bir hata i\u015fleme mekanizmas\u0131 olu\u015fturman\u0131n yan\u0131 s\u0131ra, d\u00fczenli aral\u0131klarla (\u00f6rne\u011fin, haftal\u0131k bir cron i\u015fiyle) t\u00fcm token'lar\u0131n\u0131z\u0131 Firebase Admin SDK's\u0131n\u0131n \"validateRegistrationTokens\" benzeri bir metoduyla (e\u011fer mevcutsa) kontrol ederek veya send denemesi yaparak temizleyebilirsiniz. Bu proaktif yakla\u015f\u0131m, veritaban\u0131n\u0131z\u0131n her zaman g\u00fcncel kalmas\u0131n\u0131 sa\u011flar.\n<\/div>\n<p>Bu geli\u015fmi\u015f stratejiler, uygulaman\u0131z\u0131n bildirim altyap\u0131s\u0131n\u0131 sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda dayan\u0131kl\u0131, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir hale getirir. Token'lar\u0131n do\u011fru y\u00f6netimi, hem geli\u015ftirici verimlili\u011fi hem de son kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan uzun vadede b\u00fcy\u00fck fark yaratacakt\u0131r.<\/p>\n<h2>Uygulamal\u0131 Senaryo ve Vaka Analizi: \u00c7oklu Cihaz Deste\u011fi<\/h2>\n<p>\u015eimdiye kadar ele ald\u0131\u011f\u0131m\u0131z teorik bilgileri, ger\u00e7ek bir senaryo \u00fczerinden peki\u015ftirelim. Pop\u00fcler bir sosyal medya uygulamas\u0131n\u0131n \"\u00e7oklu cihaz deste\u011fi\" \u00f6zelli\u011fini d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131lar\u0131m\u0131z\u0131n \u00e7o\u011fu, uygulamay\u0131 hem ak\u0131ll\u0131 telefonlar\u0131nda hem de tabletlerinde veya i\u015f bilgisayarlar\u0131ndaki web taray\u0131c\u0131lar\u0131nda kullanmaktad\u0131r. Amac\u0131m\u0131z, kullan\u0131c\u0131lar\u0131m\u0131za g\u00f6nderdi\u011fimiz her bildirimin, oturum a\u00e7t\u0131klar\u0131 t\u00fcm aktif cihazlar\u0131na ula\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r. Bu, \u00f6zellikle anl\u0131k mesajla\u015fma veya \u00f6nemli etkinlik hat\u0131rlatmalar\u0131 gibi kritik bildirimler i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Senaryo: Kullan\u0131c\u0131 \"Deniz\" ve Cihazlar\u0131<\/h3>\n<p>Deniz, sosyal medya uygulamas\u0131n\u0131 aktif olarak kullanan bir kullan\u0131c\u0131d\u0131r. Uygulaman\u0131n kurulu oldu\u011fu cihazlar\u0131 \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Ak\u0131ll\u0131 Telefon (Android):<\/strong> G\u00fcnl\u00fck hayatta en \u00e7ok kulland\u0131\u011f\u0131 cihaz.<\/li>\n<li><strong>Tablet (iOS):<\/strong> Evde daha \u00e7ok kulland\u0131\u011f\u0131, genellikle video izledi\u011fi cihaz.<\/li>\n<li><strong>Diz\u00fcst\u00fc Bilgisayar (Web):<\/strong> \u0130\u015f yerinde veya ders \u00e7al\u0131\u015f\u0131rken taray\u0131c\u0131 \u00fczerinden kulland\u0131\u011f\u0131 web uygulamas\u0131.<\/li>\n<\/ol>\n<p>Deniz, t\u00fcm bu cihazlarda uygulamaya kendi kullan\u0131c\u0131 kimli\u011fi ile giri\u015f yapm\u0131\u015ft\u0131r. Eski, hatal\u0131 token y\u00f6netim modelinde, Deniz'e g\u00f6nderilen bir bildirim (\u00f6rne\u011fin, \"Yeni mesaj\u0131n\u0131z var!\") sadece en son oturum a\u00e7t\u0131\u011f\u0131 cihaza ula\u015fabilirdi. Bu da Deniz'in di\u011fer cihazlar\u0131nda bildirimleri ka\u00e7\u0131rmas\u0131na veya mesajlar\u0131 ge\u00e7 g\u00f6rmesine neden olabilirdi.<\/p>\n<h3>Do\u011fru Token Y\u00f6netimiyle \u00c7\u00f6z\u00fcm<\/h3>\n<p>Uygulamam\u0131z, makalede \u00f6nerilen do\u011fru token y\u00f6netim mimarisini uyguluyor:<\/p>\n<ol>\n<li><strong>Cihaz Kayd\u0131 ve Token Saklama:<\/strong>\n<ul>\n<li>Deniz, ak\u0131ll\u0131 telefonunda oturum a\u00e7t\u0131\u011f\u0131nda, telefonun benzersiz <code class=\"language-text\">deviceId<\/code>'si (UUID) ve Firebase taraf\u0131ndan olu\u015fturulan <code class=\"language-text\">fcmToken<\/code>'\u0131, sunucumuza g\u00f6nderilir. Sunucu, bu token'\u0131 Deniz'in <code class=\"language-text\">users\/deniz_id\/devices\/telefon_id<\/code> yolunda Firestore'a kaydeder.<\/li>\n<li>Ayn\u0131 \u015fekilde, tabletinde oturum a\u00e7t\u0131\u011f\u0131nda, tabletin <code class=\"language-text\">deviceId<\/code>'si ve farkl\u0131 bir <code class=\"language-text\">fcmToken<\/code>'\u0131 <code class=\"language-text\">users\/deniz_id\/devices\/tablet_id<\/code> yoluna kaydedilir.<\/li>\n<li>Web uygulamas\u0131nda oturum a\u00e7t\u0131\u011f\u0131nda da taray\u0131c\u0131ya \u00f6zg\u00fc <code class=\"language-text\">deviceId<\/code> ve <code class=\"language-text\">fcmToken<\/code>'\u0131 <code class=\"language-text\">users\/deniz_id\/devices\/web_id<\/code> yoluna eklenir.<\/li>\n<\/ul>\n<p>        Sonu\u00e7 olarak, Deniz'in veritaban\u0131nda \u00fc\u00e7 farkl\u0131 aktif cihaz kayd\u0131 ve \u00fc\u00e7 farkl\u0131 FCM token'\u0131 bulunmaktad\u0131r, hepsi Deniz'in kullan\u0131c\u0131 kimli\u011fiyle ili\u015fkilidir.<\/li>\n<li><strong>Bildirim G\u00f6nderimi:<\/strong>\n<ul>\n<li>Deniz'e bir arkada\u015f\u0131ndan yeni bir mesaj geldi\u011finde, sunucu taraf\u0131m\u0131zdaki bildirim servisi \u00e7al\u0131\u015f\u0131r.<\/li>\n<li>Servis, \u00f6nce Deniz'in kullan\u0131c\u0131 kimli\u011fini (<code class=\"language-text\">deniz_id<\/code>) kullanarak Firestore'dan <code class=\"language-text\">users\/deniz_id\/devices<\/code> alt koleksiyonundaki t\u00fcm cihaz kay\u0131tlar\u0131n\u0131 \u00e7eker.<\/li>\n<li>\u00c7ekilen kay\u0131tlardan, aktif (<code class=\"language-text\">isActive: true<\/code>) olan t\u00fcm <code class=\"language-text\">fcmToken<\/code>'lar\u0131 bir listeye toplar (telefon token'\u0131, tablet token'\u0131, web token'\u0131).<\/li>\n<li>Bu token listesini kullanarak Firebase Admin SDK's\u0131n\u0131n <code class=\"language-text\">sendEachForMulticast<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla \"Yeni mesaj\u0131n\u0131z var!\" bildirimini t\u00fcm bu token'lara g\u00f6nderir.<\/li>\n<\/ul>\n<p>        Bu sayede, Deniz'in hem ak\u0131ll\u0131 telefonu, hem tableti hem de web uygulamas\u0131 ayn\u0131 anda yeni mesaj bildirimini al\u0131r.<\/li>\n<li><strong>Oturum Kapatma ve Token Temizli\u011fi:<\/strong>\n<ul>\n<li>Deniz, diz\u00fcst\u00fc bilgisayar\u0131ndaki web uygulamas\u0131ndan oturumu kapatt\u0131\u011f\u0131nda, istemci uygulamas\u0131 <code class=\"language-text\">messaging().deleteToken()<\/code>'\u0131 \u00e7a\u011f\u0131r\u0131r ve sunucuya <code class=\"language-text\">web_id<\/code>'ye sahip cihaz kayd\u0131n\u0131n silinmesi i\u00e7in bir istek g\u00f6nderir.<\/li>\n<li>Sunucu, <code class=\"language-text\">users\/deniz_id\/devices\/web_id<\/code> kayd\u0131n\u0131 veritaban\u0131ndan siler. Art\u0131k web cihaz\u0131 bildirim alamaz.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Token Yenilenmesi:<\/strong>\n<ul>\n<li>Deniz'in ak\u0131ll\u0131 telefonundaki Firebase token'\u0131 bir s\u00fcre sonra otomatik olarak yenilendi\u011finde, uygulaman\u0131n <code class=\"language-text\">onNewToken<\/code> callback'i tetiklenir.<\/li>\n<li>Uygulama, yeni token'\u0131 ve telefonun <code class=\"language-text\">deviceId<\/code>'sini sunucuya g\u00f6nderir. Sunucu, <code class=\"language-text\">users\/deniz_id\/devices\/telefon_id<\/code> kayd\u0131n\u0131 g\u00fcncelleyerek eski token yerine yeni token'\u0131 yazar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Bu vaka analizi, do\u011fru token y\u00f6netimiyle bir kullan\u0131c\u0131n\u0131n birden fazla cihaz\u0131 aras\u0131nda sorunsuz bir bildirim deneyiminin nas\u0131l sa\u011fland\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu yakla\u015f\u0131m sadece kullan\u0131c\u0131 deneyimini iyile\u015ftirmekle kalmaz, ayn\u0131 zamanda gereksiz bildirim g\u00f6nderme hatalar\u0131n\u0131 azaltarak sistem kaynaklar\u0131n\u0131 daha verimli kullan\u0131r ve uygulaman\u0131n genel g\u00fcvenilirli\u011fini art\u0131r\u0131r. Geli\u015ftiriciler olarak, bu refaktoringi uygulamalar\u0131m\u0131z\u0131n temel bir par\u00e7as\u0131 haline getirmek, kullan\u0131c\u0131 memnuniyetini do\u011frudan etkileyecek kritik bir ad\u0131md\u0131r.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fe Y\u00f6nelik Sa\u011flam Bildirim Altyap\u0131s\u0131 \u0130\u00e7in Refakt\u00f6r\u00fcn \u00d6nemi<\/h2>\n<p>Bu makalede ele ald\u0131\u011f\u0131m\u0131z gibi, Firebase push token'lar\u0131n\u0131n do\u011fas\u0131 gere\u011fi cihaza \u00f6zel oldu\u011funu anlamak ve bu bilgiyi do\u011fru bir \u015fekilde uygulamalar\u0131m\u0131z\u0131n mimarisine entegre etmek, g\u00fc\u00e7l\u00fc ve g\u00fcvenilir bir bildirim altyap\u0131s\u0131n\u0131n temelini olu\u015fturur. \"Bir kullan\u0131c\u0131ya bir token\" yan\u0131lg\u0131s\u0131ndan s\u0131yr\u0131l\u0131p \"bir kullan\u0131c\u0131ya birden fazla cihazdan gelen birden fazla token\" modeline ge\u00e7i\u015f yapmak, ilk ba\u015fta ek bir \u00e7aba gibi g\u00f6r\u00fcnse de, uzun vadede uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fi, kullan\u0131c\u0131 deneyimi ve g\u00fcvenli\u011fi a\u00e7\u0131s\u0131ndan kritik faydalar sa\u011flar.<\/p>\n<p>Do\u011fru veritaban\u0131 \u015femas\u0131n\u0131 olu\u015fturmak, istemci taraf\u0131nda token al\u0131m\u0131n\u0131 ve yenilenmesini y\u00f6netmek, sunucu taraf\u0131nda bu token'lar\u0131 kullan\u0131c\u0131 kimlikleriyle ili\u015fkilendirerek etkili bir \u015fekilde bildirim g\u00f6ndermek ve ge\u00e7ersiz token'lar\u0131 temizlemek, bu refaktoring s\u00fcrecinin ana ad\u0131mlar\u0131d\u0131r. Bu ad\u0131mlar\u0131 dikkatlice takip ederek, uygulaman\u0131z\u0131n kullan\u0131c\u0131lar\u0131na her zaman do\u011fru zamanda, do\u011fru cihazdan do\u011fru bilgiyi ula\u015ft\u0131rd\u0131\u011f\u0131ndan emin olabilirsiniz. Bu sayede, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n uygulaman\u0131zla olan etkile\u015fimini art\u0131r\u0131rken, bildirimlerle ilgili olas\u0131 hayal k\u0131r\u0131kl\u0131klar\u0131n\u0131 ve g\u00fcvenlik endi\u015felerini ortadan kald\u0131rm\u0131\u015f olursunuz. Unutmay\u0131n, iyi bir bildirim altyap\u0131s\u0131, ba\u015far\u0131l\u0131 bir mobil uygulaman\u0131n olmazsa olmaz\u0131d\u0131r.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>1. Firebase token'\u0131m neden kendili\u011finden de\u011fi\u015fiyor?<\/h3>\n<p>Firebase token'lar\u0131, Firebase Cloud Messaging (FCM) taraf\u0131ndan cihaz\u0131n\u0131z i\u00e7in \u00f6zel olarak olu\u015fturulan benzersiz tan\u0131mlay\u0131c\u0131lard\u0131r. Bunlar uygulama verileri temizlendi\u011finde, uygulama yeniden y\u00fcklendi\u011finde, cihaz fabrika ayarlar\u0131na d\u00f6nd\u00fc\u011f\u00fcnde veya g\u00fcvenlik nedeniyle FCM sunucular\u0131 taraf\u0131ndan yenilenebilir. Bu yenilenmeler, bildirim ak\u0131\u015f\u0131n\u0131n kesintiye u\u011framamas\u0131 i\u00e7in uygulaman\u0131z\u0131n <code class=\"language-text\">onNewToken<\/code> veya <code class=\"language-text\">onTokenRefresh<\/code> metodunu dinlemesi ve sunucu taraf\u0131nda g\u00fcncellemesi gereken normal bir durumdur.<\/p>\n<h3>2. Kullan\u0131c\u0131 oturumu kapatt\u0131\u011f\u0131nda token'\u0131 silmeli miyim?<\/h3>\n<p>Evet, kesinlikle silmelisiniz. Kullan\u0131c\u0131 bir cihazdan oturumunu kapatt\u0131\u011f\u0131nda, o cihaz\u0131n token'\u0131 art\u0131k o kullan\u0131c\u0131yla ili\u015fkilendirilmemelidir. \u0130stemci uygulaman\u0131z <code class=\"language-text\">messaging().deleteToken()<\/code> metodunu \u00e7a\u011f\u0131rmal\u0131 ve ard\u0131ndan sunucu taraf\u0131ndaki veritaban\u0131n\u0131zdan ilgili cihaz kayd\u0131n\u0131 (token ile birlikte) kald\u0131rmal\u0131d\u0131r. Bu, gizlilik ve g\u00fcvenlik a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir, \u00e7\u00fcnk\u00fc aksi takdirde eski kullan\u0131c\u0131n\u0131n bildirimleri cihazda oturum a\u00e7an yeni bir kullan\u0131c\u0131ya gidebilir.<\/p>\n<h3>3. Bir kullan\u0131c\u0131n\u0131n birden fazla cihaz\u0131na ayn\u0131 anda nas\u0131l bildirim g\u00f6nderirim?<\/h3>\n<p>Do\u011fru token y\u00f6netimi mimarisini uygulad\u0131\u011f\u0131n\u0131zda, bir kullan\u0131c\u0131n\u0131n t\u00fcm cihaz token'lar\u0131n\u0131 veritaban\u0131n\u0131zda ayr\u0131 ayr\u0131 saklars\u0131n\u0131z. Bir bildirim g\u00f6ndermek istedi\u011finizde, kullan\u0131c\u0131n\u0131n t\u00fcm aktif cihaz token'lar\u0131n\u0131 veritaban\u0131n\u0131zdan \u00e7ekersiniz ve Firebase Admin SDK's\u0131n\u0131n <code class=\"language-text\">sendEachForMulticast<\/code> veya <code class=\"language-text\">sendAll<\/code> gibi toplu g\u00f6nderim metotlar\u0131n\u0131 kullanarak bu token listesine bildirim g\u00f6nderirsiniz. Bu metotlar, tek bir API \u00e7a\u011fr\u0131s\u0131 ile birden fazla cihaza ayn\u0131 anda bildirim iletmenizi sa\u011flar.<\/p>\n<h3>4. Firebase token'lar\u0131 kullan\u0131c\u0131 verisi midir? GDPR\/KVKK kapsam\u0131nda nas\u0131l ele al\u0131nmal\u0131?<\/h3>\n<p>Firebase token'lar\u0131 do\u011frudan bir kullan\u0131c\u0131n\u0131n kimli\u011fini if\u015fa etmez, ancak belirli bir cihaza ve dolay\u0131s\u0131yla dolayl\u0131 olarak bir kullan\u0131c\u0131ya ba\u011flanabilirler. Bu nedenle, \u00e7o\u011fu gizlilik d\u00fczenlemesi (GDPR, KVKK vb.) kapsam\u0131nda ki\u015fisel veri olarak kabul edilebilirler. Bu token'lar\u0131 toplarken, saklarken ve i\u015flerken gizlilik politikalar\u0131n\u0131za uyman\u0131z, kullan\u0131c\u0131lardan izin alman\u0131z ve g\u00fcvenli bir \u015fekilde y\u00f6netmeniz \u00f6nemlidir. Kullan\u0131c\u0131lar\u0131n token'lar\u0131n\u0131 silme veya g\u00fcncelleme haklar\u0131na sayg\u0131 g\u00f6stermeniz gerekir.<\/p>\n<h3>5. Uygulamam\u0131 mobil uyumlu HTML \u00e7\u0131kt\u0131s\u0131na nas\u0131l d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\u00fcm? (Bu makalede bahsedilen mobil uyumlu HTML \u00fcretme kriteri i\u00e7in)<\/h3>\n<p>Bu makale zaten HTML format\u0131nda yaz\u0131lm\u0131\u015ft\u0131r. Mobil uyumluluk i\u00e7in, web sayfalar\u0131n\u0131n (bu makalenin sunuldu\u011fu sayfa gibi) CSS <code class=\"language-text\">@media<\/code> sorgular\u0131n\u0131 kullanarak farkl\u0131 ekran boyutlar\u0131na g\u00f6re d\u00fczenini ayarlamas\u0131 gerekir. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-css\">\n  \/* Genel stiller *\/\n  body {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    margin: 0 auto;\n    max-width: 900px;\n    padding: 20px;\n  }\n\n  \/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in stiller (mobil) *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 10px;\n      margin: 0 10px;\n    }\n    h2 {\n      font-size: 1.5em;\n    }\n    p {\n      font-size: 0.95em;\n    }\n    \/* interactive-tip gibi \u00f6zel div'lerin geni\u015fli\u011fini ayarla *\/\n    .expert-tip {\n      width: 100%;\n      box-sizing: border-box; \/* padding'i geni\u015fli\u011fe dahil et *\/\n    }\n  }\n\n  \/* Daha k\u00fc\u00e7\u00fck ekranlar i\u00e7in *\/\n  @media (max-width: 480px) {\n    h2 {\n      font-size: 1.3em;\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS \u00f6rne\u011fi, farkl\u0131 ekran geni\u015fliklerine g\u00f6re yaz\u0131 tipi boyutlar\u0131n\u0131 ve genel sayfa d\u00fczenini ayarlayarak bu makalenin bir web sitesinde mobil cihazlarda daha iyi g\u00f6r\u00fcnmesini sa\u011flar. Bu, <code class=\"language-text\">viewport meta<\/code> etiketiyle birlikte kullan\u0131ld\u0131\u011f\u0131nda tam mobil uyumluluk sa\u011flar.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token&#8217;lar\u0131n\u0131n do\u011fas\u0131n\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33632","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak<\/title>\n<meta name=\"description\" content=\"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token&#039;lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token&#039;lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak\" \/>\n<meta property=\"og:description\" content=\"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token&#039;lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token&#039;lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-05T06:31:16+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak\",\"datePublished\":\"2025-11-05T06:31:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\"},\"wordCount\":4251,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\",\"name\":\"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-05T06:31:16+00:00\",\"description\":\"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token'lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token'lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak","description":"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token'lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token'lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/","og_locale":"tr_TR","og_type":"article","og_title":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak","og_description":"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token'lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token'lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-05T06:31:16+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak","datePublished":"2025-11-05T06:31:16+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/"},"wordCount":4251,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/","url":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/","name":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-05T06:31:16+00:00","description":"Firebase push bildirimleri, mobil uygulamalar\u0131n kullan\u0131c\u0131larla etkile\u015fim kurmas\u0131n\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Ancak, bir\u00e7ok geli\u015ftirici Firebase token'lar\u0131n\u0131n do\u011fas\u0131n\u0131 yanl\u0131\u015f anlayarak uygulamalar\u0131nda hatalara yol a\u00e7abilir. Bu makale, push token'lar\u0131n\u0131n cihaz-spesifik oldu\u011funu, kullan\u0131c\u0131-spesifik olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayacak ve bu yayg\u0131n hatadan ka\u00e7\u0131narak daha sa\u011flam bir bildirim altyap\u0131s\u0131 kurmak i\u00e7in atman\u0131z gereken kritik refaktoring ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-push-token-yonetimi-cihaza-ozel-belirtecleri-kullaniciya-baglamak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Firebase Push Token Y\u00f6netimi: Cihaza \u00d6zel Belirte\u00e7leri Kullan\u0131c\u0131ya Ba\u011flamak"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33632"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33632\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}