≡ Menu

SwiftUi e le notifiche a tempo…

SwiftUI, il framework di sviluppo dell’interfaccia utente di Apple, ha semplificato la creazione di app iOS. In questo articolo, esploreremo un’applicazione SwiftUI che calcola un orario futuro in base ai valori di ore, minuti e secondi inseriti dall’utente, e invia una notifica al raggiungimento di quel tempo.

La nostra applicazione avrà un’interfaccia utente semplice ma funzionale, che consiste in tre campi di testo per l’input dell’utente (ore, minuti e secondi), un pulsante per avviare il calcolo dell’orario futuro e un campo di testo per visualizzare l’orario calcolato.

Inoltre, una volta raggiunto l’orario futuro calcolato, l’app invierà una notifica al dispositivo, riproducendo il suono di notifica predefinito del sistema.

ContentView

ContentView è la view principale dell’app. Contiene l’interfaccia utente e la logica per calcolare l’orario futuro.

I campi di testo TextField per le ore, i minuti e i secondi sono associati a variabili di stato (hours, minutes, seconds). Grazie al binding in SwiftUI, ogni modifica ai TextField viene automaticamente riflessa nelle rispettive variabili.

Il pulsante “Calcola Orario”, al click, avvia la funzione addTime(), che gestisce il calcolo dell’orario futuro e la programmazione della notifica.

Infine, l’orario futuro calcolato viene visualizzato in un elemento Text.

addTime()

La funzione addTime() gestisce il calcolo dell’orario futuro. Prima di tutto, estrae i valori dalle variabili di stato e li converte in interi. Se nessun valore viene inserito, imposta un valore di default di 0 per le ore e i minuti, e 1 per i secondi.

Successivamente, utilizza questi valori per calcolare l’orario futuro, aggiungendoli all’orario corrente. Infine, formatta l’orario futuro in una stringa e lo assegna a futureTime.

La funzione addTime() chiama anche scheduleNotification(), passando l’orario futuro, per programmare la notifica.

requestNotificationPermission()

All’avvio dell’app, viene richiesta l’autorizzazione per inviare notifiche. Questo viene gestito da requestNotificationPermission().

scheduleNotification()

La funzione scheduleNotification() gestisce la creazione e la programmazione della notifica.

Crea un UNMutableNotificationContent, che rappresenta il contenuto della notifica, e imposta il titolo e il suono della notifica.

Crea un UNTimeIntervalNotificationTrigger che farà scattare la notifica all’orario futuro, e infine aggiunge la richiesta di notifica al UNUserNotificationCenter.

Di seguito si riporta il codice completo per la App

import SwiftUI
import UserNotifications
struct ContentView: View {
    @State private var hours: String = ""
    @State private var minutes: String = ""
    @State private var seconds: String = ""
    @State private var futureTime: String = ""
    var body: some View {
        VStack {
            Text("Inserisci ore, minuti e secondi:")
            TextField("Ore", text: $hours)
                .keyboardType(.numberPad)
                .padding()
            TextField("Minuti", text: $minutes)
                .keyboardType(.numberPad)
                .padding()
            TextField("Secondi", text: $seconds)
                .keyboardType(.numberPad)
                .padding()
            Button(action: {
                addTime()
            }) {
                Text("Calcola Orario Futuro")
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
            }
            Text("Orario futuro: \(futureTime)")
                .font(.system(size: 12))
                .fontWeight(.bold)
                .padding()
        }
        .padding()
        .onAppear(perform: {
            requestNotificationPermission()
        })
    }
    func addTime() {
        let h = Int(self.hours) ?? 0
        let m = Int(self.minutes) ?? 0
        var s = Int(self.seconds) ?? 0
        if h == 0 && m == 0 && s == 0 {
            s = 1
        }
        let currentTime = Date()
        let future = Calendar.current.date(byAdding: .hour, value: h, to: currentTime)
        let future1 = Calendar.current.date(byAdding: .minute, value: m, to: future ?? currentTime)
        let futureDate = Calendar.current.date(byAdding: .second, value: s, to: future1 ?? currentTime) ?? Date()
        let formatter = DateFormatter()
        formatter.dateStyle = .none
        formatter.timeStyle = .medium
        futureTime = formatter.string(from: futureDate)
        scheduleNotification(futureDate)
    }
    func requestNotificationPermission() {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { success, error in
            if success {
                print("All set!")
            } else if let error = error {
                print(error.localizedDescription)
            }
        }
    }
    func scheduleNotification(_ date: Date) {
        let content = UNMutableNotificationContent()
        content.title = "Alert Time!"
        content.sound = UNNotificationSound.default
        let interval = date.timeIntervalSince(Date())
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: interval, repeats: false)
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request)
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

{ 0 comments… add one }

Rispondi