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ü.
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:
- npx cap sync android — web dosyalarını Android projesine kopyala
- Android Studio'da Build → Generate Signed Bundle
- Play Console'a AAB (Android App Bundle) yükle
- İç test → Kapalı test → Üretim aşamalı yayın