feat(ios): implement isAlarmScheduled, getNextAlarmTime, and testAlarm methods
Implemented alarm status and testing methods matching Android functionality: isAlarmScheduled(): - Checks if notification is scheduled for given trigger time - Searches pending notifications for matching trigger date - Uses 1-minute tolerance for time comparison - Returns scheduled status and triggerAtMillis getNextAlarmTime(): - Gets the next scheduled notification time - Finds earliest scheduled daily notification - Returns scheduled status and triggerAtMillis (or just scheduled: false) testAlarm(): - Schedules test notification for testing purposes - Defaults to 5 seconds from now (configurable) - Creates test notification with title and body - Returns scheduled status, secondsFromNow, and triggerAtMillis - Useful for verifying notification delivery works iOS Adaptations: - Uses UNCalendarNotificationTrigger for scheduling - Searches pending notifications to check status - Date component matching for precise scheduling Progress: 30/52 methods implemented (58% complete)
This commit is contained in:
@@ -1131,6 +1131,153 @@ public class DailyNotificationPlugin: CAPPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Alarm Status Methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if alarm is scheduled
|
||||||
|
*
|
||||||
|
* Checks if a notification is scheduled for the given trigger time.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's isAlarmScheduled method.
|
||||||
|
*/
|
||||||
|
@objc func isAlarmScheduled(_ call: CAPPluginCall) {
|
||||||
|
guard let options = call.options else {
|
||||||
|
call.reject("Options are required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let triggerAtMillis = options["triggerAtMillis"] as? Int64 else {
|
||||||
|
call.reject("triggerAtMillis is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let triggerAt = Date(timeIntervalSince1970: TimeInterval(triggerAtMillis) / 1000.0)
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Checking alarm status: triggerAt=\(triggerAt)")
|
||||||
|
|
||||||
|
// Check if notification exists for this time
|
||||||
|
notificationCenter.getPendingNotificationRequests { requests in
|
||||||
|
let dailyNotifications = requests.filter { $0.identifier.hasPrefix("daily_") }
|
||||||
|
|
||||||
|
// Check if any notification matches the trigger time
|
||||||
|
var isScheduled = false
|
||||||
|
for notification in dailyNotifications {
|
||||||
|
if let trigger = notification.trigger as? UNCalendarNotificationTrigger,
|
||||||
|
let nextTriggerDate = trigger.nextTriggerDate() {
|
||||||
|
// Compare dates (within 1 minute tolerance)
|
||||||
|
if abs(nextTriggerDate.timeIntervalSince(triggerAt)) < 60 {
|
||||||
|
isScheduled = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: [String: Any] = [
|
||||||
|
"scheduled": isScheduled,
|
||||||
|
"triggerAtMillis": triggerAtMillis
|
||||||
|
]
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Alarm status: scheduled=\(isScheduled), triggerAt=\(triggerAtMillis)")
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
call.resolve(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next alarm time
|
||||||
|
*
|
||||||
|
* Returns the next scheduled notification time.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's getNextAlarmTime method.
|
||||||
|
*/
|
||||||
|
@objc func getNextAlarmTime(_ call: CAPPluginCall) {
|
||||||
|
print("DNP-PLUGIN: Getting next alarm time")
|
||||||
|
|
||||||
|
notificationCenter.getPendingNotificationRequests { requests in
|
||||||
|
let dailyNotifications = requests.filter { $0.identifier.hasPrefix("daily_") }
|
||||||
|
|
||||||
|
var nextAlarmTime: TimeInterval? = nil
|
||||||
|
|
||||||
|
// Find the earliest scheduled notification
|
||||||
|
for notification in dailyNotifications {
|
||||||
|
if let trigger = notification.trigger as? UNCalendarNotificationTrigger,
|
||||||
|
let nextTriggerDate = trigger.nextTriggerDate() {
|
||||||
|
let triggerTime = nextTriggerDate.timeIntervalSince1970 * 1000
|
||||||
|
if nextAlarmTime == nil || triggerTime < nextAlarmTime! {
|
||||||
|
nextAlarmTime = triggerTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: [String: Any]
|
||||||
|
if let nextTime = nextAlarmTime {
|
||||||
|
result = [
|
||||||
|
"scheduled": true,
|
||||||
|
"triggerAtMillis": Int64(nextTime)
|
||||||
|
]
|
||||||
|
print("DNP-PLUGIN: Next alarm time: \(nextTime)")
|
||||||
|
} else {
|
||||||
|
result = [
|
||||||
|
"scheduled": false
|
||||||
|
]
|
||||||
|
print("DNP-PLUGIN: No alarm scheduled")
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
call.resolve(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test alarm
|
||||||
|
*
|
||||||
|
* Schedules a test notification to fire in a few seconds.
|
||||||
|
* Useful for verifying notification delivery works correctly.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's testAlarm method.
|
||||||
|
*/
|
||||||
|
@objc func testAlarm(_ call: CAPPluginCall) {
|
||||||
|
let options = call.options
|
||||||
|
let secondsFromNow = (options?["secondsFromNow"] as? Int) ?? 5
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: TEST: Scheduling test alarm in \(secondsFromNow) seconds")
|
||||||
|
|
||||||
|
// Create test notification
|
||||||
|
let content = UNMutableNotificationContent()
|
||||||
|
content.title = "Test Notification"
|
||||||
|
content.body = "This is a test notification scheduled \(secondsFromNow) seconds from now"
|
||||||
|
content.sound = .default
|
||||||
|
|
||||||
|
// Schedule for secondsFromNow seconds in the future
|
||||||
|
let triggerDate = Date().addingTimeInterval(TimeInterval(secondsFromNow))
|
||||||
|
let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: triggerDate)
|
||||||
|
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
|
||||||
|
|
||||||
|
let identifier = "test_alarm_\(Date().timeIntervalSince1970)"
|
||||||
|
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
|
||||||
|
|
||||||
|
notificationCenter.add(request) { error in
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let error = error {
|
||||||
|
print("DNP-PLUGIN: Failed to schedule test alarm: \(error)")
|
||||||
|
call.reject("Failed to schedule test alarm: \(error.localizedDescription)")
|
||||||
|
} else {
|
||||||
|
let triggerAtMillis = Int64(Date().addingTimeInterval(TimeInterval(secondsFromNow)).timeIntervalSince1970 * 1000)
|
||||||
|
let result: [String: Any] = [
|
||||||
|
"scheduled": true,
|
||||||
|
"secondsFromNow": secondsFromNow,
|
||||||
|
"triggerAtMillis": triggerAtMillis
|
||||||
|
]
|
||||||
|
print("DNP-PLUGIN: Test alarm scheduled successfully")
|
||||||
|
call.resolve(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Private Implementation Methods
|
// MARK: - Private Implementation Methods
|
||||||
|
|
||||||
private func setupBackgroundTasks() {
|
private func setupBackgroundTasks() {
|
||||||
|
|||||||
Reference in New Issue
Block a user