CocoaPods trunk is moving to be read-only. Read more on the blog, there are 2 months to go.

NobetciEczaneApi 1.0.0

NobetciEczaneApi 1.0.0

Maintained by Mehmet Erdoğan.



  • By
  • Mehmet Erdoğan

🏥 NobetciEczaneApi — Swift / iOS SDK

Swift 5.9 | 6.0 Platforms License: MIT API Version

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.


📦 Kurulum

1. Swift Package Manager (SPM) — Önerilen

Xcode projenize eklemek için:

  1. Xcode menüsünden File > Add Package Dependencies... seçeneğini açın.
  2. Arama kutusuna repo URL'ini yapıştırın:
    https://github.com/mehmeterdogan/nobetci-eczane-api-swift.git
    
  3. Versiyon kuralını Up to Next Major Version: 1.0.0 olarak 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")
]

2. CocoaPods

Podfile dosyanıza ekleyin:

pod 'NobetciEczaneApi', '~> 1.0.0'

Ardından terminalden çalıştırın:

pod install

🚀 Hızlı Başlangıç & Kullanım Örnekleri

1. İstemciyi Başlatma

import NobetciEczaneApi

let client = NobetciEczaneClient(apiKey: "API_KEY_BURAYA")

2. Türkiye Genelindeki Nöbetçi Eczaneleri Getirme

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)")
    }
}

3. İl ve İlçeye Göre Nöbetçi Eczaneleri Getirme

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)")
    }
}

4. GPS Konumuna Göre En Yakın Nöbetçi Eczaneler (CoreLocation Entegrasyonu)

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)")
    }
}

5. SwiftUI Örnek Görünümü

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
    }
}

🛠️ Desteklenen Tüm Metotlar

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.

🛡️ Hata Yönetimi (NobetciEczaneError)

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)")
}

📄 Lisans & Destek

Bu proje MIT Lisansı ile lisanslanmıştır.