{"id":34686,"date":"2025-11-20T21:01:15","date_gmt":"2025-11-20T18:01:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/"},"modified":"2025-11-20T21:01:15","modified_gmt":"2025-11-20T18:01:15","slug":"webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/","title":{"rendered":"WebForms Core 2&#8217;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme"},"content":{"rendered":"<p><body><\/p>\n<p>Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web&#8217;in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda kullan\u0131c\u0131lar, ak\u0131c\u0131, h\u0131zl\u0131 ve kesintisiz deneyimler bekliyor. Eskiden, bu t\u00fcr deneyimler genellikle mobil uygulamalarla s\u0131n\u0131rl\u0131yd\u0131. Ancak, Native uygulamalar\u0131n geli\u015ftirme ve da\u011f\u0131t\u0131m maliyetleri, uygulama ma\u011fazalar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 ve kullan\u0131c\u0131lar\u0131n her web sitesi i\u00e7in bir uygulama indirme konusundaki isteksizli\u011fi, web geli\u015ftiricilerini yeni \u00e7\u00f6z\u00fcmler aramaya itti. \u0130\u015fte tam bu noktada, Progressive Web Uygulamalar\u0131 (PWA) sahneye \u00e7\u0131kt\u0131 ve web&#8217;in s\u0131n\u0131rlar\u0131n\u0131 yeniden tan\u0131mlad\u0131. Bir PWA, temelde modern web teknolojilerini kullanarak bir web sitesini uygulama benzeri \u00f6zelliklerle donatan bir yakla\u015f\u0131m\u0131 ifade eder. Peki, bu tam olarak ne anlama geliyor?<\/p>\n<p>Bir PWA&#8217;n\u0131n en \u00e7arp\u0131c\u0131 \u00f6zelliklerinden biri, internet ba\u011flant\u0131s\u0131 olmadan bile \u00e7al\u0131\u015fabilmesidir. D\u00fc\u015f\u00fcn\u00fcn ki, bir kullan\u0131c\u0131 metroda veya internetin olmad\u0131\u011f\u0131 bir b\u00f6lgede bile uygulaman\u0131z\u0131n temel i\u015flevlerine eri\u015febiliyor. Bu, Service Worker ad\u0131 verilen g\u00fc\u00e7l\u00fc bir teknoloji sayesinde m\u00fcmk\u00fcn olmaktad\u0131r. Ayr\u0131ca, PWA&#8217;lar cihaz\u0131n ana ekran\u0131na eklenebilir ve taray\u0131c\u0131 aray\u00fcz\u00fcnden ba\u011f\u0131ms\u0131z, tam ekran bir deneyim sunabilir. Bu sayede kullan\u0131c\u0131lar, uygulamalar\u0131n\u0131z\u0131 t\u0131pk\u0131 yerel bir uygulama gibi ba\u015flatabilir ve kullanabilirler. H\u0131z da PWA&#8217;lar\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r; daha h\u0131zl\u0131 y\u00fcklenme s\u00fcreleri ve ak\u0131c\u0131 animasyonlar sayesinde kullan\u0131c\u0131 memnuniyeti \u00f6nemli \u00f6l\u00e7\u00fcde artar. G\u00fcvenlik, bir PWA i\u00e7in kritik \u00f6neme sahiptir. T\u00fcm PWA&#8217;lar HTTPS \u00fczerinden sunulmak zorundad\u0131r, bu da veri g\u00fcvenli\u011fini ve kullan\u0131c\u0131 gizlili\u011fini garanti alt\u0131na al\u0131r.<\/p>\n<p>WebForms Core 2 geli\u015ftiricileri i\u00e7in bu, b\u00fcy\u00fck bir f\u0131rsat sunuyor. Mevcut ASP.NET Core WebForms projelerinizi, ek bir dil veya platform \u00f6\u011frenmeye gerek kalmadan, PWA standartlar\u0131na y\u00fckselterek kullan\u0131c\u0131lar\u0131n\u0131za \u00e7ok daha zengin bir deneyim sunabilirsiniz. \u00d6rne\u011fin, e-ticaret siteleri \u00fcr\u00fcn kataloglar\u0131n\u0131 \u00e7evrimd\u0131\u015f\u0131 \u00f6nbelle\u011fe alabilir, haber siteleri g\u00fcncel makaleleri internetsiz eri\u015fime a\u00e7abilir veya proje y\u00f6netim ara\u00e7lar\u0131, kullan\u0131c\u0131lar\u0131n g\u00f6revlerini internet ba\u011flant\u0131s\u0131 olmadan bile g\u00fcncellemelerine olanak tan\u0131yabilir. Bu, kullan\u0131c\u0131lar\u0131n mobil veya masa\u00fcst\u00fc cihazlar\u0131nda web uygulaman\u0131z\u0131 adeta yerel bir uygulama gibi hissetmelerini sa\u011flar, b\u00f6ylece uygulaman\u0131z\u0131n eri\u015filebilirli\u011fini ve kullan\u0131m oranlar\u0131n\u0131 art\u0131r\u0131r. K\u0131sacas\u0131, PWA&#8217;lar, web&#8217;in gelece\u011fidir ve WebForms Core 2 ile bu gelece\u011fi in\u015fa etmek art\u0131k \u00e7ok daha kolay.<\/p>\n<p>PWA&#8217;lar\u0131n sundu\u011fu bu devrim niteli\u011findeki avantajlar, kullan\u0131c\u0131lar\u0131n uygulamalarla etkile\u015fim \u015feklini temelden de\u011fi\u015ftirmektedir. Geli\u015ftiriciler i\u00e7in ise, tek bir kod taban\u0131yla birden fazla platformda (web, mobil) m\u00fckemmel bir deneyim sunma potansiyeli sunar. Bu da geli\u015ftirme s\u00fcre\u00e7lerini basitle\u015ftirirken, s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131r\u0131r. \u00d6zellikle WebForms Core 2 gibi olgunla\u015fm\u0131\u015f ve geni\u015f bir geli\u015ftirici kitlesine sahip bir platformda PWA yeteneklerini kullanmak, mevcut bilgi birikimini modern web standartlar\u0131yla birle\u015ftirmek anlam\u0131na gelir. B\u00f6ylece, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n sadece bir web sitesini ziyaret etmek yerine, ger\u00e7ekten &#8220;y\u00fckleyebilecekleri&#8221; ve &#8220;kullanabilecekleri&#8221; bir uygulama deneyimi elde etmelerini sa\u011flam\u0131\u015f olursunuz. Bu sayede, uygulaman\u0131z\u0131n kullan\u0131c\u0131lar taraf\u0131ndan daha fazla benimsenmesi ve g\u00fcnl\u00fck rutinlerinin bir par\u00e7as\u0131 haline gelmesi ka\u00e7\u0131n\u0131lmaz olacakt\u0131r.<\/p>\n<h2>Servis \u00c7al\u0131\u015fanlar\u0131: Web&#8217;in Gizli Kahramanlar\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>WebForms Core 2 uygulamalar\u0131n\u0131z\u0131 bir PWA&#8217;ya d\u00f6n\u00fc\u015ft\u00fcrmenin kalbinde, Service Worker (Servis \u00c7al\u0131\u015fan\u0131) ad\u0131 verilen JavaScript tabanl\u0131 \u00f6zel bir komut dosyas\u0131 bulunur. E\u011fer PWA&#8217;lar s\u00fcper kahramanlarsa, Service Worker&#8217;lar onlar\u0131n gizli yeteneklerini sa\u011flayan beyinlerdir diyebiliriz. Peki, bu &#8220;gizli kahramanlar&#8221; tam olarak ne i\u015fe yarar ve bir WebForms Core 2 projesinde nas\u0131l hayat bulur?<\/p>\n<p>Service Worker, taray\u0131c\u0131 ile a\u011f aras\u0131nda oturan bir proxy g\u00f6revi g\u00f6r\u00fcr. Bu, uygulaman\u0131z\u0131n a\u011f isteklerini kontrol edebilece\u011fi ve hatta tamamen \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fabilmesi i\u00e7in kaynaklar\u0131 \u00f6nbelle\u011fe alabilece\u011fi anlam\u0131na gelir. Geleneksel web sitelerinde bir internet ba\u011flant\u0131s\u0131 kesildi\u011finde kullan\u0131c\u0131lar genellikle &#8220;internet yok&#8221; hatas\u0131yla kar\u015f\u0131la\u015f\u0131rd\u0131. Service Worker sayesinde, uygulaman\u0131z bu t\u00fcr senaryolarda bile kullan\u0131c\u0131ya \u00f6nbellekten hizmet vererek kesintisiz bir deneyim sunabilir. Bu, \u00f6zellikle WebForms Core 2 gibi dinamik i\u00e7erik sunan uygulamalar i\u00e7in, kullan\u0131c\u0131lar\u0131n verimlili\u011fini ve memnuniyetini art\u0131rmada kritik bir rol oynar.<\/p>\n<p>Bir Service Worker&#8217;\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc \u00fc\u00e7 ana a\u015famadan olu\u015fur: kay\u0131t (registration), kurulum (installation) ve aktivasyon (activation). \u0130lk olarak, web sayfan\u0131z Service Worker&#8217;\u0131 taray\u0131c\u0131ya kaydeder. Kay\u0131t ba\u015far\u0131l\u0131 oldu\u011funda, Service Worker indirilip kurulur. Kurulum a\u015famas\u0131nda, genellikle uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan temel kaynaklar (HTML, CSS, JavaScript dosyalar\u0131, resimler vb.) taray\u0131c\u0131n\u0131n \u00f6nbelle\u011fine al\u0131n\u0131r. Bu &#8220;\u00f6nbelle\u011fe alma&#8221; i\u015flemi, uygulaman\u0131n daha sonra \u00e7evrimd\u0131\u015f\u0131 modda bile h\u0131zl\u0131ca y\u00fcklenmesini sa\u011flar. Kurulum tamamland\u0131ktan sonra, Service Worker aktive olur ve taray\u0131c\u0131n\u0131n a\u011f isteklerini dinlemeye ba\u015flar. Bu sayede, her a\u011f iste\u011fi \u00f6nce Service Worker&#8217;a ula\u015f\u0131r ve o, bu iste\u011fi nas\u0131l y\u00f6netece\u011fine karar verir: a\u011f\u0131 kullanarak m\u0131, yoksa \u00f6nbellekten mi yan\u0131t verecek?<\/p>\n<p>\u00d6rne\u011fin, bir WebForms Core 2 uygulamas\u0131nda, ana \u015fablon dosyan\u0131z\u0131, CSS dosyalar\u0131n\u0131z\u0131 ve ana JavaScript dosyalar\u0131n\u0131z\u0131 Service Worker ile \u00f6nbelle\u011fe alabilirsiniz. Kullan\u0131c\u0131 bu sayfay\u0131 ilk ziyaret etti\u011finde, bu kaynaklar indirilir ve \u00f6nbelle\u011fe al\u0131n\u0131r. Daha sonra, kullan\u0131c\u0131 internet ba\u011flant\u0131s\u0131 olmasa bile, ayn\u0131 sayfaya gitmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, Service Worker \u00f6nbellekten yan\u0131t vererek sayfan\u0131n an\u0131nda y\u00fcklenmesini sa\u011flar. Bu, yaln\u0131zca \u00e7evrimd\u0131\u015f\u0131 yetenek sa\u011flamakla kalmaz, ayn\u0131 zamanda internet ba\u011flant\u0131s\u0131 varken bile uygulaman\u0131n \u00e7ok daha h\u0131zl\u0131 y\u00fcklenmesini sa\u011flayarak genel performans\u0131n\u0131 art\u0131r\u0131r. Geli\u015ftiriciler, \u00f6nbellekleme stratejilerini uygulaman\u0131n ihtiya\u00e7lar\u0131na g\u00f6re \u00f6zelle\u015ftirebilirler; \u00f6rne\u011fin, &#8220;\u00f6nce \u00f6nbellek, sonra a\u011f&#8221; (cache-first, then network) veya &#8220;\u00f6nce a\u011f, sonra \u00f6nbellek&#8221; (network-first, then cache) gibi farkl\u0131 yakla\u015f\u0131mlar mevcuttur. Bu esneklik, WebForms Core 2 geli\u015ftiricilerine, uygulamalar\u0131n\u0131n hem h\u0131zl\u0131 hem de dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flama g\u00fcc\u00fc verir.<\/p>\n<p>Service Worker&#8217;lar ayr\u0131ca arka plan senkronizasyonu ve push bildirimleri gibi di\u011fer modern web \u00f6zelliklerinin de temelini olu\u015fturur. Bu, WebForms Core 2 uygulamalar\u0131n\u0131z\u0131n sadece \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fmakla kalmay\u0131p, ayn\u0131 zamanda kullan\u0131c\u0131larla daha etkile\u015fimli bir \u015fekilde ileti\u015fim kurabilmesini de sa\u011flar. K\u0131sacas\u0131, Service Worker&#8217;lar, WebForms Core 2 projelerinizi s\u0131radan bir web sitesinden, tam te\u015fekk\u00fcll\u00fc, dayan\u0131kl\u0131 ve modern bir uygulamaya d\u00f6n\u00fc\u015ft\u00fcren anahtar bile\u015fendir. Bu teknolojiyi anlamak ve do\u011fru bir \u015fekilde uygulamak, kullan\u0131c\u0131lar\u0131n\u0131za sunaca\u011f\u0131n\u0131z deneyimin kalitesini do\u011frudan etkileyecektir.<\/p>\n<h2>Kullan\u0131c\u0131lar\u0131 Tekrar Yakalamak: Push Bildirimleri Ne \u0130\u015fe Yarar?<\/h2>\n<p>Bir uygulaman\u0131n en b\u00fcy\u00fck zorluklar\u0131ndan biri, kullan\u0131c\u0131lar\u0131 uygulaman\u0131za geri d\u00f6nd\u00fcrmek ve onlarla s\u00fcrekli etkile\u015fim halinde kalmakt\u0131r. Kullan\u0131c\u0131lar bir kez uygulaman\u0131z\u0131 kapatt\u0131\u011f\u0131nda, onlar\u0131 tekrar \u00e7ekmek i\u00e7in genellikle pasif y\u00f6ntemler (e-posta, sosyal medya) kullan\u0131l\u0131r. Ancak Push Bildirimleri, bu etkile\u015fimi \u00e7ok daha do\u011frudan ve an\u0131nda hale getirerek WebForms Core 2 uygulamalar\u0131n\u0131za g\u00fc\u00e7l\u00fc bir ileti\u015fim kanal\u0131 kazand\u0131r\u0131r. Peki, Push Bildirimleri tam olarak nedir ve WebForms Core 2 projelerinizde nas\u0131l bir de\u011fer yarat\u0131r?<\/p>\n<p>Push Bildirimleri, kullan\u0131c\u0131 bir uygulamay\u0131 aktif olarak kullanmasa bile, ona do\u011frudan mesajlar veya uyar\u0131lar g\u00f6ndermenizi sa\u011flayan bir mekanizmad\u0131r. Bu bildirimler, kullan\u0131c\u0131n\u0131n cihaz\u0131n\u0131n ekran\u0131nda belirir ve dikkatini \u00e7ekerek uygulaman\u0131za geri d\u00f6nmesini te\u015fvik eder. \u00d6rne\u011fin, bir e-ticaret sitesi yeni bir indirim duyurusu yapabilir, bir haber uygulamas\u0131 son dakika haberlerini iletebilir veya bir takvim uygulamas\u0131 yakla\u015fan bir etkinli\u011fi hat\u0131rlatabilir. Bu do\u011frudan ileti\u015fim, kullan\u0131c\u0131 etkile\u015fimini, elde tutma oranlar\u0131n\u0131 ve sonu\u00e7 olarak i\u015f hedeflerine ula\u015fmay\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<p>Push Bildirim sisteminin arkas\u0131nda karma\u015f\u0131k gibi g\u00f6r\u00fcnen ancak anla\u015f\u0131l\u0131r bir mimari yatar. S\u00fcre\u00e7, temel olarak \u00fc\u00e7 ana bile\u015fenden olu\u015fur: web uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 istemci (kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131), bildirimleri g\u00f6nderecek olan sunucunuz (WebForms Core 2 uygulaman\u0131z) ve arac\u0131 g\u00f6revi g\u00f6ren taray\u0131c\u0131ya \u00f6zg\u00fc push servis sa\u011flay\u0131c\u0131lar\u0131 (\u00f6rne\u011fin, Google&#8217;\u0131n FCM &#8211; Firebase Cloud Messaging veya Mozilla&#8217;n\u0131n MPS &#8211; Mozilla Push Service). \u0130lk olarak, kullan\u0131c\u0131 uygulaman\u0131za bildirim g\u00f6nderme izni verir. Bu izin verildikten sonra, taray\u0131c\u0131 bir abonelik nesnesi olu\u015fturur. Bu abonelik nesnesi, benzersiz bir u\u00e7 nokta URL&#8217;si (endpoint URL) ve bir dizi kimlik do\u011frulama anahtar\u0131 i\u00e7erir. Bu bilgiler daha sonra WebForms Core 2 sunucunuza g\u00f6nderilir ve g\u00fcvenli bir \u015fekilde depolan\u0131r.<\/p>\n<p>Bir bildirim g\u00f6ndermek istedi\u011finizde, WebForms Core 2 sunucunuz depolad\u0131\u011f\u0131 abonelik bilgilerini kullanarak taray\u0131c\u0131n\u0131n push servis sa\u011flay\u0131c\u0131s\u0131na \u015fifrelenmi\u015f bir mesaj g\u00f6nderir. Bu mesaj, genellikle bildirim ba\u015fl\u0131\u011f\u0131, i\u00e7eri\u011fi, simgesi gibi bilgileri i\u00e7erir. Push servis sa\u011flay\u0131c\u0131s\u0131, mesaj\u0131 ald\u0131ktan sonra, kullan\u0131c\u0131n\u0131n cihaz\u0131na iletir. Kullan\u0131c\u0131n\u0131n cihaz\u0131 \u00e7evrimi\u00e7i oldu\u011funda, bildirim hemen g\u00f6r\u00fcn\u00fcr. E\u011fer \u00e7evrimd\u0131\u015f\u0131ysa, bildirim taray\u0131c\u0131 taraf\u0131ndan depolan\u0131r ve kullan\u0131c\u0131 \u00e7evrimi\u00e7i oldu\u011funda teslim edilir. Bu kesintisiz teslimat mekanizmas\u0131, kullan\u0131c\u0131lar\u0131n \u00f6nemli bilgilere zaman\u0131nda ula\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>WebForms Core 2 geli\u015ftiricileri i\u00e7in Push Bildirimleri entegrasyonu, uygulaman\u0131n proaktif bir ileti\u015fim stratejisi geli\u015ftirmesine olanak tan\u0131r. \u00d6rne\u011fin, bir proje y\u00f6netim arac\u0131, bir g\u00f6revin tamamland\u0131\u011f\u0131n\u0131 veya bir son tarihin yakla\u015ft\u0131\u011f\u0131n\u0131 kullan\u0131c\u0131lara an\u0131nda bildirebilir. Bu, kullan\u0131c\u0131lar\u0131n uygulamaya s\u00fcrekli ba\u011fl\u0131 kalmas\u0131n\u0131 ve \u00f6nemli g\u00fcncellemeleri ka\u00e7\u0131rmamas\u0131n\u0131 sa\u011flar. Push Bildirimleri, ayn\u0131 zamanda kullan\u0131c\u0131 segmentasyonuna olanak tan\u0131r; yani belirli kullan\u0131c\u0131 gruplar\u0131na \u00f6zel, ki\u015fiselle\u015ftirilmi\u015f bildirimler g\u00f6nderebilirsiniz. Bu ki\u015fiselle\u015ftirme, bildirimlerin alaka d\u00fczeyini art\u0131r\u0131r ve kullan\u0131c\u0131lar\u0131n daha fazla etkile\u015fime ge\u00e7me olas\u0131l\u0131\u011f\u0131n\u0131 y\u00fckseltir. Sonu\u00e7 olarak, Push Bildirimleri, WebForms Core 2 uygulaman\u0131z\u0131n kullan\u0131c\u0131larla olan ba\u011f\u0131n\u0131 g\u00fc\u00e7lendirmenin ve onlara de\u011fer sunman\u0131n g\u00fc\u00e7l\u00fc bir yoludur.<\/p>\n<h2>WebForms Core 2 Projenizi PWA&#8217;ya D\u00f6n\u00fc\u015ft\u00fcrme: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>\u015eimdi teoriden prati\u011fe ge\u00e7me zaman\u0131! Mevcut bir WebForms Core 2 uygulamas\u0131n\u0131 bir Progressive Web App (PWA) haline getirmek, san\u0131ld\u0131\u011f\u0131 kadar karma\u015f\u0131k de\u011fildir. Bu b\u00f6l\u00fcmde, projenizi PWA standartlar\u0131na uygun hale getirmek i\u00e7in atman\u0131z gereken temel ad\u0131mlar\u0131, kod \u00f6rnekleriyle birlikte detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu s\u00fcre\u00e7, uygulaman\u0131z\u0131n \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak ve ana ekrana y\u00fcklenebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Unutmay\u0131n, bu ad\u0131mlar\u0131 takip ederken, ASP.NET Core projenizin yap\u0131s\u0131n\u0131 ve dosya yollar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z \u00f6nemlidir.<\/p>\n<h3>Temel Kurulum ve Manifest Dosyas\u0131 Ekleme<\/h3>\n<p>Bir PWA&#8217;n\u0131n kimli\u011fini belirleyen en \u00f6nemli bile\u015fenlerden biri Web Manifest dosyas\u0131d\u0131r. Bu dosya, uygulaman\u0131z\u0131n ad\u0131n\u0131, simgesini, ba\u015flang\u0131\u00e7 URL&#8217;sini, tema rengini ve ekran y\u00f6n\u00fcn\u00fc gibi meta verilerini tan\u0131mlar. Taray\u0131c\u0131lar ve i\u015fletim sistemleri, uygulaman\u0131z\u0131 ana ekrana eklerken veya PWA olarak tan\u0131rken bu dosyay\u0131 kullan\u0131r.<\/p>\n<ol>\n<li><strong>Manifest Dosyas\u0131n\u0131 Olu\u015fturun:<\/strong> Projenizin <code>wwwroot<\/code> klas\u00f6r\u00fcne <code>manifest.json<\/code> ad\u0131nda yeni bir dosya ekleyin.<\/li>\n<li><strong>Manifest \u0130\u00e7eri\u011fini Tan\u0131mlay\u0131n:<\/strong> A\u015fa\u011f\u0131daki JSON yap\u0131s\u0131n\u0131 <code>manifest.json<\/code> dosyan\u0131za kopyalay\u0131n ve kendi uygulaman\u0131za g\u00f6re g\u00fcncelleyin.\n<pre><code>\n{\n  \"name\": \"Benim WebForms PWA Uygulamam\",\n  \"short_name\": \"WF PWA\",\n  \"description\": \"ASP.NET Core WebForms tabanl\u0131 bir PWA \u00f6rne\u011fi.\",\n  \"start_url\": \"\/\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#ffffff\",\n  \"theme_color\": \"#007bff\",\n  \"icons\": [\n    {\n      \"src\": \"\/images\/icons\/icon-72x72.png\",\n      \"sizes\": \"72x72\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-96x96.png\",\n      \"sizes\": \"96x96\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-128x128.png\",\n      \"sizes\": \"128x128\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-144x144.png\",\n      \"sizes\": \"144x144\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-152x152.png\",\n      \"sizes\": \"152x152\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-384x384.png\",\n      \"sizes\": \"384x384\",\n      \"type\": \"image\/png\"\n    },\n    {\n      \"src\": \"\/images\/icons\/icon-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image\/png\"\n    }\n  ]\n}\n      <\/pre>\n<p><\/code><\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: Farkl\u0131 boyutlardaki ikonlar\u0131 <code>wwwroot\/images\/icons<\/code> klas\u00f6r\u00fcne eklemeyi unutmay\u0131n. Bu, uygulaman\u0131z\u0131n farkl\u0131 cihazlarda ve ekran yo\u011funluklar\u0131nda iyi g\u00f6r\u00fcnmesini sa\u011flar. \u0130konlar olmadan PWA'n\u0131z ana ekrana eklenmeyebilir.\n      <\/div>\n<\/li>\n<li><strong>Manifest'i HTML'e Ba\u011flay\u0131n:<\/strong> Ana Layout dosyan\u0131z\u0131n (\u00f6rne\u011fin, <code>_Layout.cshtml<\/code> veya <code>Master.cshtml<\/code> e\u011fer WebForms Core 2'de buna benzer bir yap\u0131 kullan\u0131yorsan\u0131z) <code><head><\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin.\n<pre><code>\n<link rel=\"manifest\" href=\"\/manifest.json\">\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n<meta name=\"apple-mobile-web-app-title\" content=\"WF PWA\">\n<link rel=\"apple-touch-icon\" href=\"\/images\/icons\/icon-152x152.png\">\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu meta etiketleri ve <code>apple-touch-icon<\/code>, \u00f6zellikle iOS cihazlarda PWA deneyimini iyile\u015ftirmek i\u00e7in \u00f6nemlidir. <code>apple-mobile-web-app-capable<\/code>, Safari'nin PWA'y\u0131 tam ekran modunda a\u00e7mas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<\/ol>\n<h3>Servis \u00c7al\u0131\u015fan\u0131n\u0131z\u0131 Entegre Etme ve \u00c7evrimd\u0131\u015f\u0131 Deneyim Olu\u015fturma<\/h3>\n<p>Service Worker, uygulaman\u0131z\u0131n \u00e7evrimd\u0131\u015f\u0131 yeteneklerinin ve h\u0131z optimizasyonlar\u0131n\u0131n temelini olu\u015fturur. \u015eimdi, Service Worker'\u0131 projenize nas\u0131l entegre edece\u011finizi ve temel \u00e7evrimd\u0131\u015f\u0131 \u00f6nbellekleme stratejilerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 g\u00f6relim.<\/p>\n<ol>\n<li><strong>Service Worker Dosyas\u0131n\u0131 Olu\u015fturun:<\/strong> <code>wwwroot<\/code> klas\u00f6r\u00fcn\u00fcze <code>service-worker.js<\/code> ad\u0131nda yeni bir dosya ekleyin. Bu dosya, PWA'n\u0131z\u0131n beyinlerinden biri olacakt\u0131r.<\/li>\n<li><strong>Service Worker \u0130\u00e7eri\u011fini Tan\u0131mlay\u0131n:<\/strong> A\u015fa\u011f\u0131daki kodu <code>service-worker.js<\/code> dosyan\u0131za kopyalay\u0131n. Bu kod, temel bir \u00f6nbellekleme stratejisi (cache-first, then network fallback) uygular.\n<pre><code>\nconst CACHE_NAME = 'my-pwa-cache-v1';\nconst urlsToCache = [\n  '\/',\n  '\/index', \/\/ Ana sayfan\u0131z\u0131n URL'si\n  '\/css\/site.css',\n  '\/js\/site.js',\n  '\/images\/icons\/icon-192x192.png' \/\/ Manifest'teki ikonlardan biri\n  \/\/ Uygulaman\u0131z\u0131n di\u011fer kritik statik kaynaklar\u0131n\u0131 buraya ekleyin\n];\n\nself.addEventListener('install', event => {\n  event.waitUntil(\n    caches.open(CACHE_NAME)\n      .then(cache => {\n        console.log('\u00d6nbellek a\u00e7\u0131ld\u0131 ve kaynaklar \u00f6nbelle\u011fe al\u0131nd\u0131.');\n        return cache.addAll(urlsToCache);\n      })\n      .catch(error => {\n        console.error('\u00d6nbelle\u011fe alma hatas\u0131:', error);\n      })\n  );\n});\n\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    caches.keys().then(cacheNames => {\n      return Promise.all(\n        cacheNames.filter(cacheName => {\n          return cacheName.startsWith('my-pwa-cache-') && cacheName !== CACHE_NAME;\n        }).map(cacheName => {\n          console.log(<code>Eski \u00f6nbellek siliniyor: ${cacheName}<\/code>);\n          return caches.delete(cacheName);\n        })\n      );\n    })\n  );\n});\n\nself.addEventListener('fetch', event => {\n  event.respondWith(\n    caches.match(event.request)\n      .then(response => {\n        \/\/ \u00d6nbellekte varsa do\u011frudan \u00f6nbellekten yan\u0131t ver\n        if (response) {\n          return response;\n        }\n        \/\/ \u00d6nbellekte yoksa a\u011f\u0131 dene\n        return fetch(event.request)\n          .then(networkResponse => {\n            \/\/ A\u011fdan al\u0131nan yan\u0131t\u0131 \u00f6nbelle\u011fe al ve d\u00f6nd\u00fcr\n            return caches.open(CACHE_NAME).then(cache => {\n              \/\/ Yaln\u0131zca ba\u015far\u0131l\u0131 GET isteklerini \u00f6nbelle\u011fe al\n              if (networkResponse.ok && event.request.method === 'GET') {\n                cache.put(event.request, networkResponse.clone());\n              }\n              return networkResponse;\n            });\n          })\n          .catch(() => {\n            \/\/ Hem \u00f6nbellekte yoksa hem de a\u011f hatas\u0131 varsa, \u00e7evrimd\u0131\u015f\u0131 sayfay\u0131 g\u00f6ster\n            \/\/ Bu k\u0131s\u0131m iste\u011fe ba\u011fl\u0131d\u0131r, \u00f6zel bir \u00e7evrimd\u0131\u015f\u0131 sayfan\u0131z varsa eklenebilir.\n            \/\/ \u00d6rne\u011fin: return caches.match('\/offline.html');\n            console.log('\u00c7evrimd\u0131\u015f\u0131: A\u011f veya \u00f6nbellekten yan\u0131t al\u0131namad\u0131.');\n          });\n      })\n  );\n});\n      <\/pre>\n<p><\/code><\/p>\n<div class=\"tip\">\n        \u0130pucu: <code>urlsToCache<\/code> dizisine, uygulaman\u0131z\u0131n ilk y\u00fcklendi\u011finde \u00e7evrimd\u0131\u015f\u0131 olarak eri\u015filebilir olmas\u0131n\u0131 istedi\u011finiz t\u00fcm kritik URL'leri ve kaynaklar\u0131 ekledi\u011finizden emin olun. Bu, \u00e7evrimd\u0131\u015f\u0131 deneyimin kalitesini do\u011frudan etkiler.\n      <\/div>\n<\/li>\n<li><strong>Service Worker'\u0131 Kaydedin:<\/strong> Uygulaman\u0131z\u0131n ana JavaScript dosyas\u0131nda (\u00f6rne\u011fin, <code>wwwroot\/js\/site.js<\/code>) veya do\u011frudan ana g\u00f6r\u00fcn\u00fcm\u00fcn\u00fcz\u00fcn <code><body><\/code> etiketinin sonuna yak\u0131n bir <code><script><\/code> blo\u011funda Service Worker'\u0131 kaydedin.\n<pre><code>\nif ('serviceWorker' in navigator) {\n  window.addEventListener('load', () => {\n    navigator.serviceWorker.register('\/service-worker.js')\n      .then(registration => {\n        console.log('Service Worker ba\u015far\u0131yla kaydedildi:', registration);\n      })\n      .catch(error => {\n        console.error('Service Worker kaydedilemedi:', error);\n      });\n  });\n}\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7as\u0131, taray\u0131c\u0131n\u0131n Service Worker deste\u011fini kontrol eder ve varsa, <code>service-worker.js<\/code> dosyas\u0131n\u0131 kaydeder. Kay\u0131t i\u015flemi ba\u015far\u0131l\u0131 oldu\u011funda veya bir hata olu\u015ftu\u011funda konsola bilgi yazd\u0131r\u0131l\u0131r.<\/p>\n<\/li>\n<\/ol>\n<p>Bu ad\u0131mlarla, WebForms Core 2 uygulaman\u0131z art\u0131k bir PWA'n\u0131n temel \u00f6zelliklerine sahip oldu. Uygulaman\u0131z taray\u0131c\u0131 taraf\u0131ndan PWA olarak tan\u0131nacak, ana ekrana eklenebilecek ve temel kaynaklar\u0131 \u00e7evrimd\u0131\u015f\u0131 \u00f6nbelle\u011fe alarak daha h\u0131zl\u0131 ve kesintisiz bir deneyim sunacakt\u0131r. \u00d6zellikle, <code>fetch<\/code> olay dinleyicisinin do\u011fru yap\u0131land\u0131r\u0131lmas\u0131, uygulaman\u0131z\u0131n \u00e7evrimd\u0131\u015f\u0131 durumdaki davran\u0131\u015f\u0131n\u0131 belirleyen en kritik k\u0131s\u0131md\u0131r. Bu yap\u0131land\u0131rma sayesinde, kullan\u0131c\u0131lar\u0131n\u0131z internet ba\u011flant\u0131s\u0131 olmasa bile, uygulaman\u0131z\u0131n temel sayfalar\u0131na ve i\u00e7eri\u011fine eri\u015febilirler. Bu da kullan\u0131c\u0131 memnuniyetini ve uygulaman\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>WebForms Core 2 ile Push Bildirimleri G\u00f6nderme: Hem Sunucu Hem \u0130stemci Taraf\u0131<\/h2>\n<p>PWA'n\u0131z\u0131 Service Worker ile g\u00fc\u00e7lendirdikten sonra, s\u0131rada kullan\u0131c\u0131 etkile\u015fimini en \u00fcst d\u00fczeye \u00e7\u0131karacak Push Bildirimleri entegrasyonu var. Bu b\u00f6l\u00fcm, WebForms Core 2 uygulaman\u0131zda Push Bildirimlerini hem istemci taraf\u0131nda nas\u0131l ayarlayaca\u011f\u0131n\u0131z\u0131 hem de sunucu taraf\u0131nda nas\u0131l g\u00f6nderece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Unutmay\u0131n, Push Bildirimleri g\u00f6nderebilmek i\u00e7in HTTPS kullanman\u0131z zorunludur.<\/p>\n<h3>\u0130stemci Taraf\u0131 Haz\u0131rl\u0131klar\u0131 ve Abone Olma<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n bildirim alabilmesi i\u00e7in \u00f6ncelikle uygulaman\u0131z\u0131n onlardan izin istemesi ve bir abonelik (subscription) olu\u015fturmas\u0131 gerekir. Bu abonelik bilgisi daha sonra sunucu taraf\u0131na g\u00f6nderilerek orada saklan\u0131r.<\/p>\n<ol>\n<li><strong>VAPID Anahtar \u00c7ifti Olu\u015fturma:<\/strong> Push bildirimlerinin g\u00fcvenli bir \u015fekilde g\u00f6nderilebilmesi i\u00e7in VAPID (Voluntary Application Server Identification) anahtar \u00e7iftine ihtiyac\u0131n\u0131z vard\u0131r. Bu anahtarlar, sunucunuzun push servis sa\u011flay\u0131c\u0131s\u0131 taraf\u0131ndan do\u011frulanmas\u0131n\u0131 sa\u011flar. Online ara\u00e7lar (\u00f6rne\u011fin, <a href=\"https:\/\/web-push-codelab.glitch.me\/\" target=\"_blank\">web-push-codelab<\/a>) veya programatik olarak bu anahtarlar\u0131 olu\u015fturabilirsiniz. Bir genel (public) ve bir \u00f6zel (private) anahtar\u0131n\u0131z olacak.\n<div class=\"tip\">\n        Uzman \u0130pucu: VAPID anahtarlar\u0131n\u0131z\u0131 g\u00fcvenli bir \u015fekilde saklay\u0131n ve \u00f6zel anahtar\u0131n\u0131z\u0131 asla herkese a\u00e7\u0131k hale getirmeyin.\n      <\/div>\n<\/li>\n<li><strong>Bildirim \u0130zni \u0130steme ve Abone Olma Kodu:<\/strong> <code>wwwroot\/js\/site.js<\/code> dosyan\u0131za veya bildirimin etkinle\u015ftirilece\u011fi bir sayfadaki script blo\u011funa a\u015fa\u011f\u0131daki JavaScript kodunu ekleyin. <code>YOUR_VAPID_PUBLIC_KEY<\/code> k\u0131sm\u0131n\u0131 kendi genel anahtar\u0131n\u0131zla de\u011fi\u015ftirin.\n<pre><code>\nconst VAPID_PUBLIC_KEY = \"BURAYA_KEND\u0130_VAPID_GENEL_ANAHTARINIZI_YAZIN\"; \/\/ Base64url format\u0131nda\n\nfunction urlBase64ToUint8Array(base64String) {\n  const padding = '='.repeat((4 - base64String.length % 4) % 4);\n  const base64 = (base64String + padding)\n    .replace(\/\\-\/g, '+')\n    .replace(\/_\/g, '\/');\n\n  const rawData = window.atob(base64);\n  const outputArray = new Uint8Array(rawData.length);\n\n  for (let i = 0; i < rawData.length; ++i) {\n    outputArray[i] = rawData.charCodeAt(i);\n  }\n  return outputArray;\n}\n\nasync function subscribeUserToPush() {\n  if (!('serviceWorker' in navigator)) {\n    console.warn('Taray\u0131c\u0131n\u0131z Service Worker\\'\u0131 desteklemiyor.');\n    return;\n  }\n  if (!('PushManager' in window)) {\n    console.warn('Taray\u0131c\u0131n\u0131z Push Bildirimlerini desteklemiyor.');\n    return;\n  }\n\n  try {\n    const registration = await navigator.serviceWorker.ready;\n    const subscription = await registration.pushManager.subscribe({\n      userVisibleOnly: true,\n      applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)\n    });\n\n    console.log('Kullan\u0131c\u0131 push bildirimlerine abone oldu:', subscription);\n    \/\/ Abonelik nesnesini sunucuya g\u00f6nder\n    await fetch('\/api\/PushNotification\/subscribe', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json'\n      },\n      body: JSON.stringify(subscription)\n    });\n    console.log('Abonelik sunucuya g\u00f6nderildi.');\n\n  } catch (error) {\n    if (Notification.permission === 'denied') {\n      console.warn('Push bildirimi izni reddedildi.');\n    } else {\n      console.error('Push bildirimlerine abone olma ba\u015far\u0131s\u0131z:', error);\n    }\n  }\n}\n\n\/\/ Bir d\u00fc\u011fme t\u0131klamas\u0131yla veya sayfa y\u00fcklemesinden sonra izin istemek i\u00e7in\n\/\/ \u00d6rne\u011fin: document.getElementById('subscribeButton').addEventListener('click', subscribeUserToPush);\n\/\/ Veya direkt olarak sayfa y\u00fcklendi\u011finde:\nwindow.addEventListener('load', () => {\n    if ('serviceWorker' in navigator && 'PushManager' in window) {\n        Notification.requestPermission().then(permission => {\n            if (permission === 'granted') {\n                subscribeUserToPush();\n            } else {\n                console.log('Push bildirim izni verilmedi.');\n            }\n        });\n    }\n});\n\n\/\/ Service Worker'da bildirim olay\u0131n\u0131 dinleme\nself.addEventListener('push', event => {\n  const data = event.data ? event.data.json() : { title: 'Yeni Bildirim', body: 'Bir \u015feyler oldu!' };\n\n  const options = {\n    body: data.body,\n    icon: data.icon || '\/images\/icons\/icon-192x192.png', \/\/ Bildirim ikonu\n    badge: data.badge || '\/images\/icons\/badge-72x72.png', \/\/ Android i\u00e7in k\u00fc\u00e7\u00fck ikon\n    vibrate: [200, 100, 200], \/\/ Titre\u015fim efekti\n    data: {\n      url: data.url || '\/' \/\/ T\u0131kland\u0131\u011f\u0131nda a\u00e7\u0131lacak URL\n    },\n    actions: data.actions || [] \/\/ Bildirimdeki d\u00fc\u011fmeler\n  };\n\n  event.waitUntil(\n    self.registration.showNotification(data.title, options)\n  );\n});\n\n\/\/ Bildirime t\u0131kland\u0131\u011f\u0131nda ne olaca\u011f\u0131n\u0131 belirleme\nself.addEventListener('notificationclick', event => {\n  event.notification.close(); \/\/ Bildirimi kapat\n\n  event.waitUntil(\n    clients.openWindow(event.notification.data.url || '\/') \/\/ Bildirime t\u0131kland\u0131\u011f\u0131nda belirtilen URL'yi a\u00e7\n  );\n});\n      <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod, Service Worker haz\u0131r oldu\u011funda kullan\u0131c\u0131dan bildirim izni ister ve izin verildi\u011finde abonelik nesnesini olu\u015fturur. Daha sonra bu abonelik nesnesini sunucu taraf\u0131ndaki bir API endpoint'ine POST iste\u011fi ile g\u00f6nderir. Service Worker i\u00e7indeki <code>push<\/code> ve <code>notificationclick<\/code> event dinleyicileri ise, sunucudan gelen bildirimleri g\u00f6sterir ve kullan\u0131c\u0131 bildirime t\u0131klad\u0131\u011f\u0131nda ilgili aksiyonu al\u0131r.<\/p>\n<\/li>\n<\/ol>\n<h3>Sunucu Taraf\u0131nda Bildirimleri Y\u00f6netme ve G\u00f6nderme<\/h3>\n<p>WebForms Core 2 taraf\u0131nda, istemciden gelen abonelik nesnesini saklaman\u0131z ve gerekti\u011finde bu abonelikleri kullanarak bildirim g\u00f6ndermeniz gerekecektir. Bu i\u015flem i\u00e7in <code>WebPush<\/code> k\u00fct\u00fcphanesini kullanabiliriz.<\/p>\n<ol>\n<li><strong>Gerekli NuGet Paketlerini Y\u00fckleyin:<\/strong> Projenize <code>WebPush.NET<\/code> paketini ekleyin.\n<pre><code class=\"language-csharp\">\ndotnet add package WebPush.NET\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li><strong>Abonelikleri Saklayacak Bir Veri Yap\u0131s\u0131 Olu\u015fturun:<\/strong> Kullan\u0131c\u0131 aboneliklerini bir veritaban\u0131nda saklaman\u0131z en iyisidir. Basit bir \u00f6rnek i\u00e7in, ge\u00e7ici olarak bellek i\u00e7i bir liste kullanabiliriz.\n<pre><code class=\"language-csharp\">\n\/\/ Modeller klas\u00f6r\u00fcn\u00fczde veya uygun bir yerde\npublic class PushSubscription\n{\n    public string Endpoint { get; set; }\n    public string P256DH { get; set; } \/\/ PublicKey\n    public string Auth { get; set; } \/\/ AuthSecret\n}\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li><strong>ASP.NET Core Controller (API Endpoint) Olu\u015fturun:<\/strong> Gelen abonelikleri i\u015flemek ve bildirim g\u00f6ndermek i\u00e7in bir API Controller olu\u015fturun. WebForms Core 2'de, <code>PageModel<\/code> kullanarak da benzer bir yap\u0131 kurabilirsiniz.\n<pre><code class=\"language-csharp\">\nusing Microsoft.AspNetCore.Mvc;\nusing WebPush; \/\/ WebPush.NET k\u00fct\u00fcphanesi\nusing System.Text.Json; \/\/ Abonelikleri saklamak i\u00e7in\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace WebFormsCore2Pwa.Controllers\n{\n    [ApiController]\n    [Route(\"api\/[controller]\")]\n    public class PushNotificationController : ControllerBase\n    {\n        \/\/ Ge\u00e7ici olarak bellek i\u00e7i depolama. Ger\u00e7ek uygulamada veritaban\u0131 kullan\u0131n.\n        private static List<PushSubscription> _subscriptions = new List<PushSubscription>();\n\n        \/\/ Kendi VAPID anahtarlar\u0131n\u0131z\u0131 buraya ekleyin\n        private const string VapidPublicKey = \"BURAYA_KEND\u0130_VAPID_GENEL_ANAHTARINIZI_YAZIN\";\n        private const string VapidPrivateKey = \"BURAYA_KEND\u0130_VAPID_\u00d6ZEL_ANAHTARINIZI_YAZIN\";\n        private const string VapidSubject = \"mailto:sizin-eposta@example.com\"; \/\/ \u0130leti\u015fim e-posta adresiniz\n\n        [HttpPost(\"subscribe\")]\n        public IActionResult Subscribe([FromBody] PushSubscription subscription)\n        {\n            if (subscription == null || string.IsNullOrEmpty(subscription.Endpoint))\n            {\n                return BadRequest(\"Abonelik bilgileri eksik.\");\n            }\n\n            \/\/ Mevcut aboneli\u011fi kontrol et (iste\u011fe ba\u011fl\u0131, m\u00fckerrer kayd\u0131 \u00f6nlemek i\u00e7in)\n            if (!_subscriptions.Any(s => s.Endpoint == subscription.Endpoint))\n            {\n                _subscriptions.Add(subscription);\n                Console.WriteLine($\"Yeni push aboneli\u011fi eklendi: {subscription.Endpoint}\");\n            }\n            else\n            {\n                Console.WriteLine($\"Abonelik zaten mevcut: {subscription.Endpoint}\");\n            }\n            \n            return Ok();\n        }\n\n        [HttpPost(\"send\")]\n        public async Task<IActionResult> SendPushNotification([FromBody] string message)\n        {\n            if (string.IsNullOrEmpty(message))\n            {\n                return BadRequest(\"Bildirim mesaj\u0131 bo\u015f olamaz.\");\n            }\n\n            var webPushClient = new WebPushClient();\n            var vapidDetails = new VapidDetails(VapidSubject, VapidPublicKey, VapidPrivateKey);\n\n            foreach (var subscription in _subscriptions.ToList()) \/\/ ToList() ile d\u00f6ng\u00fc s\u0131ras\u0131nda de\u011fi\u015fikliklerden ka\u00e7\u0131n\n            {\n                try\n                {\n                    var pushSubscription = new WebPush.PushSubscription(subscription.Endpoint, subscription.P256DH, subscription.Auth);\n                    var payload = JsonSerializer.Serialize(new {\n                        title = \"WebForms Core 2 Bildirimi!\",\n                        body = message,\n                        icon = \"\/images\/icons\/icon-192x192.png\",\n                        url = \"\/\" \/\/ Bildirime t\u0131kland\u0131\u011f\u0131nda gidilecek URL\n                    });\n\n                    await webPushClient.SendNotificationAsync(pushSubscription, payload, vapidDetails);\n                    Console.WriteLine($\"Bildirim g\u00f6nderildi: {subscription.Endpoint}\");\n                }\n                catch (WebPushException ex)\n                {\n                    Console.Error.WriteLine($\"Bildirim g\u00f6nderilirken hata olu\u015ftu: {ex.Message}\");\n                    if (ex.StatusCode == System.Net.HttpStatusCode.Gone || ex.StatusCode == System.Net.HttpStatusCode.NotFound)\n                    {\n                        \/\/ Ge\u00e7ersiz veya s\u00fcresi dolmu\u015f aboneli\u011fi listeden kald\u0131r\n                        _subscriptions.Remove(subscription);\n                        Console.WriteLine($\"Ge\u00e7ersiz abonelik kald\u0131r\u0131ld\u0131: {subscription.Endpoint}\");\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Console.Error.WriteLine($\"Genel hata: {ex.Message}\");\n                }\n            }\n\n            return Ok($\"Bildirimler { _subscriptions.Count } aboneye g\u00f6nderilmeye \u00e7al\u0131\u015f\u0131ld\u0131.\");\n        }\n    }\n}\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu Controller, <code>\/api\/PushNotification\/subscribe<\/code> adresine gelen POST istekleriyle istemciden gelen abonelik bilgilerini al\u0131r ve <code>_subscriptions<\/code> listesine ekler. <code>\/api\/PushNotification\/send<\/code> adresine bir POST iste\u011fi (\u00f6rne\u011fin, bir y\u00f6netim panelinden tetiklenecek bir i\u015flemle) g\u00f6nderildi\u011finde, kay\u0131tl\u0131 t\u00fcm aboneliklere Push Bildirimi g\u00f6nderir. <code>WebPushClient<\/code>, bildirimleri \u015fifreler ve ilgili push servis sa\u011flay\u0131c\u0131s\u0131na iletir.<\/p>\n<\/li>\n<li><strong>Program.cs veya Startup.cs dosyas\u0131nda API Controller'\u0131 etkinle\u015ftirin:<\/strong>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs dosyas\u0131nda (ASP.NET Core 6.0 ve sonras\u0131 i\u00e7in)\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ Add services to the container.\nbuilder.Services.AddRazorPages(); \/\/ WebForms Core 2 Razor Pages tabanl\u0131 oldu\u011fundan bu gereklidir\nbuilder.Services.AddControllers(); \/\/ API Controller'lar i\u00e7in\n\nvar app = builder.Build();\n\n\/\/ Configure the HTTP request pipeline.\nif (!app.Environment.IsDevelopment())\n{\n    app.UseExceptionHandler(\"\/Error\");\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.UseAuthorization();\n\napp.MapRazorPages(); \/\/ WebForms Core 2 Razor Pages\napp.MapControllers(); \/\/ API Controller'lar i\u00e7in\n\napp.Run();\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu konfig\u00fcrasyon, ASP.NET Core uygulaman\u0131z\u0131n hem Razor Pages (WebForms Core 2) hem de API Controller'lar\u0131n\u0131 tan\u0131mas\u0131n\u0131 ve y\u00f6nlendirmesini sa\u011flar.<\/p>\n<\/li>\n<\/ol>\n<p>Art\u0131k WebForms Core 2 uygulaman\u0131zda hem PWA yetenekleri hem de Push Bildirimleri entegrasyonu tamamlanm\u0131\u015f durumda. Kullan\u0131c\u0131lar uygulaman\u0131z\u0131 ana ekrana ekleyebilir, \u00e7evrimd\u0131\u015f\u0131 kullanabilir ve siz de onlara \u00f6nemli bildirimler g\u00f6nderebilirsiniz. Bu, uygulaman\u0131z\u0131n eri\u015filebilirli\u011fini, kullan\u0131c\u0131 ba\u011fl\u0131l\u0131\u011f\u0131n\u0131 ve genel kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. \u00d6zellikle <code>WebPush.NET<\/code> k\u00fct\u00fcphanesinin kullan\u0131m\u0131, sunucu taraf\u0131ndaki bildirim g\u00f6nderme s\u00fcrecini olduk\u00e7a basitle\u015ftirir, b\u00f6ylece geli\u015ftiriciler \u00e7ekirdek i\u015f mant\u0131\u011f\u0131na daha fazla odaklanabilirler.<\/p>\n<h2>Geli\u015fmi\u015f Optimizasyonlar ve En \u0130yi Uygulamalar Nelerdir?<\/h2>\n<p>WebForms Core 2 uygulaman\u0131z\u0131 bir PWA'ya d\u00f6n\u00fc\u015ft\u00fcrmek ve Push Bildirimleri eklemek harika bir ba\u015flang\u0131\u00e7t\u0131r, ancak en iyi performans\u0131 ve kullan\u0131c\u0131 deneyimini sa\u011flamak i\u00e7in daha fazla optimizasyon ve en iyi uygulama mevcut. Bu b\u00f6l\u00fcmde, uygulaman\u0131z\u0131n potansiyelini tam olarak ortaya \u00e7\u0131karmak i\u00e7in dikkate alman\u0131z gereken baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve teknikler ele al\u0131nacakt\u0131r.<\/p>\n<h3>Performans Optimizasyonu ve Lighthouse Kullan\u0131m\u0131<\/h3>\n<p>PWA'lar\u0131n temel \u00f6zelliklerinden biri h\u0131zd\u0131r. Uygulaman\u0131z\u0131n ne kadar h\u0131zl\u0131 y\u00fcklendi\u011fi ve ne kadar ak\u0131c\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131, kullan\u0131c\u0131lar\u0131n uygulaman\u0131z\u0131 benimsemesinde kritik rol oynar. Google'\u0131n Lighthouse arac\u0131, PWA'n\u0131z\u0131n performans\u0131n\u0131, eri\u015filebilirli\u011fini, en iyi uygulamalar\u0131 ve SEO'sunu analiz etmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Lighthouse raporundaki puanlar\u0131 y\u00fckseltmek i\u00e7in \u015funlara odaklanabilirsiniz:<\/p>\n<ul>\n<li><strong>Kritik CSS'i Inline Etme:<\/strong> Sayfan\u0131n \u00fcst k\u0131sm\u0131nda g\u00f6r\u00fcnen i\u00e7eri\u011fin stilini (Above-the-fold CSS) HTML i\u00e7ine almak, taray\u0131c\u0131n\u0131n render i\u015flemini daha h\u0131zl\u0131 ba\u015flatmas\u0131n\u0131 sa\u011flar. Geri kalan CSS'i asenkron olarak y\u00fckleyebilirsiniz.<\/li>\n<li><strong>G\u00f6rsel Optimizasyonu:<\/strong> Resimleri WebP gibi modern formatlarda sunun ve duyarl\u0131 resimler i\u00e7in <code>srcset<\/code> \u00f6zniteli\u011fini kullan\u0131n. B\u00fcy\u00fck g\u00f6rselleri tembel y\u00fckleme (lazy loading) ile y\u00fckleyin.<\/li>\n<li><strong>JavaScript Optimizasyonu:<\/strong> Kullan\u0131lmayan JavaScript kodunu kald\u0131r\u0131n, kod par\u00e7alar\u0131n\u0131 b\u00f6l\u00fcn (code splitting) ve JavaScript dosyalar\u0131n\u0131 s\u0131k\u0131\u015ft\u0131r\u0131n. Uzun s\u00fcren ana i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00f6revlerinden ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>HTTP\/2 Kullan\u0131m\u0131:<\/strong> HTTP\/2, ayn\u0131 ba\u011flant\u0131 \u00fczerinden birden fazla iste\u011fi e\u015fzamanl\u0131 olarak g\u00f6nderme yetene\u011fi sayesinde performans\u0131 art\u0131r\u0131r. WebForms Core 2 uygulamalar\u0131n\u0131z\u0131n bar\u0131nd\u0131r\u0131ld\u0131\u011f\u0131 sunucunun HTTP\/2'yi destekledi\u011finden emin olun.<\/li>\n<\/ul>\n<div class=\"tip\">\n    Uzman \u0130pucu: Lighthouse raporunuzdaki \"Time to Interactive\" ve \"First Contentful Paint\" metriklerine \u00f6zellikle dikkat edin. Bu metrikler, kullan\u0131c\u0131lar\u0131n uygulaman\u0131zla ne kadar h\u0131zl\u0131 etkile\u015fime ge\u00e7ebildi\u011fini g\u00f6sterir.\n  <\/div>\n<h3>Servis \u00c7al\u0131\u015fan\u0131 \u00d6nbellekleme Stratejileri ve G\u00fcncelleme Mekanizmalar\u0131<\/h3>\n<p>Service Worker ile kulland\u0131\u011f\u0131n\u0131z \u00f6nbellekleme stratejisi, uygulaman\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131 ve g\u00fcncelli\u011fi i\u00e7in hayati \u00f6neme sahiptir. Temel \"cache-first, then network\" stratejisinin \u00f6tesine ge\u00e7erek daha karma\u015f\u0131k senaryolar\u0131 y\u00f6netebilirsiniz:<\/p>\n<ul>\n<li><strong>Cache with Network Fallback:<\/strong> \u00d6nce \u00f6nbelle\u011fi kontrol et, yoksa a\u011fa git. A\u011fdan gelen yan\u0131t\u0131 \u00f6nbelle\u011fe al. Bu, genellikle statik varl\u0131klar i\u00e7in iyidir.<\/li>\n<li><strong>Network with Cache Fallback:<\/strong> \u00d6nce a\u011f\u0131 dene, a\u011f ba\u015far\u0131s\u0131z olursa \u00f6nbellekten yan\u0131t ver. Dinamik i\u00e7erikler i\u00e7in uygun olabilir.<\/li>\n<li><strong>Stale-While-Revalidate:<\/strong> \u00d6nbellekten hemen yan\u0131t ver, arka planda a\u011fdan yeni veriyi al ve bir sonraki istek i\u00e7in \u00f6nbelle\u011fi g\u00fcncelle. Bu, hem h\u0131z\u0131 hem de g\u00fcncelli\u011fi dengeleyen iyi bir stratejidir.<\/li>\n<li><strong>Service Worker G\u00fcncelleme Mekanizmalar\u0131:<\/strong> Service Worker'\u0131n\u0131zda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda, taray\u0131c\u0131n\u0131n yeni s\u00fcr\u00fcm\u00fc almas\u0131n\u0131 ve aktive etmesini sa\u011flamal\u0131s\u0131n\u0131z. <code>self.skipWaiting()<\/code> ve <code>clients.claim()<\/code> gibi y\u00f6ntemler, yeni Service Worker'\u0131n hemen kontrol\u00fc ele almas\u0131n\u0131 sa\u011flayabilir. Kullan\u0131c\u0131lara yeni bir s\u00fcr\u00fcm\u00fcn mevcut oldu\u011funa dair bir bildirim g\u00f6sterip sayfay\u0131 yenilemelerini \u00f6nerebilirsiniz.<\/li>\n<\/ul>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Her \u015feyin her zaman yolunda gitmeyece\u011fini varsayarak hata y\u00f6netimi stratejileri geli\u015ftirmek, PWA'n\u0131z\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<ul>\n<li><strong>\u00c7evrimd\u0131\u015f\u0131 Sayfas\u0131:<\/strong> Kullan\u0131c\u0131 tamamen \u00e7evrimd\u0131\u015f\u0131 oldu\u011funda ve Service Worker'\u0131n \u00f6nbelle\u011finde istenen sayfa yoksa, kullan\u0131c\u0131ya dost\u00e7a bir \"\u00e7evrimd\u0131\u015f\u0131\" mesaj\u0131 veya sayfas\u0131 g\u00f6sterin. Bu, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/li>\n<li><strong>Push Bildirimi Hata \u0130\u015fleme:<\/strong> Sunucu taraf\u0131nda Push Bildirimi g\u00f6nderirken olu\u015fan hatalar\u0131 (\u00f6rne\u011fin, s\u00fcresi dolmu\u015f veya ge\u00e7ersiz abonelikler) d\u00fczg\u00fcn bir \u015fekilde y\u00f6netin. Bu t\u00fcr abonelikleri veritaban\u0131n\u0131zdan kald\u0131rmak, gereksiz i\u015flem y\u00fck\u00fcn\u00fc azalt\u0131r.<\/li>\n<\/ul>\n<h3>G\u00fcvenlik ve \u0130zin Y\u00f6netimi<\/h3>\n<p>PWA'lar ve Push Bildirimleri g\u00fc\u00e7l\u00fc yeteneklere sahip oldu\u011fundan, g\u00fcvenlik ve izin y\u00f6netimi hayati \u00f6neme sahiptir.<\/p>\n<ul>\n<li><strong>HTTPS Kullan\u0131m\u0131:<\/strong> T\u00fcm PWA'lar HTTPS \u00fczerinden sunulmal\u0131d\u0131r. Bu, Service Worker'\u0131n ve Push Bildirimlerinin d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131 i\u00e7in zorunludur ve kullan\u0131c\u0131 verilerinin g\u00fcvenli\u011fini sa\u011flar.<\/li>\n<li><strong>Minimum \u0130zin \u0130ste\u011fi:<\/strong> Kullan\u0131c\u0131lardan yaln\u0131zca ger\u00e7ekten ihtiyac\u0131n\u0131z olan izinleri isteyin (\u00f6rne\u011fin, bildirimler). \u0130zin istemlerini net ve anla\u015f\u0131l\u0131r bir \u015fekilde a\u00e7\u0131klay\u0131n.<\/li>\n<\/ul>\n<h3>Duyarl\u0131 Tasar\u0131m ve Mobil Uyumluluk<\/h3>\n<p>PWA'lar farkl\u0131 cihazlarda \u00e7al\u0131\u015facak \u015fekilde tasarland\u0131\u011f\u0131ndan, duyarl\u0131 tasar\u0131m ilkelerine uymak \u00e7ok \u00f6nemlidir. WebForms Core 2 uygulamalar\u0131n\u0131z\u0131n farkl\u0131 ekran boyutlar\u0131nda iyi g\u00f6r\u00fcnmesini sa\u011flamak i\u00e7in CSS media query'leri kullan\u0131n.<\/p>\n<pre><code class=\"language-css\">\n\/* Genel stiller *\/\nbody {\n  font-family: Arial, sans-serif;\n  margin: 0;\n  padding: 0;\n  background-color: #f4f4f4;\n}\n\n.container {\n  width: 90%;\n  margin: 0 auto;\n  padding: 20px;\n}\n\n\/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in stiller (mobil \u00f6ncelikli) *\/\n@media (max-width: 768px) {\n  .container {\n    width: 95%;\n    padding: 10px;\n  }\n\n  h2 {\n    font-size: 1.5em;\n  }\n\n  p {\n    font-size: 0.9em;\n  }\n}\n\n\/* Orta ekranlar i\u00e7in stiller *\/\n@media (min-width: 769px) and (max-width: 1024px) {\n  .container {\n    width: 80%;\n  }\n}\n\n\/* B\u00fcy\u00fck ekranlar i\u00e7in stiller *\/\n@media (min-width: 1025px) {\n  .container {\n    width: 70%;\n  }\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu CSS medya sorgular\u0131, farkl\u0131 ekran boyutlar\u0131na g\u00f6re uygulaman\u0131z\u0131n d\u00fczenini ve yaz\u0131 tiplerini otomatik olarak ayarlar, b\u00f6ylece t\u00fcm cihazlarda en iyi kullan\u0131c\u0131 deneyimini sunar. WebForms Core 2 ve modern web teknolojilerini birle\u015ftirerek, gelece\u011fe haz\u0131r, y\u00fcksek performansl\u0131 ve kullan\u0131c\u0131 dostu uygulamalar geli\u015ftirebilirsiniz.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fin Web Uygulamalar\u0131na Haz\u0131r M\u0131s\u0131n\u0131z?<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, WebForms Core 2 tabanl\u0131 uygulamalar\u0131n\u0131z\u0131 Progressive Web App (PWA) standartlar\u0131na nas\u0131l y\u00fckseltece\u011finizi, Service Worker'\u0131n \u00e7evrimd\u0131\u015f\u0131 yeteneklerini nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceledik. Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak, uygulaman\u0131za y\u00fcklenebilirlik, h\u0131z, g\u00fcvenilirlik ve uygulama benzeri deneyimler kazand\u0131rman\u0131n art\u0131k karma\u015f\u0131k bir s\u00fcre\u00e7 olmad\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. \u00d6zellikle WebForms Core 2'nin sa\u011flad\u0131\u011f\u0131 geli\u015ftirme kolayl\u0131\u011f\u0131 ile modern web'in bu g\u00fc\u00e7l\u00fc \u00f6zelliklerini birle\u015ftirmek, geli\u015ftiricilere mevcut bilgi birikimleriyle yenilik\u00e7i \u00e7\u00f6z\u00fcmler \u00fcretme f\u0131rsat\u0131 sunmaktad\u0131r.<\/p>\n<p>PWA'lar, kullan\u0131c\u0131lar\u0131n internet ba\u011flant\u0131s\u0131 olmasa bile i\u00e7eri\u011fe eri\u015febilmesini sa\u011flarken, manifest dosyas\u0131 sayesinde ana ekrana kolayca eklenebilir. Service Worker, bu \u00e7evrimd\u0131\u015f\u0131 yeteneklerin ve a\u011f kontrol\u00fcn\u00fcn temelini olu\u015fturur. Push Bildirimleri ise, kullan\u0131c\u0131lar\u0131 aktif olarak uygulaman\u0131za geri \u00e7ekerek onlar\u0131n ba\u011fl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve \u00f6nemli bilgileri an\u0131nda ula\u015ft\u0131r\u0131r. T\u00fcm bu bile\u015fenler bir araya geldi\u011finde, WebForms Core 2 uygulaman\u0131z sadece bir web sitesi olmaktan \u00e7\u0131k\u0131p, kullan\u0131c\u0131lar\u0131n g\u00fcnl\u00fck ya\u015famlar\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline gelir. Performans optimizasyonlar\u0131, do\u011fru \u00f6nbellekleme stratejileri ve duyarl\u0131 tasar\u0131m gibi en iyi uygulamalarla birle\u015fti\u011finde, gelece\u011fin web uygulamalar\u0131n\u0131 bug\u00fcnden in\u015fa etmeye haz\u0131rs\u0131n\u0131z demektir.<\/p>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm, sadece teknik bir y\u00fckseltme de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n\u0131za daha iyi bir deneyim sunma ve dijital d\u00fcnyadaki varl\u0131\u011f\u0131n\u0131z\u0131 g\u00fc\u00e7lendirme f\u0131rsat\u0131d\u0131r. WebForms Core 2 ile PWA, Service Worker ve Push Bildirimleri entegrasyonu, uygulaman\u0131z\u0131n rekabet avantaj\u0131n\u0131 art\u0131racak ve kullan\u0131c\u0131lar\u0131n beklentilerini kar\u015f\u0131layarak onlar\u0131 memnun edecektir. Gelece\u011fin web d\u00fcnyas\u0131nda yerinizi almak i\u00e7in bu \"b\u00fcy\u00fck bomba\" teknolojilerini kullanmaya ba\u015flay\u0131n ve uygulaman\u0131z\u0131n potansiyelini ke\u015ffedin!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>PWA'lar t\u00fcm taray\u0131c\u0131larda ve platformlarda ayn\u0131 \u015fekilde mi \u00e7al\u0131\u015f\u0131r?<\/dt>\n<dd>PWA'lar, web standartlar\u0131na dayand\u0131\u011f\u0131 i\u00e7in \u00e7o\u011fu modern taray\u0131c\u0131da (Chrome, Firefox, Edge, Safari) desteklenir. Ancak, her taray\u0131c\u0131n\u0131n veya platformun (\u00f6zellikle iOS) PWA \u00f6zelliklerini uygulama bi\u00e7iminde k\u00fc\u00e7\u00fck farkl\u0131l\u0131klar olabilir. \u00d6rne\u011fin, iOS'ta ana ekrana ekleme deneyimi veya Push Bildirimlerinin baz\u0131 detaylar\u0131 Android'den farkl\u0131l\u0131k g\u00f6sterebilir. Genel olarak, \u00e7ekirdek PWA \u00f6zellikleri geni\u015f bir uyumlulu\u011fa sahiptir.<\/dd>\n<dt>Service Worker kullanmak performans\u0131 nas\u0131l etkiler?<\/dt>\n<dd>Service Worker, uygulaman\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Kritik kaynaklar\u0131 \u00f6nbelle\u011fe alarak, sonraki ziyaretlerde uygulaman\u0131z\u0131n \u00e7ok daha h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar. Ayr\u0131ca, \u00e7evrimd\u0131\u015f\u0131 yetenekler sayesinde a\u011f gecikmelerinden veya ba\u011flant\u0131 kesintilerinden etkilenmeden \u00e7al\u0131\u015fabilir. Ancak, Service Worker'\u0131n yanl\u0131\u015f yap\u0131land\u0131r\u0131lmas\u0131 (\u00f6rne\u011fin, gereksiz yere b\u00fcy\u00fck dosyalar\u0131 \u00f6nbelle\u011fe almak veya hatal\u0131 \u00f6nbellekleme stratejileri), potansiyel olarak performans\u0131 olumsuz etkileyebilir. Do\u011fru \u00f6nbellekleme stratejileri ile kullan\u0131ld\u0131\u011f\u0131nda, genellikle bir performans art\u0131\u015f\u0131 g\u00f6zlemlenir.<\/dd>\n<dt>WebForms Core 2'de Push Bildirimleri g\u00f6ndermek i\u00e7in ek bir \u00fccret \u00f6demem gerekir mi?<\/dt>\n<dd>Push Bildirimlerinin g\u00f6nderilmesi i\u00e7in kullan\u0131lan push servis sa\u011flay\u0131c\u0131lar\u0131 (Google FCM, Mozilla MPS vb.) genellikle \u00fccretsizdir veya \u00e7ok y\u00fcksek kullan\u0131m limitlerine kadar \u00fccretsiz katmanlar sunar. Ancak, e\u011fer \u00e7ok b\u00fcy\u00fck \u00f6l\u00e7ekli ve milyonlarca kullan\u0131c\u0131ya bildirim g\u00f6ndermeniz gerekiyorsa, bu servis sa\u011flay\u0131c\u0131lar\u0131n \u00fccretli planlar\u0131na ge\u00e7i\u015f yapman\u0131z gerekebilir. WebPush.NET k\u00fct\u00fcphanesi ise tamamen \u00fccretsiz ve a\u00e7\u0131k kaynakl\u0131d\u0131r. Temel kullan\u0131m senaryolar\u0131nda ek bir \u00fccret \u00f6demeniz gerekmez.<\/dd>\n<dt>Mevcut bir ASP.NET Core WebForms projesini PWA'ya d\u00f6n\u00fc\u015ft\u00fcrmek ne kadar s\u00fcrer?<\/dt>\n<dd>D\u00f6n\u00fc\u015ft\u00fcrme s\u00fcresi, projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ve karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Temel bir PWA (manifest dosyas\u0131 ve basit bir Service Worker ile \u00e7evrimd\u0131\u015f\u0131 \u00f6nbellekleme) entegrasyonu genellikle birka\u00e7 saat veya bir g\u00fcn i\u00e7inde tamamlanabilir. Push Bildirimleri gibi daha geli\u015fmi\u015f \u00f6zellikler ve kapsaml\u0131 \u00f6nbellekleme stratejileri, biraz daha zaman alabilir. Ancak, ad\u0131m ad\u0131m yakla\u015f\u0131ld\u0131\u011f\u0131nda ve bu rehberdeki y\u00f6nergeler takip edildi\u011finde, s\u00fcre\u00e7 y\u00f6netilebilir ve olduk\u00e7a h\u0131zl\u0131d\u0131r. En b\u00fcy\u00fck zaman harcamas\u0131 genellikle uygulaman\u0131n test edilmesi ve optimize edilmesi a\u015famas\u0131nda olur.<\/dd>\n<dt>PWA'lar SEO a\u00e7\u0131s\u0131ndan geleneksel web sitelerinden daha m\u0131 iyidir?<\/dt>\n<dd>Evet, PWA'lar genellikle SEO a\u00e7\u0131s\u0131ndan geleneksel web sitelerine g\u00f6re avantajl\u0131d\u0131r. Google, PWA'lar\u0131n sundu\u011fu h\u0131z, mobil uyumluluk ve kullan\u0131c\u0131 deneyimi gibi fakt\u00f6rleri arama s\u0131ralamalar\u0131nda \u00f6nemli metrikler olarak de\u011ferlendirir. Daha h\u0131zl\u0131 y\u00fcklenen sayfalar, daha d\u00fc\u015f\u00fck hemen \u00e7\u0131kma oranlar\u0131 ve artan kullan\u0131c\u0131 etkile\u015fimi, arama motorlar\u0131 i\u00e7in olumlu sinyallerdir. Ayr\u0131ca, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 \u00f6nbellekleme, k\u00f6t\u00fc ba\u011flant\u0131 ko\u015fullar\u0131nda bile i\u00e7eri\u011fin eri\u015filebilir olmas\u0131n\u0131 sa\u011flayarak kullan\u0131c\u0131 deneyimini art\u0131r\u0131r ve dolayl\u0131 olarak SEO'ya katk\u0131da bulunur. HTTPS kullan\u0131m\u0131 da bir s\u0131ralama fakt\u00f6r\u00fcd\u00fcr ve PWA'lar i\u00e7in zorunludur.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive&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-34686","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>WebForms Core 2&#039;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme<\/title>\n<meta name=\"description\" content=\"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web&#039;in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.\" \/>\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\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebForms Core 2&#039;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme\" \/>\n<meta property=\"og:description\" content=\"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web&#039;in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-20T18:01:15+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=\"31 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"WebForms Core 2&#8217;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme\",\"datePublished\":\"2025-11-20T18:01:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\"},\"wordCount\":4843,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\",\"name\":\"WebForms Core 2'de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-20T18:01:15+00:00\",\"description\":\"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web'in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebForms Core 2&#8217;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme\"}]},{\"@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":"WebForms Core 2'de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme","description":"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web'in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.","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\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/","og_locale":"tr_TR","og_type":"article","og_title":"WebForms Core 2'de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme","og_description":"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web'in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-20T18:01:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"31 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"WebForms Core 2&#8217;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme","datePublished":"2025-11-20T18:01:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/"},"wordCount":4843,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/","url":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/","name":"WebForms Core 2'de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-20T18:01:15+00:00","description":"Geleneksel web sitelerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak kullan\u0131c\u0131lar\u0131n\u0131za ger\u00e7ek bir uygulama deneyimi sunmak ister misiniz? WebForms Core 2 projenizi Progressive Web App (PWA) haline getirmek, Service Worker ile \u00e7evrimd\u0131\u015f\u0131 yetenekler kazand\u0131rmak ve Push Bildirimleri ile kullan\u0131c\u0131 etkile\u015fimini zirveye ta\u015f\u0131mak art\u0131k hayal de\u011fil. Bu kapsaml\u0131 rehberde, ASP.NET Core tabanl\u0131 WebForms uygulamalar\u0131n\u0131z\u0131 modern web'in en g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131yla donatarak, rakiplerinizden bir ad\u0131m \u00f6ne ge\u00e7menin yollar\u0131n\u0131 ke\u015ffedeceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/webforms-core-2de-pwa-service-worker-ve-push-bildirimleri-ile-uygulama-gelistirme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WebForms Core 2&#8217;de PWA, Service Worker ve Push Bildirimleri ile Uygulama Geli\u015ftirme"}]},{"@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\/34686","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=34686"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34686\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}