Uygulama Mimarisi

EzanPlus dört ana modülden oluşuyor: namaz vakitleri, kıble pusulası, tesbih sayacı ve bağış. Tüm modüller HTML + CSS + Vanilla JS ile geliştirildi ve Capacitor.js ile Android APK'ya dönüştürüldü.

4
Modül
GPS
Konum
AdMob
Reklam
Android
Platform

GPS ile Namaz Vakti Hesabı

Namaz vakitleri enlem/boylam bilgisine göre hesaplanıyor. Harici bir API'ye bağımlı kalmamak için hesaplama algoritmasını doğrudan uygulamaya gömdüm.

function getPrayerTimes(lat, lng, date) { const jDate = julianDate(date); const decl = sunDeclination(jDate); const eqTime = equationOfTime(jDate); const times = {}; ["fajr", "sunrise", "dhuhr", "asr", "maghrib", "isha"].forEach(prayer => { times[prayer] = calcPrayerTime(prayer, lat, decl, eqTime, jDate); }); // UTC'den yerel saate çevir const offset = new Date().getTimezoneOffset() / -60; Object.keys(times).forEach(k => { times[k] = (times[k] + offset + 24) % 24; }); return times; }

Ezan Bildirimleri

Android'de yerel bildirimler için Capacitor Local Notifications eklentisi kullanıldı. Her gün için 5 vakit bildirimi önceden programlanıyor.

import { LocalNotifications } from "@capacitor/local-notifications"; async function schedulePrayerNotifications(times) { await LocalNotifications.requestPermissions(); const notifications = Object.entries(times).map(([prayer, time], i) => { const [h, m] = parseTime(time); const date = new Date(); date.setHours(h, m, 0, 0); if (date < new Date()) date.setDate(date.getDate() + 1); return { id: i + 1, title: PRAYER_NAMES[prayer], body: `${time} — Namaz vakti`, schedule: { at: date, allowWhileIdle: true }, sound: "ezan.wav", smallIcon: "ic_stat_ezan" }; }); await LocalNotifications.schedule({ notifications }); }

Kıble Pusulası

Manyetometre verisi DeviceOrientationEvent ile alınıyor. Kabe'nin koordinatlarına (21.4225°K, 39.8262°D) göre açı hesaplanıyor ve canvas'ta pusula çiziliyor.

function getQiblaAngle(lat, lng) { const kaabaLat = 21.4225 * Math.PI / 180; const kaabaLng = 39.8262 * Math.PI / 180; const userLat = lat * Math.PI / 180; const dLng = kaabaLng - (lng * Math.PI / 180); const y = Math.sin(dLng); const x = Math.cos(userLat) * Math.tan(kaabaLat) - Math.sin(userLat) * Math.cos(dLng); return (Math.atan2(y, x) * 180 / Math.PI + 360) % 360; } window.addEventListener("deviceorientation", (e) => { const compass = e.webkitCompassHeading || (360 - e.alpha); const qiblaAngle = getQiblaAngle(userLat, userLng); const rotation = qiblaAngle - compass; compassNeedle.style.transform = `rotate(${rotation}deg)`; });

Bağış Modülü

Bağış bölümü doğrudan ödeme almıyor — kullanıcıları güvenilir kuruluşların sayfalarına yönlendiriyor. Bu hem yasal riski sıfıra indiriyor hem de kullanıcı güvenini artırıyor.

AdMob Entegrasyonu

Banner reklam ana ekranın altında sabit, interstitial reklam uygulamayı açtıktan 30 saniye sonra bir kez gösteriliyor. Rewarded reklam tesbih sayacında bonus için kullanılıyor.

Play Store Hazırlığı

APK oluşturma için Capacitor + Android Studio pipeline: