From c0314abbf7587503d0b4ed94a123073d9dbaf407 Mon Sep 17 00:00:00 2001 From: VincentMeilinger Date: Thu, 11 Jan 2024 21:28:12 +0100 Subject: [PATCH] Timer push notifications --- .../UserInterfaceState.xcuserstate | Bin 57494 -> 59469 bytes .../Localizable.xcstrings | 6 - .../Views/TimerView.swift | 104 +++++++++++++----- 3 files changed, 76 insertions(+), 34 deletions(-) diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate b/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate index b54284553c9393faf96ef6462939a4ca2ae30aab..7516e11ca8f44057e1924d29d6220c1dd3fb6f17 100644 GIT binary patch literal 59469 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 z%0D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 Y_x^wE&ypqoyVlPC&jS7bnfvGe0E)*tS^xk5 delta 27610 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 diff --git a/Nextcloud Cookbook iOS Client/Localizable.xcstrings b/Nextcloud Cookbook iOS Client/Localizable.xcstrings index 2b795e2..4454279 100644 --- a/Nextcloud Cookbook iOS Client/Localizable.xcstrings +++ b/Nextcloud Cookbook iOS Client/Localizable.xcstrings @@ -2853,9 +2853,6 @@ } } } - }, - "Timer alert!" : { - }, "Title" : { "localizations" : { @@ -3164,9 +3161,6 @@ } } } - }, - "Your timer is expired!" : { - } }, "version" : "1.0" diff --git a/Nextcloud Cookbook iOS Client/Views/TimerView.swift b/Nextcloud Cookbook iOS Client/Views/TimerView.swift index aa89f2b..5b23f5c 100644 --- a/Nextcloud Cookbook iOS Client/Views/TimerView.swift +++ b/Nextcloud Cookbook iOS Client/Views/TimerView.swift @@ -9,12 +9,11 @@ import Foundation import SwiftUI import Combine import AVFoundation +import UserNotifications struct TimerView: View { @ObservedObject var timer: RecipeTimer - @State var audioPlayer: AVAudioPlayer? - @State var presentTimerAlert: Bool = false var body: some View { HStack { @@ -59,31 +58,6 @@ struct TimerView: View { RoundedRectangle(cornerRadius: 20) .foregroundStyle(.ultraThickMaterial) } - .alert("Timer alert!", isPresented: $timer.timerExpired) { - Button { - timer.timerExpired = false - audioPlayer?.stop() - } label: { - Text("Your timer is expired!") - } - .onAppear { - playSound() - } - } - } - - func playSound() { - if let path = Bundle.main.path(forResource: "alarm_sound_0", ofType: "mp3") { - do { - audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path)) - audioPlayer?.prepareToPlay() - } catch { - // Handle the error - print("Error loading sound file.") - return - } - } - audioPlayer?.play() } } @@ -99,6 +73,7 @@ class RecipeTimer: ObservableObject { @Published var timerExpired: Bool = false private var timer: Timer.TimerPublisher? private var timerCancellable: Cancellable? + var audioPlayer: AVAudioPlayer? init(duration: DurationComponents) { self.duration = duration @@ -114,7 +89,12 @@ class RecipeTimer: ObservableObject { let pauseDuration = Date().timeIntervalSince(pauseDate) startDate = startDate?.addingTimeInterval(pauseDuration) } - + requestNotificationPermissions() + scheduleTimerNotification(timeInterval: timeTotal) + // Prepare audio session + setupAudioSession() + prepareAudioPlayer(with: "alarm_sound_0") + self.timer = Timer.publish(every: 1, on: .main, in: .common) self.timerCancellable = self.timer?.autoconnect().sink { [weak self] _ in DispatchQueue.main.async { @@ -128,6 +108,8 @@ class RecipeTimer: ObservableObject { self.timeElapsed = self.timeTotal self.duration.fromSeconds(Int(self.timeTotal - self.timeElapsed)) self.pause() + + self.startAlarm() } } } @@ -158,3 +140,69 @@ class RecipeTimer: ObservableObject { self.duration.fromSeconds(Int(timeTotal)) } } + +extension RecipeTimer { + func setupAudioSession() { + do { + try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default) + try AVAudioSession.sharedInstance().setActive(true) + } catch { + print("Failed to set audio session category. Error: \(error)") + } + } + + func prepareAudioPlayer(with soundName: String) { + if let soundURL = Bundle.main.url(forResource: "alarm_sound_0", withExtension: "mp3") { + do { + audioPlayer = try AVAudioPlayer(contentsOf: soundURL) + audioPlayer?.prepareToPlay() + audioPlayer?.numberOfLoops = -1 // Loop indefinitely + } catch { + print("Error loading sound file: \(error)") + } + } + } + + func postNotification() { + NotificationCenter.default.post(name: Notification.Name("AlarmNotification"), object: nil) + } + + func startAlarm() { + audioPlayer?.play() + postNotification() + } + + func stopAlarm() { + audioPlayer?.stop() + try? AVAudioSession.sharedInstance().setActive(false) + } + + // ===================================== ALTERNATIVE + + func requestNotificationPermissions() { + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in + if granted { + print("Notification permission granted.") + } else if let error = error { + print("Notification permission denied because: \(error.localizedDescription).") + } + } + } + + func scheduleTimerNotification(timeInterval: TimeInterval) { + let content = UNMutableNotificationContent() + content.title = "Timer Finished" + content.body = "Your timer is up!" + content.sound = UNNotificationSound.default + + let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeInterval, repeats: false) + + let request = UNNotificationRequest(identifier: "timerNotification", content: content, trigger: trigger) + + UNUserNotificationCenter.current().add(request) { error in + if let error = error { + print("Error scheduling notification: \(error)") + } + } + } +}