Eczaneler.ORG v2 REST API için geliştirilmiş resmi Swift ve iOS SDK kütüphanesidir. Türkiye'nin 81 ili ve KKTC genelindeki tüm nöbetçi eczaneleri, il/ilçe sorgularını ve GPS koordinat bazlı en yakın nöbetçi eczane verilerini modern async/await mimarisiyle saniyeler içinde uygulamanıza entegre etmenizi sağlar.
Xcode projenize eklemek için:
- Xcode menüsünden File > Add Package Dependencies... seçeneğini açın.
- Arama kutusuna repo URL'ini yapıştırın:
https://github.com/mehmeterdogan/nobetci-eczane-api-swift.git - Versiyon kuralını
Up to Next Major Version: 1.0.0olarak belirleyin ve Add Package butonuna tıklayın.
Ya da Package.swift dosyanıza doğrudan bağımlılık olarak ekleyin:
dependencies: [
.package(url: "https://github.com/mehmeterdogan/nobetci-eczane-api-swift.git", from: "1.0.0")
]Podfile dosyanıza ekleyin:
pod 'NobetciEczaneApi', '~> 1.0.0'Ardından terminalden çalıştırın:
pod installimport NobetciEczaneApi
let client = NobetciEczaneClient(apiKey: "API_KEY_BURAYA")Task {
do {
let response = try await client.getSentryPharmacies(page: 1, limit: 25)
if let pharmacies = response.data {
for pharmacy in pharmacies {
print("Eczane: \(pharmacy.name) - \(pharmacy.cityName ?? "") / \(pharmacy.districtName ?? "")")
print("Telefon: \(pharmacy.phone ?? "Yok") - Adres: \(pharmacy.address ?? "")")
}
}
} catch {
print("Hata oluştu: \(error.localizedDescription)")
}
}Task {
do {
// İstanbul (34) genelindeki nöbetçi eczaneler
let istanbulResponse = try await client.getSentryByCity(cityId: 34)
// İstanbul / Kadıköy (440) nöbetçi eczaneleri
let kadikoyResponse = try await client.getSentryByDistrict(cityId: 34, districtId: 440)
kadikoyResponse.data?.forEach { pharmacy in
print("[\(pharmacy.name)] Adres: \(pharmacy.address ?? "")")
}
} catch {
print("Hata: \(error)")
}
}import CoreLocation
import NobetciEczaneApi
func findNearestPharmacies(location: CLLocation) async {
do {
let response = try await client.getNearbyPharmacies(
latitude: location.coordinate.latitude,
longitude: location.coordinate.longitude,
isSentry: true,
limit: 10
)
response.data?.forEach { pharmacy in
let distanceStr = pharmacy.distanceKm != nil ? "\(pharmacy.distanceKm!) km" : ""
print("🏥 \(pharmacy.name) (\(distanceStr)) - \(pharmacy.address ?? "")")
}
} catch {
print("Konum bazlı arama hatası: \(error)")
}
}import SwiftUI
import NobetciEczaneApi
struct SentryPharmacyListView: View {
@State private var pharmacies: [Pharmacy] = []
@State private var isLoading = false
@State private var errorMessage: String?
private let client = NobetciEczaneClient(apiKey: "API_ANAHTARINIZ")
var body: some View {
NavigationStack {
List(pharmacies) { pharmacy in
VStack(alignment: .leading, spacing: 6) {
HStack {
Text(pharmacy.name)
.font(.headline)
Spacer()
if pharmacy.isSentry {
Text("NÖBETÇİ")
.font(.caption2.bold())
.padding(.horizontal, 6)
.padding(.vertical, 2)
.background(Color.red.opacity(0.15))
.foregroundColor(.red)
.cornerRadius(4)
}
}
if let address = pharmacy.address {
Text(address)
.font(.subheadline)
.foregroundColor(.secondary)
}
if let phone = pharmacy.phone {
Link(destination: URL(string: "tel:\(phone)")!) {
Label(phone, systemImage: "phone.fill")
.font(.footnote)
}
}
}
.padding(.vertical, 4)
}
.navigationTitle("Nöbetçi Eczaneler")
.overlay {
if isLoading {
ProgressView("Eczaneler yükleniyor...")
} else if let error = errorMessage {
Text(error).foregroundColor(.red).padding()
}
}
.task {
await loadPharmacies()
}
.refreshable {
await loadPharmacies()
}
}
}
private func loadPharmacies() async {
isLoading = true
errorMessage = nil
do {
let response = try await client.getSentryByCity(cityId: 34)
pharmacies = response.data ?? []
} catch {
errorMessage = error.localizedDescription
}
isLoading = false
}
}| Metot | Açıklama |
|---|---|
getSentryPharmacies(page:limit:) |
Tüm nöbetçi eczaneleri sayfalı listeler. |
getSentryByCity(cityId:limit:) |
Belirli bir ildeki nöbetçi eczaneleri getirir. |
getSentryByDistrict(cityId:districtId:limit:) |
Belirli il ve ilçedeki nöbetçi eczaneleri getirir. |
getNearbyPharmacies(latitude:longitude:isSentry:limit:) |
Koordinat bazlı en yakın eczaneleri listeler. |
getCities() |
81 il ve KKTC il listesini getirir. |
getDistricts(cityId:) |
Seçilen ilin ilçe listesini getirir. |
getAccountInfo() |
API kota ve lisans kalan gün bilgisini döner. |
updateWhitelist(ips:) |
Güvenlik için izinli IP adreslerini günceller. |
getAllPharmacies(page:limit:) |
[Premium] Tüm eczane arşivini sayfalı getirir. |
getCityPharmacies(cityId:limit:) |
[Premium] İldeki tüm eczaneleri getirir. |
getDistrictPharmacies(cityId:districtId:limit:) |
[Premium] İlçedeki tüm eczaneleri getirir. |
Tüm API çağrıları tip güvenli hata modelleri döndürür:
do {
let result = try await client.getSentryPharmacies()
} catch NobetciEczaneError.authenticationError(let msg) {
print("401 Yetkilendirme Hatası: \(msg)")
} catch NobetciEczaneError.rateLimitError(let msg) {
print("429 İstek Limiti Aşıldı: \(msg)")
} catch NobetciEczaneError.validationError(let msg) {
print("400/422 Doğrulama Hatası: \(msg)")
} catch NobetciEczaneError.networkError(let error) {
print("Ağ Bağlantı Hatası: \(error)")
} catch {
print("Beklenmeyen Hata: \(error)")
}Bu proje MIT Lisansı ile lisanslanmıştır.
- Web Sitesi: https://eczaneler.org
- API Dokümantasyonu: https://eczaneler.org/nobetci-eczane-api
- Destek / İletişim: [email protected] & Telegram