{"id":42882,"date":"2026-06-27T09:11:11","date_gmt":"2026-06-27T06:11:11","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/"},"modified":"2026-06-27T09:11:11","modified_gmt":"2026-06-27T06:11:11","slug":"pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/","title":{"rendered":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri"},"content":{"rendered":"<h2>Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri<\/h2>\n<p>Modern mobil uygulama geli\u015ftirmenin dinamik d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n dikkatini \u00e7ekmek ve etkile\u015fimde kalmas\u0131n\u0131 sa\u011flamak her zamankinden daha \u00f6nemli. \u00d6zellikle zaman y\u00f6netimi uygulamalar\u0131 gibi ara\u00e7larda, kullan\u0131c\u0131lar\u0131n uygulamay\u0131 s\u00fcrekli a\u00e7\u0131p kapatma ihtiyac\u0131n\u0131 ortadan kald\u0131rmak, kesintisiz bir deneyim sunman\u0131n anahtar\u0131d\u0131r. \u0130\u015fte tam bu noktada, Apple&#8217;\u0131n iOS 16 ile tan\u0131tt\u0131\u011f\u0131 Canl\u0131 Etkinlikler (Live Activities) \u00f6zelli\u011fi devreye giriyor. Bir Pomodoro zamanlay\u0131c\u0131s\u0131 gibi s\u00fcrekli g\u00fcncellenen bilgilere ihtiya\u00e7 duyan bir uygulama i\u00e7in Canl\u0131 Etkinlikler, kilit ekran\u0131nda veya Dynamic Island \u00fczerinde anl\u0131k durum g\u00fcncellemeleri sunarak kullan\u0131c\u0131 deneyimini k\u00f6kten de\u011fi\u015ftirebilir. Ancak bu g\u00fc\u00e7l\u00fc \u00f6zelli\u011fi entegre ederken, Apple&#8217;\u0131n kapsaml\u0131 dok\u00fcmantasyonunda bile tam olarak a\u00e7\u0131klanmayan baz\u0131 ince detaylar ve beklenmedik davran\u0131\u015flar ortaya \u00e7\u0131kabiliyor. Bu makalede, Pomodoro zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler eklemenin temel ad\u0131mlar\u0131n\u0131 ele alacak, ancak daha da \u00f6nemlisi, geli\u015ftiricilerin s\u0131kl\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131 ve dok\u00fcmantasyonun genellikle sessiz kald\u0131\u011f\u0131 zorluklara ve \u00e7\u00f6z\u00fcm yollar\u0131na odaklanaca\u011f\u0131z.<\/p>\n<h2>Live Activities ve Pomodoro Zamanlay\u0131c\u0131lar: Neden M\u00fckemmel Bir E\u015fle\u015fme?<\/h2>\n<p>Canl\u0131 Etkinlikler (Live Activities), iOS 16 ve sonraki s\u00fcr\u00fcmlerle birlikte gelen, uygulamalar\u0131n anl\u0131k ve ger\u00e7ek zamanl\u0131 bilgileri do\u011frudan kilit ekran\u0131nda veya iPhone 14 Pro\/Pro Max modellerindeki Dynamic Island \u00fczerinde g\u00f6stermesini sa\u011flayan devrim niteli\u011finde bir \u00f6zelliktir. Bu \u00f6zellik sayesinde kullan\u0131c\u0131lar, devam eden bir spor m\u00fcsabakas\u0131n\u0131n skorunu, bir yemek sipari\u015finin durumunu veya bir taksinin nerede oldu\u011funu uygulamay\u0131 a\u00e7madan, tek bir bak\u0131\u015fta g\u00f6rebilirler. Kilit ekran\u0131nda tam geni\u015flikte bir kart olarak g\u00f6r\u00fcnen Canl\u0131 Etkinlikler, Dynamic Island&#8217;da ise kompakt, minimal veya geni\u015fletilmi\u015f g\u00f6r\u00fcn\u00fcmlerle uygulaman\u0131z\u0131n en kritik bilgilerini sunar. Bu, \u00f6zellikle dikkat da\u011f\u0131t\u0131c\u0131 unsurlar\u0131 en aza indirmeyi hedefleyen Pomodoro Tekni\u011fi i\u00e7in e\u015fsiz bir f\u0131rsat sunar.<\/p>\n<p>Pomodoro Tekni\u011fi, 25 dakikal\u0131k odaklanma periyotlar\u0131 (pomodorolar) ve ard\u0131ndan 5 dakikal\u0131k k\u0131sa molalarla \u00e7al\u0131\u015fmay\u0131 temel alan pop\u00fcler bir zaman y\u00f6netimi y\u00f6ntemidir. Bu teknik, derinlemesine odaklanmay\u0131 te\u015fvik ederken, zihinsel yorgunlu\u011fu azaltmay\u0131 ve \u00fcretkenli\u011fi art\u0131rmay\u0131 ama\u00e7lar. Geleneksel bir Pomodoro zamanlay\u0131c\u0131 uygulamas\u0131nda, kullan\u0131c\u0131lar genellikle kalan s\u00fcreyi g\u00f6rmek veya seanslar aras\u0131nda ge\u00e7i\u015f yapmak i\u00e7in uygulamay\u0131 a\u00e7mak zorundad\u0131r. Bu durum, odaklanmay\u0131 b\u00f6lebilir ve tekni\u011fin temel prensiplerine ayk\u0131r\u0131 olabilir. Ancak Canl\u0131 Etkinlikler ile bu sorun ortadan kalkar. Pomodoro zamanlay\u0131c\u0131n\u0131z, aktif odaklanma veya mola s\u00fcresini, kalan zaman\u0131 ve mevcut seans\u0131 (\u00f6rne\u011fin, &#8220;Odaklanma: 3. Pomodoro&#8221;) do\u011frudan kilit ekran\u0131nda veya Dynamic Island&#8217;da g\u00f6sterebilir. Bu sayede kullan\u0131c\u0131, telefonunu eline ald\u0131\u011f\u0131nda veya sadece Dynamic Island&#8217;a g\u00f6z att\u0131\u011f\u0131nda t\u00fcm \u00f6nemli bilgilere an\u0131nda ula\u015fabilir, uygulamay\u0131 a\u00e7ma ihtiyac\u0131 duymadan i\u015fine devam edebilir. Bu kesintisiz bilgi ak\u0131\u015f\u0131, kullan\u0131c\u0131n\u0131n odaklanmas\u0131n\u0131 s\u00fcrd\u00fcrmesine yard\u0131mc\u0131 olurken, uygulaman\u0131z\u0131n kullan\u0131m kolayl\u0131\u011f\u0131n\u0131 ve de\u011ferini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. WidgetKit \u00e7er\u00e7evesi ve ActivityKit API&#8217;leri arac\u0131l\u0131\u011f\u0131yla entegre edilen Canl\u0131 Etkinlikler, uygulaman\u0131z\u0131n temel i\u015flevselli\u011fini kullan\u0131c\u0131lar\u0131n parmak u\u00e7lar\u0131na ta\u015f\u0131yarak, modern iOS deneyiminin ayr\u0131lmaz bir par\u00e7as\u0131 haline gelmesini sa\u011flar. Bu entegrasyon, yaln\u0131zca estetik bir geli\u015ftirmeden \u00f6te, uygulaman\u0131z\u0131n amac\u0131na daha iyi hizmet etmesini sa\u011flayan stratejik bir ad\u0131md\u0131r.<\/p>\n<h2>Temel Kurulum: Dok\u00fcmantasyonda Belirtilen Ad\u0131mlar<\/h2>\n<p>Bir Pomodoro zamanlay\u0131c\u0131s\u0131 i\u00e7in Canl\u0131 Etkinlik (Live Activity) entegrasyonu, Apple&#8217;\u0131n dok\u00fcmantasyonunda genellikle iyi a\u00e7\u0131klanan birka\u00e7 temel ad\u0131m\u0131 i\u00e7erir. Ancak bu ad\u0131mlar\u0131n arkas\u0131nda yatan n\u00fcanslar\u0131 anlamak, sorunsuz bir deneyim i\u00e7in hayati \u00f6nem ta\u015f\u0131r. \u00d6ncelikle, uygulaman\u0131za bir Widget Extension (Widget Uzant\u0131s\u0131) eklemeniz gerekmektedir. Bu uzant\u0131, Canl\u0131 Etkinli\u011finizin UI&#8217;s\u0131n\u0131 (kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc) bar\u0131nd\u0131racak ve uygulaman\u0131z\u0131n ana hedefinden ayr\u0131 olarak \u00e7al\u0131\u015facakt\u0131r. Projenize yeni bir hedef (target) ekleyerek &#8220;Widget Extension&#8221; \u015fablonunu se\u00e7ebilir ve uzant\u0131n\u0131za anlaml\u0131 bir isim verebilirsiniz.<\/p>\n<p>Daha sonra, Canl\u0131 Etkinli\u011finizin hangi verileri g\u00f6sterece\u011fini ve bu verilerin nas\u0131l g\u00fcncellenece\u011fini tan\u0131mlaman\u0131z gerekir. Bu, <code>ActivityAttributes<\/code> (Etkinlik Nitelikleri) ve <code>ContentState<\/code> (\u0130\u00e7erik Durumu) ad\u0131n\u0131 verdi\u011fimiz iki ana yap\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. <code>ActivityAttributes<\/code>, etkinli\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca de\u011fi\u015fmeyen statik verileri (\u00f6rne\u011fin, zamanlay\u0131c\u0131n\u0131n ad\u0131, toplam pomodoro say\u0131s\u0131) tutar. <code>ContentState<\/code> ise, etkinli\u011fin aktif oldu\u011fu s\u00fcre boyunca de\u011fi\u015fen dinamik verileri (\u00f6rne\u011fin, kalan s\u00fcre, mevcut pomodoro a\u015famas\u0131 &#8211; odaklanma\/mola) i\u00e7erir. Her iki yap\u0131n\u0131n da <code>Codable<\/code> protokol\u00fcne uygun olmas\u0131 gerekir, \u00e7\u00fcnk\u00fc bu veriler uygulaman\u0131z ile uzant\u0131n\u0131z aras\u0131nda serile\u015ftirilerek aktar\u0131l\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        import ActivityKit\n        import Foundation\n\n        struct PomodoroTimerAttributes: ActivityAttributes {\n            public typealias PomodoroTimerState = ContentState\n\n            public struct ContentState: Codable, Hashable {\n                var currentPhase: String\n                var remainingTime: Date\n                var totalPomodorosCompleted: Int\n            }\n\n            var timerName: String\n            var totalDuration: TimeInterval\n        }\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu yap\u0131lar tan\u0131mland\u0131ktan sonra, uygulaman\u0131z\u0131n Canl\u0131 Etkinlikleri ba\u015flatabilmesi i\u00e7in <code>Info.plist<\/code> dosyan\u0131zda <code>NSSupportsLiveActivities<\/code> anahtar\u0131n\u0131 <code>YES<\/code> olarak ayarlaman\u0131z gerekmektedir. Bu, uygulaman\u0131z\u0131n Canl\u0131 Etkinlik yetene\u011fine sahip oldu\u011funu i\u015fletim sistemine bildirir. Ard\u0131ndan, uygulaman\u0131z\u0131n ana kodunda, bir Canl\u0131 Etkinlik ba\u015flatmak i\u00e7in <code>Activity.request(attributes:contentState:staleDate:...)<\/code> metodunu kullan\u0131rs\u0131n\u0131z. Bu metod, tan\u0131mlad\u0131\u011f\u0131n\u0131z nitelikler ve ba\u015flang\u0131\u00e7 i\u00e7erik durumu ile yeni bir Canl\u0131 Etkinlik olu\u015fturur. Pomodoro zamanlay\u0131c\u0131s\u0131 \u00f6rne\u011finde, bir odaklanma seans\u0131 ba\u015flad\u0131\u011f\u0131nda bu metod \u00e7a\u011fr\u0131l\u0131r ve kilit ekran\u0131nda veya Dynamic Island&#8217;da zamanlay\u0131c\u0131 g\u00f6r\u00fcn\u00fcr hale gelir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        import ActivityKit\n\n        func startPomodoroActivity() async {\n            let attributes = PomodoroTimerAttributes(timerName: \"Odaklanma Seans\u0131\", totalDuration: 25 * 60)\n            let initialContentState = PomodoroTimerAttributes.ContentState(\n                currentPhase: \"Odaklanma\",\n                remainingTime: Date().addingTimeInterval(25 * 60),\n                totalPomodorosCompleted: 0\n            )\n\n            do {\n                let activity = try Activity<PomodoroTimerAttributes>.request(\n                    attributes: attributes,\n                    contentState: initialContentState,\n                    staleDate: Date().addingTimeInterval(25 * 60 + 5 * 60) \/\/ \u00d6rnek bir bayatlama tarihi\n                )\n                print(\"Live Activity ba\u015flat\u0131ld\u0131: \\(activity.id)\")\n            } catch {\n                print(\"Live Activity ba\u015flat\u0131lamad\u0131: \\(error.localizedDescription)\")\n            }\n        }\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Canl\u0131 Etkinli\u011fin UI&#8217;s\u0131, Widget Extension i\u00e7inde SwiftUI kullan\u0131larak olu\u015fturulur. Burada, etkinli\u011fin farkl\u0131 g\u00f6r\u00fcn\u00fcmlerini (kilit ekran\u0131, Dynamic Island&#8217;\u0131n kompakt, minimal ve geni\u015fletilmi\u015f halleri) tasarlaman\u0131z gerekir. \u00d6zellikle <code>DynamicIsland<\/code> i\u00e7in <code>compactLeading<\/code>, <code>compactTrailing<\/code>, <code>minimal<\/code> ve <code>expanded<\/code> g\u00f6r\u00fcn\u00fcmlerini tan\u0131mlayarak, bilginin farkl\u0131 ekran durumlar\u0131nda nas\u0131l sunulaca\u011f\u0131n\u0131 belirtirsiniz. Zamanlay\u0131c\u0131n\u0131n kalan s\u00fcresini g\u00f6stermek i\u00e7in <code>Text(timerInterval: ...)<\/code> gibi SwiftUI g\u00f6r\u00fcn\u00fcmlerini kullanabilirsiniz, bu sayede sistem otomatik olarak zaman\u0131 g\u00fcnceller. Bu temel ad\u0131mlar, \u00e7o\u011fu geli\u015ftiricinin Canl\u0131 Etkinlikleri uygulamalar\u0131na ba\u015far\u0131yla entegre etmesi i\u00e7in yeterli bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Ancak, ger\u00e7ek d\u00fcnyadaki karma\u015f\u0131k senaryolar ve performans gereksinimleri, dok\u00fcmantasyonun \u00f6tesine ge\u00e7en detayl\u0131 yakla\u015f\u0131mlar\u0131 zorunlu k\u0131lar.<\/p>\n<h2>Gizli K\u00f6\u015feler ve Beklenmedik Davran\u0131\u015flar: Dok\u00fcmantasyonun Sustuklar\u0131<\/h2>\n<p>Canl\u0131 Etkinlikler, kullan\u0131c\u0131lara anl\u0131k bilgi sunma konusunda harika bir potansiyele sahip olsa da, geli\u015ftirme s\u00fcrecinde dok\u00fcmantasyonun yeterince vurgulamad\u0131\u011f\u0131 veya do\u011frudan belirtmedi\u011fi baz\u0131 kritik noktalar bulunmaktad\u0131r. Bu &#8220;gizli k\u00f6\u015feler&#8221;, uygulaman\u0131z\u0131n performans\u0131n\u0131, g\u00fcvenilirli\u011fini ve kullan\u0131c\u0131 deneyimini do\u011frudan etkileyebilir. \u0130lk ve belki de en \u00f6nemli konu, Canl\u0131 Etkinliklerin <strong>g\u00fcncelleme s\u0131kl\u0131\u011f\u0131 ve b\u00fct\u00e7esidir<\/strong>. Apple, Canl\u0131 Etkinliklerin pil \u00f6mr\u00fc \u00fczerindeki etkisini minimize etmek i\u00e7in yerel (on-device) g\u00fcncellemeler \u00fczerinde belirli k\u0131s\u0131tlamalar uygular. Dok\u00fcmantasyonda genellikle, &#8220;s\u0131k g\u00fcncellemelerden ka\u00e7\u0131n\u0131n&#8221; veya &#8220;yaln\u0131zca \u00f6nemli de\u011fi\u015fiklikleri g\u00fcncelleyin&#8221; gibi genel ifadeler bulunur. Ancak ger\u00e7ekte, bir Canl\u0131 Etkinli\u011fi saniyede bir veya daha s\u0131k g\u00fcncellemeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda, sistem bu g\u00fcncellemeleri bir s\u00fcre sonra k\u0131s\u0131tlayabilir veya tamamen durdurabilir. Bu durum, \u00f6zellikle bir Pomodoro zamanlay\u0131c\u0131s\u0131nda kalan s\u00fcreyi saniyelik do\u011frulukla g\u00f6stermek istedi\u011finizde b\u00fcy\u00fck bir sorun te\u015fkil eder. \u00c7\u00f6z\u00fcm genellikle, <code>Text(timerInterval: ...)<\/code> gibi SwiftUI&#8217;\u0131n yerle\u015fik zamanlay\u0131c\u0131 g\u00f6r\u00fcn\u00fcmlerini kullanmaktan ge\u00e7er. Bu g\u00f6r\u00fcn\u00fcmler, sistem taraf\u0131ndan optimize edilmi\u015f bir \u015fekilde g\u00fcncellenir ve sizin manuel olarak <code>update<\/code> \u00e7a\u011fr\u0131s\u0131 yapman\u0131za gerek kalmaz. Ancak, bu bile\u015fen sadece zaman\u0131 g\u00f6stermek i\u00e7in idealdir; e\u011fer zamanlay\u0131c\u0131ya ek olarak ba\u015fka dinamik verileri (\u00f6rne\u011fin, &#8220;Odaklanma&#8221;dan &#8220;Mola&#8221;ya ge\u00e7i\u015f) g\u00fcncellemeniz gerekiyorsa, bu durumda manuel g\u00fcncelleme yapmak zorunlu hale gelir ve bu noktada frekans k\u0131s\u0131tlamalar\u0131 devreye girer. Apple, sunucu taraf\u0131 anl\u0131k bildirimler (APNS) arac\u0131l\u0131\u011f\u0131yla daha s\u0131k ve g\u00fcvenilir g\u00fcncellemeler yap\u0131lmas\u0131na izin verir, ancak bu da ek bir sunucu altyap\u0131s\u0131 ve karma\u015f\u0131kl\u0131k getirir.<\/p>\n<p>Bir di\u011fer \u00f6nemli alan ise <strong>ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimidir<\/strong>. Bir Canl\u0131 Etkinli\u011fi ne zaman ve nas\u0131l sonland\u0131rman\u0131z gerekti\u011fi, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131 i\u00e7in kritiktir. <code>activity.end(using:dismissalPolicy:)<\/code> metodunu kullanarak bir etkinli\u011fi sonland\u0131rabilirsiniz. Ancak, uygulaman\u0131z kullan\u0131c\u0131 taraf\u0131ndan kapat\u0131l\u0131rsa veya sistem taraf\u0131ndan sonland\u0131r\u0131l\u0131rsa ne olur? Dok\u00fcmantasyon, bu senaryolarda Canl\u0131 Etkinliklerin varsay\u0131lan olarak belirli bir s\u00fcre daha aktif kalabilece\u011fini belirtir, ancak bu s\u00fcrenin ne kadar oldu\u011fu veya bu durumun nas\u0131l kontrol edilece\u011fi genellikle belirsizdir. Uygulaman\u0131z yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda, daha \u00f6nce ba\u015flat\u0131lan Canl\u0131 Etkinlikleri tekrar bulup g\u00fcncelleyebilmeniz veya sonland\u0131rabilmeniz gerekir. Bu, <code>Activity.activities<\/code> \u00f6zelli\u011fini kullanarak aktif etkinlikleri sorgulamay\u0131 ve onlar\u0131n durumlar\u0131n\u0131 uygulaman\u0131z\u0131n dahili durumuyla senkronize etmeyi gerektirir. Aksi takdirde, kullan\u0131c\u0131 kilit ekran\u0131nda s\u00fcresi dolmu\u015f veya yanl\u0131\u015f bilgi g\u00f6steren bir zamanlay\u0131c\u0131yla kar\u015f\u0131la\u015fabilir. Ayr\u0131ca, <code>staleDate<\/code> parametresi, etkinli\u011fin ne zaman &#8220;bayatlam\u0131\u015f&#8221; kabul edilece\u011fini ve otomatik olarak kapanabilece\u011fini belirler; bu, \u00f6zellikle uygulaman\u0131z\u0131n beklenmedik bir \u015fekilde kapanmas\u0131 durumunda temiz bir sonland\u0131rma sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<p>Son olarak, <strong>Dynamic Island UI&#8217;s\u0131n\u0131n incelikleri<\/strong> ve <strong>eri\u015filebilirlik (accessibility)<\/strong> konular\u0131 da g\u00f6z ard\u0131 edilmemelidir. Dynamic Island, farkl\u0131 cihaz modellerinde ve farkl\u0131 ba\u011flamlarda (\u00f6rne\u011fin, gelen arama veya Face ID onay\u0131 s\u0131ras\u0131nda) farkl\u0131 boyutlarda ve \u015fekillerde g\u00f6r\u00fcnebilir. Bu durum, UI tasar\u0131m\u0131n\u0131z\u0131n her senaryoda okunabilir ve estetik kalmas\u0131n\u0131 sa\u011flamak i\u00e7in titiz bir test s\u00fcreci gerektirir. Dok\u00fcmantasyon temel g\u00f6r\u00fcn\u00fcmleri a\u00e7\u0131klasa da, kenar bo\u015fluklar\u0131, yaz\u0131 tipi boyutlar\u0131 ve renk kontrastlar\u0131 gibi detaylar \u00fczerinde \u00e7ok durmaz. Kendi tasar\u0131mlar\u0131n\u0131z\u0131 yaparken, metinlerin kesilmemesine, \u00f6nemli bilgilerin her zaman g\u00f6r\u00fcn\u00fcr olmas\u0131na ve eri\u015filebilirlik y\u00f6nergelerine (\u00f6rne\u011fin, yeterli renk kontrast\u0131) uygun olmas\u0131na dikkat etmelisiniz. \u00d6zellikle, Dynamic Island&#8217;\u0131n minimal ve kompakt g\u00f6r\u00fcn\u00fcmleri, bilginin \u00e7ok k\u0131s\u0131tl\u0131 bir alanda \u00f6zl\u00fc bir \u015fekilde sunulmas\u0131n\u0131 gerektirir; bu da karma\u015f\u0131k bir Pomodoro zamanlay\u0131c\u0131s\u0131 i\u00e7in hangi bilgilerin en kritik oldu\u011funa karar vermeyi zorla\u015ft\u0131rabilir. Bu t\u00fcr detaylar, uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015fmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar taraf\u0131ndan sevilmesini ve tercih edilmesini de sa\u011flayan unsurlard\u0131r.<\/p>\n<h2>Pomodoro Zamanlay\u0131c\u0131 \u0130\u00e7in \u0130leri D\u00fczey Senaryolar ve \u00c7\u00f6z\u00fcmler<\/h2>\n<p>Canl\u0131 Etkinlikleri bir Pomodoro zamanlay\u0131c\u0131s\u0131na entegre ederken temel kurulum ad\u0131mlar\u0131n\u0131 tamamlamak yeterli de\u011fildir; ger\u00e7ek d\u00fcnya kullan\u0131m senaryolar\u0131 ve kullan\u0131c\u0131 beklentileri, daha ileri d\u00fczeyde d\u00fc\u015f\u00fcnmeyi ve \u00e7\u00f6z\u00fcmler geli\u015ftirmeyi gerektirir. Bu b\u00f6l\u00fcmde, dok\u00fcmantasyonun genellikle ayr\u0131nt\u0131lar\u0131na girmedi\u011fi karma\u015f\u0131k senaryolar\u0131 ve bunlara y\u00f6nelik pratik yakla\u015f\u0131mlar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Kal\u0131c\u0131 Zamanlay\u0131c\u0131 Durumu Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Bir Pomodoro zamanlay\u0131c\u0131s\u0131n\u0131n en \u00f6nemli \u00f6zelliklerinden biri, uygulaman\u0131n kapat\u0131lmas\u0131na veya arka plana al\u0131nmas\u0131na ra\u011fmen zamanlay\u0131c\u0131n\u0131n do\u011fru bir \u015fekilde devam etmesidir. Canl\u0131 Etkinlikler, bu durumu kilit ekran\u0131nda g\u00f6rsel olarak desteklese de, uygulaman\u0131z\u0131n dahili durumu ile Canl\u0131 Etkinli\u011fin durumunu senkronize tutmak kritik bir zorluktur. Uygulama kapat\u0131l\u0131p yeniden a\u00e7\u0131ld\u0131\u011f\u0131nda, Canl\u0131 Etkinli\u011fin mevcut durumunu (\u00f6rne\u011fin, kalan s\u00fcre, hangi pomodoro a\u015famas\u0131nda oldu\u011fu) do\u011fru bir \u015fekilde al\u0131p uygulaman\u0131z\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcne yans\u0131tman\u0131z gerekir. Bunun i\u00e7in genellikle App Group (Uygulama Grubu) ve <code>UserDefaults<\/code> (Kullan\u0131c\u0131 Varsay\u0131lanlar\u0131) veya Core Data\/SwiftData gibi veri saklama mekanizmalar\u0131 kullan\u0131l\u0131r. App Group, ana uygulaman\u0131z ve Widget Extension&#8217;\u0131n\u0131z aras\u0131nda g\u00fcvenli bir \u015fekilde veri payla\u015f\u0131m\u0131 yapman\u0131z\u0131 sa\u011flar. Zamanlay\u0131c\u0131 durumu her g\u00fcncellendi\u011finde, bu veriyi payla\u015f\u0131lan <code>UserDefaults<\/code> konteynerine kaydetmek, uygulaman\u0131z yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda en son durumu geri y\u00fcklemenize olanak tan\u0131r. Canl\u0131 Etkinlik de bu payla\u015f\u0131lan veriden beslenebilir, b\u00f6ylece her iki taraf da ayn\u0131, g\u00fcncel bilgiye sahip olur.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        \/\/ App Group tan\u0131mlamas\u0131 (Xcode -> Signing & Capabilities)\n        \/\/ Group ID: group.com.example.pomodoro\n\n        \/\/ Ana uygulamada zamanlay\u0131c\u0131 durumu kaydetme\n        let sharedDefaults = UserDefaults(suiteName: \"group.com.example.pomodoro\")\n        sharedDefaults?.set(currentPhase, forKey: \"currentPomodoroPhase\")\n        sharedDefaults?.set(remainingTime, forKey: \"remainingPomodoroTime\")\n\n        \/\/ Widget Extension'da zamanlay\u0131c\u0131 durumu okuma\n        let sharedDefaults = UserDefaults(suiteName: \"group.com.example.pomodoro\")\n        let currentPhase = sharedDefaults?.string(forKey: \"currentPomodoroPhase\") ?? \"Bilinmiyor\"\n      <\/code><\/pre>\n<\/p><\/div>\n<h3>Canl\u0131 Etkinlik \u0130\u00e7indeki Kullan\u0131c\u0131 Etkile\u015fimleri Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Kilit ekran\u0131ndaki veya Dynamic Island&#8217;daki bir Canl\u0131 Etkinli\u011fe &#8220;Duraklat&#8221;, &#8220;Atla&#8221; veya &#8220;Bitir&#8221; gibi d\u00fc\u011fmeler eklemek, kullan\u0131c\u0131 deneyimini zenginle\u015ftirebilir. Ancak Canl\u0131 Etkinlikler, do\u011frudan bir uygulama gibi karma\u015f\u0131k etkile\u015fimler sunmaz. Bunun yerine, <code>Link<\/code> veya <code>Button<\/code> g\u00f6r\u00fcn\u00fcmleri kullanarak bir URL \u015femas\u0131 (URL Scheme) arac\u0131l\u0131\u011f\u0131yla ana uygulaman\u0131zla ileti\u015fim kurabilirsiniz. \u00d6rne\u011fin, bir &#8220;Duraklat&#8221; d\u00fc\u011fmesine bas\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n \u00f6zel bir URL \u015femas\u0131n\u0131 (\u00f6rne\u011fin, <code>pomodoroapp:\/\/pauseTimer<\/code>) tetikleyebilir ve uygulaman\u0131z bu URL&#8217;yi yakalayarak zamanlay\u0131c\u0131y\u0131 duraklatma i\u015flemini ger\u00e7ekle\u015ftirebilir. Bu yakla\u015f\u0131m, Canl\u0131 Etkinlikten ana uygulamaya tek y\u00f6nl\u00fc bir ileti\u015fim kurar. Uygulaman\u0131z bu URL&#8217;yi i\u015fledi\u011finde, zamanlay\u0131c\u0131 durumunu g\u00fcncellemeli ve ard\u0131ndan Canl\u0131 Etkinli\u011fi de g\u00fcncellenmi\u015f durumla (\u00f6rne\u011fin, &#8220;Duraklat\u0131ld\u0131&#8221; mesaj\u0131yla) yeniden yay\u0131nlamal\u0131d\u0131r. Bu, kullan\u0131c\u0131n\u0131n kilit ekran\u0131nda yapt\u0131\u011f\u0131 eylemlerin an\u0131nda uygulamada kar\u015f\u0131l\u0131k bulmas\u0131n\u0131 ve Canl\u0131 Etkinli\u011fin de bu de\u011fi\u015fikli\u011fi yans\u0131tmas\u0131n\u0131 sa\u011flar. Bu y\u00f6ntem, kullan\u0131c\u0131ya uygulaman\u0131n kapal\u0131yken bile belirli kontrol imkanlar\u0131 sunar.<\/p>\n<h3>Birden Fazla Canl\u0131 Etkinlik Y\u00f6netimi<\/h3>\n<p>\u00c7o\u011fu Pomodoro zamanlay\u0131c\u0131s\u0131 tek bir aktif seans\u0131 y\u00f6netse de, baz\u0131 ileri d\u00fczey senaryolarda birden fazla e\u015fzamanl\u0131 zamanlay\u0131c\u0131ya ihtiya\u00e7 duyulabilir (\u00f6rne\u011fin, farkl\u0131 projeler i\u00e7in ayr\u0131 zamanlay\u0131c\u0131lar). ActivityKit, ayn\u0131 anda birden fazla Canl\u0131 Etkinlik ba\u015flat\u0131lmas\u0131na izin verir. Her etkinli\u011fin benzersiz bir kimli\u011fi (<code>id<\/code>) vard\u0131r. Uygulaman\u0131z, aktif olan t\u00fcm etkinlikleri <code>Activity.activities<\/code> dizisi arac\u0131l\u0131\u011f\u0131yla takip etmeli ve her birini ayr\u0131 ayr\u0131 g\u00fcncellemelidir. Bu durum, \u00f6zellikle uygulaman\u0131z yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda hangi etkinli\u011fin hangi zamanlay\u0131c\u0131ya ait oldu\u011funu do\u011fru bir \u015fekilde e\u015fle\u015ftirmeyi gerektirir. Her etkinli\u011fi ba\u015flat\u0131rken, <code>attributes<\/code> i\u00e7inde benzersiz bir tan\u0131mlay\u0131c\u0131 (\u00f6rne\u011fin, bir UUID) eklemek, bu e\u015fle\u015ftirmeyi kolayla\u015ft\u0131racakt\u0131r. Kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan, kilit ekran\u0131nda birden fazla Canl\u0131 Etkinli\u011fin nas\u0131l g\u00f6r\u00fcnece\u011fi ve kullan\u0131c\u0131n\u0131n bunlar\u0131 nas\u0131l y\u00f6netece\u011fini de g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z \u00f6nemlidir; \u00e7ok fazla etkinlik ekran\u0131 karma\u015f\u0131k hale getirebilir.<\/p>\n<p>Bu ileri d\u00fczey senaryolar, Canl\u0131 Etkinlikleri sadece g\u00f6rsel bir eklenti olmaktan \u00e7\u0131kar\u0131p, uygulaman\u0131z\u0131n temel i\u015flevselli\u011finin ayr\u0131lmaz bir par\u00e7as\u0131 haline getirir. Do\u011fru planlama ve uygulama ile, Pomodoro zamanlay\u0131c\u0131n\u0131z kullan\u0131c\u0131lar i\u00e7in daha sezgisel, g\u00fc\u00e7l\u00fc ve kesintisiz bir deneyim sunabilir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Uygulamas\u0131: Bir Pomodoro Live Activity&#8217;si Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdiye kadar Canl\u0131 Etkinliklerin teorik y\u00f6nlerini ve dok\u00fcmantasyonun \u00f6tesindeki zorluklar\u0131 ele ald\u0131k. Bu b\u00f6l\u00fcmde, bir Pomodoro zamanlay\u0131c\u0131s\u0131 i\u00e7in Canl\u0131 Etkinlikleri pratik bir \u015fekilde nas\u0131l uygulayaca\u011f\u0131m\u0131za odaklanaca\u011f\u0131z. Ad\u0131m ad\u0131m bir \u00f6rnekle, ana uygulaman\u0131zdan bir Canl\u0131 Etkinli\u011fi ba\u015flatma, g\u00fcncelleme ve sonland\u0131rma s\u00fcre\u00e7lerini g\u00f6sterece\u011fiz.<\/p>\n<h3>1. Widget Extension Olu\u015fturma<\/h3>\n<p>\u00d6ncelikle, Xcode projenize yeni bir hedef ekleyerek bir Widget Extension olu\u015fturun. \u015eablon olarak &#8220;Widget Extension&#8221;\u0131 se\u00e7in ve &#8220;Include Live Activity&#8221; kutucu\u011funu i\u015faretleyin. Bu, otomatik olarak gerekli dosyalar\u0131 ve temel bir Live Activity \u015fablonunu olu\u015fturacakt\u0131r. \u00d6rne\u011fin, ad\u0131n\u0131 &#8220;PomodoroLiveActivityWidget&#8221; koyabiliriz.<\/p>\n<h3>2. ActivityAttributes ve ContentState Tan\u0131mlama<\/h3>\n<p>Widget Extension&#8217;\u0131n\u0131z i\u00e7inde, Canl\u0131 Etkinli\u011finizin \u00f6zelliklerini ve durumunu tan\u0131mlayan bir dosya olu\u015fturun (\u00f6rne\u011fin, <code>PomodoroTimerAttributes.swift<\/code>). Daha \u00f6nce bahsedildi\u011fi gibi, bu yap\u0131lar <code>Codable<\/code> olmal\u0131d\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        import ActivityKit\n        import Foundation\n\n        struct PomodoroTimerAttributes: ActivityAttributes {\n            public typealias PomodoroTimerState = ContentState\n\n            public struct ContentState: Codable, Hashable {\n                var currentPhase: String \/\/ \"Odaklanma\" veya \"Mola\"\n                var endTime: Date       \/\/ Zamanlay\u0131c\u0131n\u0131n bitece\u011fi an\n                var pomodoroCount: Int  \/\/ Tamamlanan pomodoro say\u0131s\u0131\n            }\n\n            var timerName: String \/\/ \"Proje X Pomodoro\"\n        }\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Burada <code>endTime<\/code>&#8216;\u0131 kullanmak \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu sayede Canl\u0131 Etkinlik UI&#8217;s\u0131nda <code>Text(timerInterval: ...)<\/code> ile kalan s\u00fcreyi sistemin otomatik olarak g\u00fcncellemesini sa\u011flayabiliriz. Bu, manuel g\u00fcncelleme ihtiyac\u0131n\u0131 azalt\u0131r ve pil \u00f6mr\u00fcn\u00fc korur.<\/p>\n<h3>3. Canl\u0131 Etkinlik UI&#8217;s\u0131n\u0131 Tasarlama<\/h3>\n<p>Widget Extension&#8217;\u0131n\u0131z\u0131n ana dosyas\u0131nda (\u00f6rne\u011fin, <code>PomodoroLiveActivityWidget.swift<\/code>), Canl\u0131 Etkinli\u011finizin SwiftUI g\u00f6r\u00fcn\u00fcmlerini tan\u0131mlayacaks\u0131n\u0131z. Hem kilit ekran\u0131 hem de Dynamic Island i\u00e7in farkl\u0131 g\u00f6r\u00fcn\u00fcmler sa\u011flamal\u0131s\u0131n\u0131z.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        import WidgetKit\n        import SwiftUI\n        import ActivityKit\n\n        struct PomodoroLiveActivityWidget: Widget {\n            let kind: String = \"PomodoroLiveActivityWidget\"\n\n            var body: some WidgetConfiguration {\n                ActivityConfiguration(for: PomodoroTimerAttributes.self) { context in\n                    \/\/ Kilit Ekran\u0131 veya Geni\u015fletilmi\u015f Dynamic Island G\u00f6r\u00fcn\u00fcm\u00fc\n                    VStack(alignment: .leading) {\n                        Text(context.state.currentPhase)\n                            .font(.headline)\n                            .foregroundColor(.accentColor)\n                        HStack {\n                            Text(\"Kalan S\u00fcre:\")\n                            Text(timerInterval: Date()...context.state.endTime, countsDown: true)\n                                .font(.title)\n                                .fontWeight(.bold)\n                        }\n                        Text(\"Pomodoro: \\(context.state.pomodoroCount)\")\n                            .font(.subheadline)\n                    }\n                    .padding()\n                    .activityBackgroundTint(.gray.opacity(0.2))\n                    .activitySystemActionForegroundColor(.white)\n\n                } dynamicIsland: { context in\n                    DynamicIsland {\n                        \/\/ Geni\u015fletilmi\u015f G\u00f6r\u00fcn\u00fcm\n                        DynamicIslandExpandedRegion(.leading) {\n                            Label(context.state.currentPhase, systemImage: \"hourglass\")\n                                .font(.title3)\n                        }\n                        DynamicIslandExpandedRegion(.trailing) {\n                            Text(timerInterval: Date()...context.state.endTime, countsDown: true)\n                                .font(.title2)\n                                .fontWeight(.bold)\n                        }\n                        DynamicIslandExpandedRegion(.bottom) {\n                            Text(\"Pomodoro #\\(context.state.pomodoroCount)\")\n                                .font(.caption)\n                                .foregroundColor(.secondary)\n                        }\n                    } compactLeading: {\n                        \/\/ Kompakt Sol G\u00f6r\u00fcn\u00fcm\n                        Label(context.state.pomodoroCount.description, systemImage: \"hourglass\")\n                            .font(.caption)\n                            .foregroundColor(.accentColor)\n                    } compactTrailing: {\n                        \/\/ Kompakt Sa\u011f G\u00f6r\u00fcn\u00fcm\n                        Text(timerInterval: Date()...context.state.endTime, countsDown: true)\n                            .font(.caption)\n                            .monospacedDigit()\n                    } minimal: {\n                        \/\/ Minimal G\u00f6r\u00fcn\u00fcm\n                        Image(systemName: \"hourglass.tophalf.fill\")\n                    }\n                }\n            }\n        }\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki kodda, <code>Text(timerInterval: Date()...context.state.endTime, countsDown: true)<\/code> kullan\u0131m\u0131, zamanlay\u0131c\u0131n\u0131n otomatik olarak g\u00fcncellenmesini sa\u011flar. Bu, manuel <code>update()<\/code> \u00e7a\u011fr\u0131lar\u0131na olan ihtiyac\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r ve pil verimlili\u011fini art\u0131r\u0131r.<\/p>\n<h3>4. Ana Uygulamadan Canl\u0131 Etkinli\u011fi Y\u00f6netme<\/h3>\n<p>Ana uygulaman\u0131zda (\u00f6rne\u011fin, bir SwiftUI g\u00f6r\u00fcn\u00fcm\u00fcnde), bir Pomodoro seans\u0131 ba\u015flad\u0131\u011f\u0131nda Canl\u0131 Etkinli\u011fi ba\u015flatacak, g\u00fcncelleyecek ve bitti\u011finde sonland\u0131racak mant\u0131\u011f\u0131 uygulay\u0131n.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        import ActivityKit\n        import SwiftUI\n\n        class PomodoroManager: ObservableObject {\n            @Published var currentActivity: Activity&lt;PomodoroTimerAttributes&gt;?\n\n            func startPomodoro(duration: TimeInterval, phase: String, pomodoroNum: Int, timerName: String) {\n                let attributes = PomodoroTimerAttributes(timerName: timerName)\n                let initialContentState = PomodoroTimerAttributes.ContentState(\n                    currentPhase: phase,\n                    endTime: Date().addingTimeInterval(duration),\n                    pomodoroCount: pomodoroNum\n                )\n\n                do {\n                    currentActivity = try Activity&lt;PomodoroTimerAttributes&gt;.request(\n                        attributes: attributes,\n                        contentState: initialContentState,\n                        staleDate: Date().addingTimeInterval(duration + 60) \/\/ Etkinli\u011fin ne zaman bayatlayaca\u011f\u0131\n                    )\n                    print(\"Live Activity ba\u015flat\u0131ld\u0131: \\(currentActivity?.id ?? \"N\/A\")\")\n                } catch {\n                    print(\"Live Activity ba\u015flat\u0131lamad\u0131: \\(error.localizedDescription)\")\n                }\n            }\n\n            func updatePomodoro(newPhase: String, newEndTime: Date, newPomodoroCount: Int) async {\n                guard let activity = currentActivity else { return }\n                let updatedContentState = PomodoroTimerAttributes.ContentState(\n                    currentPhase: newPhase,\n                    endTime: newEndTime,\n                    pomodoroCount: newPomodoroCount\n                )\n                await activity.update(using: updatedContentState)\n                print(\"Live Activity g\u00fcncellendi.\")\n            }\n\n            func endPomodoro() async {\n                guard let activity = currentActivity else { return }\n                let finalContentState = PomodoroTimerAttributes.ContentState(\n                    currentPhase: \"Tamamland\u0131\",\n                    endTime: Date(), \/\/ Biti\u015f zaman\u0131 \u015fimdiki zaman olarak ayarlanabilir\n                    pomodoroCount: activity.contentState.pomodoroCount\n                )\n                await activity.end(using: finalContentState, dismissalPolicy: .after(.now.addingTimeInterval(5))) \/\/ 5 saniye sonra kapat\n                currentActivity = nil\n                print(\"Live Activity sonland\u0131r\u0131ld\u0131.\")\n            }\n        }\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu kod par\u00e7ac\u0131klar\u0131, bir Pomodoro zamanlay\u0131c\u0131s\u0131 i\u00e7in Canl\u0131 Etkinlikleri ba\u015flatma, g\u00fcncelleme ve sonland\u0131rma s\u00fcrecinin temelini olu\u015fturur. <code>staleDate<\/code> parametresi, etkinli\u011fin belirli bir s\u00fcre sonra otomatik olarak kapanmas\u0131n\u0131 sa\u011flar, bu da uygulaman\u0131z\u0131n beklenmedik bir \u015fekilde sonlanmas\u0131 durumunda etkinli\u011fin kilit ekran\u0131nda sonsuza kadar kalmas\u0131n\u0131 engeller. <code>dismissalPolicy<\/code> ise etkinli\u011fin sonland\u0131r\u0131ld\u0131ktan sonra ne kadar s\u00fcre daha kilit ekran\u0131nda kalaca\u011f\u0131n\u0131 belirler, bu da kullan\u0131c\u0131ya son bir bak\u0131\u015f atma f\u0131rsat\u0131 sunar. Bu ad\u0131mlar\u0131 izleyerek, kullan\u0131c\u0131lar\u0131n\u0131za kesintisiz ve bilgilendirici bir Pomodoro deneyimi sunan Canl\u0131 Etkinlikleri uygulaman\u0131za ba\u015far\u0131yla entegre edebilirsiniz.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Canl\u0131 Etkinlikler, iOS ekosistemindeki uygulamalar i\u00e7in kullan\u0131c\u0131 etkile\u015fimini ve eri\u015filebilirli\u011fi yeni bir boyuta ta\u015f\u0131yan g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. \u00d6zellikle Pomodoro zamanlay\u0131c\u0131s\u0131 gibi s\u00fcrekli g\u00fcncel bilgi gerektiren uygulamalar i\u00e7in, kilit ekran\u0131nda ve Dynamic Island&#8217;da anl\u0131k durum g\u00fcncellemeleri sunarak kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. Bu makalede, Canl\u0131 Etkinliklerin temel kurulumundan, dok\u00fcmantasyonun genellikle g\u00f6z ard\u0131 etti\u011fi kritik detaylara ve ger\u00e7ek d\u00fcnya uygulama senaryolar\u0131na kadar geni\u015f bir yelpazeyi ele ald\u0131k. G\u00fcncelleme s\u0131kl\u0131\u011f\u0131 k\u0131s\u0131tlamalar\u0131, ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimi ve Dynamic Island UI&#8217;s\u0131n\u0131n incelikleri gibi konular, geli\u015ftiricilerin kar\u015f\u0131la\u015fabilece\u011fi ve \u00f6nceden bilgi sahibi olunmas\u0131 gereken \u00f6nemli zorluklard\u0131r. Ancak do\u011fru yakla\u015f\u0131mlar ve stratejilerle, bu zorluklar\u0131n \u00fcstesinden gelmek ve kullan\u0131c\u0131lar\u0131n\u0131za ak\u0131c\u0131, bilgilendirici ve pil dostu bir deneyim sunmak m\u00fcmk\u00fcnd\u00fcr. Pomodoro zamanlay\u0131c\u0131n\u0131z\u0131n Canl\u0131 Etkinliklerle zenginle\u015ftirilmesi, uygulaman\u0131z\u0131n rekabet\u00e7i mobil uygulama pazar\u0131nda \u00f6ne \u00e7\u0131kmas\u0131n\u0131 sa\u011flayacak ve kullan\u0131c\u0131lar\u0131n \u00fcretkenliklerini art\u0131rmalar\u0131na yard\u0131mc\u0131 olacakt\u0131r. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir Canl\u0131 Etkinlik, uygulaman\u0131z\u0131n sadece bir ara\u00e7 olmaktan \u00e7\u0131k\u0131p, kullan\u0131c\u0131n\u0131n g\u00fcnl\u00fck i\u015f ak\u0131\u015f\u0131n\u0131n do\u011fal bir par\u00e7as\u0131 haline gelmesini sa\u011flar.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n            <strong>Canl\u0131 Etkinlikler ne kadar s\u00fcre aktif kalabilir?<\/strong><\/p>\n<p>Bir Canl\u0131 Etkinlik, uygulaman\u0131z taraf\u0131ndan ba\u015flat\u0131ld\u0131ktan sonra en fazla 8 saat aktif kalabilir. Bu s\u00fcrenin sonunda veya uygulaman\u0131z taraf\u0131ndan manuel olarak sonland\u0131r\u0131ld\u0131\u011f\u0131nda, etkinlik kilit ekran\u0131ndan kaybolur. Ancak, <code>staleDate<\/code> parametresi kullan\u0131larak bu s\u00fcre daha erken de belirlenebilir, bu da etkinli\u011fin belirli bir zamandan sonra &#8220;bayatlam\u0131\u015f&#8221; kabul edilip otomatik olarak kapanmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n            <strong>Canl\u0131 Etkinlikler her iOS cihaz\u0131nda \u00e7al\u0131\u015f\u0131r m\u0131?<\/strong><\/p>\n<p>Canl\u0131 Etkinlikler, iOS 16 veya sonraki s\u00fcr\u00fcmlerini \u00e7al\u0131\u015ft\u0131ran t\u00fcm iPhone modellerinde kilit ekran\u0131nda g\u00f6r\u00fcn\u00fcr. Dynamic Island \u00f6zelli\u011fi ise yaln\u0131zca iPhone 14 Pro ve iPhone 14 Pro Max modelleri ile iPhone 15 serisi cihazlarda mevcuttur. Di\u011fer cihazlarda Canl\u0131 Etkinlikler sadece kilit ekran\u0131nda g\u00f6sterilir.<\/p>\n<\/li>\n<li>\n            <strong>Canl\u0131 Etkinlikleri g\u00fcncellemek i\u00e7in sunucu taraf\u0131 bir API&#8217;ye ihtiyac\u0131m var m\u0131?<\/strong><\/p>\n<p>Hay\u0131r, Canl\u0131 Etkinlikleri uygulaman\u0131z i\u00e7inden (on-device) g\u00fcncelleyebilirsiniz. Ancak, \u00e7ok s\u0131k veya uygulaman\u0131z arka planda \u00e7al\u0131\u015fm\u0131yorken bile kritik g\u00fcncellemeler yapman\u0131z gerekiyorsa, Apple Push Notification Service (APNS) arac\u0131l\u0131\u011f\u0131yla sunucu taraf\u0131 g\u00fcncellemeler g\u00f6ndermek daha g\u00fcvenilir ve verimli bir y\u00f6ntem olabilir. Bir Pomodoro zamanlay\u0131c\u0131s\u0131 i\u00e7in <code>Text(timerInterval: ...)<\/code> kullan\u0131m\u0131 \u00e7o\u011fu zaman yeterli olacakt\u0131r.<\/p>\n<\/li>\n<li>\n            <strong>Kullan\u0131c\u0131 Canl\u0131 Etkinli\u011fi kilit ekran\u0131ndan manuel olarak kapatabilir mi?<\/strong><\/p>\n<p>Evet, kullan\u0131c\u0131lar kilit ekran\u0131ndaki bir Canl\u0131 Etkinli\u011fi sola kayd\u0131rarak veya uzun basarak kapatabilirler. Bu durum, etkinli\u011fin uygulaman\u0131z taraf\u0131ndan sonland\u0131r\u0131lmas\u0131ndan farkl\u0131d\u0131r. Kullan\u0131c\u0131 manuel olarak kapatt\u0131\u011f\u0131nda, uygulaman\u0131z bu durumu do\u011frudan alg\u0131lamaz, ancak etkinli\u011fin art\u0131k aktif olmad\u0131\u011f\u0131n\u0131 varsaymal\u0131d\u0131r. Uygulaman\u0131z\u0131n dahili durumunu da buna g\u00f6re g\u00fcncellemeyi unutmamal\u0131s\u0131n\u0131z.<\/p>\n<\/li>\n<\/ul>\n<p>#iOSGeli\u015ftirme #Canl\u0131Etkinlikler #LiveActivities #Pomodoro #SwiftUI #AppleGeli\u015ftirici #MobilUygulama<\/p>\n","protected":false},"excerpt":{"rendered":"Modern mobil uygulama geli\u015ftirmenin dinamik d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n dikkatini \u00e7ekmek ve etkile\u015fimde kalmas\u0131n\u0131 sa\u011flamak her zamankinden daha \u00f6nemli.","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-42882","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>Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri\" \/>\n<meta property=\"og:description\" content=\"Modern mobil uygulama geli\u015ftirmenin dinamik d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n dikkatini \u00e7ekmek ve etkile\u015fimde kalmas\u0131n\u0131 sa\u011flamak her zamankinden daha \u00f6nemli.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-27T06:11:11+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri\",\"datePublished\":\"2026-06-27T06:11:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\"},\"wordCount\":3528,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\",\"name\":\"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-27T06:11:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri\"}]},{\"@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":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri","og_description":"Modern mobil uygulama geli\u015ftirmenin dinamik d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n dikkatini \u00e7ekmek ve etkile\u015fimde kalmas\u0131n\u0131 sa\u011flamak her zamankinden daha \u00f6nemli.","og_url":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-27T06:11:11+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri","datePublished":"2026-06-27T06:11:11+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/"},"wordCount":3528,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/","url":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/","name":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-27T06:11:11+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pomodoro-zamanlayiciniza-canli-etkinlikler-ekleme-dokumantasyonun-soylemedikleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Pomodoro Zamanlay\u0131c\u0131n\u0131za Canl\u0131 Etkinlikler Ekleme: Dok\u00fcmantasyonun S\u00f6ylemedikleri"}]},{"@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\/42882","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=42882"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42882\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}