feat(ios): implement createSchedule, updateSchedule, deleteSchedule, and enableSchedule methods

Implemented schedule CRUD methods using UserDefaults:

createSchedule():
- Creates new schedule with required kind field
- Auto-generates ID if not provided (kind_timestamp)
- Stores optional fields (cron, clockTime, jitterMs, backoffPolicy, stateJson)
- Adds to schedules array in UserDefaults
- Returns created schedule

updateSchedule():
- Updates existing schedule by ID
- Updates provided fields (enabled, cron, clockTime, jitterMs, backoffPolicy, stateJson, lastRunAt, nextRunAt)
- Returns updated schedule
- Rejects if schedule not found

deleteSchedule():
- Deletes schedule by ID from UserDefaults
- Removes from schedules array
- Rejects if schedule not found

enableSchedule():
- Enables or disables schedule by ID
- Updates enabled field in schedule
- Rejects if schedule not found

iOS Adaptations:
- Uses UserDefaults array instead of SQLite database
- In-memory array manipulation then persistence
- Maintains schedule structure matching Android

Progress: 44/52 methods implemented (85% complete)
This commit is contained in:
Matthew Raymer
2025-11-11 02:17:59 -08:00
parent 082a70f54f
commit be6cdc98d6

View File

@@ -676,6 +676,188 @@ public class DailyNotificationPlugin: CAPPlugin {
}
}
/**
* Create schedule
*
* Creates a new schedule and stores it in UserDefaults.
*
* Equivalent to Android's createSchedule method.
*/
@objc func createSchedule(_ call: CAPPluginCall) {
guard let scheduleJson = call.getObject("schedule") else {
call.reject("Schedule data is required")
return
}
guard let kind = scheduleJson["kind"] as? String else {
call.reject("Schedule kind is required")
return
}
// Generate ID if not provided
let id = scheduleJson["id"] as? String ?? "\(kind)_\(Int64(Date().timeIntervalSince1970 * 1000))"
print("DNP-PLUGIN: Creating schedule: id=\(id), kind=\(kind)")
// Build schedule dictionary
var schedule: [String: Any] = [
"id": id,
"kind": kind,
"enabled": scheduleJson["enabled"] as? Bool ?? true,
"createdAt": Int64(Date().timeIntervalSince1970 * 1000)
]
// Add optional fields
if let cron = scheduleJson["cron"] as? String {
schedule["cron"] = cron
}
if let clockTime = scheduleJson["clockTime"] as? String {
schedule["clockTime"] = clockTime
}
if let jitterMs = scheduleJson["jitterMs"] as? Int {
schedule["jitterMs"] = jitterMs
}
if let backoffPolicy = scheduleJson["backoffPolicy"] as? String {
schedule["backoffPolicy"] = backoffPolicy
}
if let stateJson = scheduleJson["stateJson"] as? String {
schedule["stateJson"] = stateJson
}
// Add to schedules array
var schedules = getSchedulesFromUserDefaults()
schedules.append(schedule)
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
UserDefaults.standard.synchronize()
print("DNP-PLUGIN: Schedule created successfully")
call.resolve(schedule)
}
/**
* Update schedule
*
* Updates an existing schedule in UserDefaults.
*
* Equivalent to Android's updateSchedule method.
*/
@objc func updateSchedule(_ call: CAPPluginCall) {
guard let id = call.getString("id") else {
call.reject("Schedule ID is required")
return
}
guard let updates = call.getObject("updates") else {
call.reject("Updates are required")
return
}
print("DNP-PLUGIN: Updating schedule: id=\(id)")
var schedules = getSchedulesFromUserDefaults()
guard let index = schedules.firstIndex(where: { ($0["id"] as? String) == id }) else {
call.reject("Schedule not found: \(id)")
return
}
// Update schedule fields
var schedule = schedules[index]
if let enabled = updates["enabled"] as? Bool {
schedule["enabled"] = enabled
}
if let cron = updates["cron"] as? String {
schedule["cron"] = cron
}
if let clockTime = updates["clockTime"] as? String {
schedule["clockTime"] = clockTime
}
if let jitterMs = updates["jitterMs"] as? Int {
schedule["jitterMs"] = jitterMs
}
if let backoffPolicy = updates["backoffPolicy"] as? String {
schedule["backoffPolicy"] = backoffPolicy
}
if let stateJson = updates["stateJson"] as? String {
schedule["stateJson"] = stateJson
}
if let lastRunAt = updates["lastRunAt"] as? Int64 {
schedule["lastRunAt"] = lastRunAt
}
if let nextRunAt = updates["nextRunAt"] as? Int64 {
schedule["nextRunAt"] = nextRunAt
}
schedules[index] = schedule
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
UserDefaults.standard.synchronize()
print("DNP-PLUGIN: Schedule updated successfully")
call.resolve(schedule)
}
/**
* Delete schedule
*
* Deletes a schedule from UserDefaults.
*
* Equivalent to Android's deleteSchedule method.
*/
@objc func deleteSchedule(_ call: CAPPluginCall) {
guard let id = call.getString("id") else {
call.reject("Schedule ID is required")
return
}
print("DNP-PLUGIN: Deleting schedule: id=\(id)")
var schedules = getSchedulesFromUserDefaults()
let initialCount = schedules.count
schedules.removeAll { ($0["id"] as? String) == id }
if schedules.count == initialCount {
call.reject("Schedule not found: \(id)")
return
}
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
UserDefaults.standard.synchronize()
print("DNP-PLUGIN: Schedule deleted successfully")
call.resolve()
}
/**
* Enable/disable schedule
*
* Enables or disables a schedule.
*
* Equivalent to Android's enableSchedule method.
*/
@objc func enableSchedule(_ call: CAPPluginCall) {
guard let id = call.getString("id") else {
call.reject("Schedule ID is required")
return
}
let enabled = call.getBool("enabled") ?? true
print("DNP-PLUGIN: Setting schedule enabled: id=\(id), enabled=\(enabled)")
var schedules = getSchedulesFromUserDefaults()
guard let index = schedules.firstIndex(where: { ($0["id"] as? String) == id }) else {
call.reject("Schedule not found: \(id)")
return
}
schedules[index]["enabled"] = enabled
UserDefaults.standard.set(schedules, forKey: "DailyNotificationSchedules")
UserDefaults.standard.synchronize()
print("DNP-PLUGIN: Schedule enabled status updated")
call.resolve()
}
// MARK: - Permission Methods
/**