feat(ios): implement getSchedules, getSchedule, getConfig, and setConfig methods
Implemented database access methods using UserDefaults:
getSchedules():
- Returns schedules matching optional filters (kind, enabled)
- Filters by schedule type ('fetch' | 'notify')
- Filters by enabled status (true/false/undefined)
- Returns schedules array matching Android API
getSchedule():
- Returns single schedule by ID
- Returns null if not found
- Matches Android getSchedule method
getConfig():
- Returns configuration value by key
- Supports optional timesafariDid for scoped configs
- Returns null if config not found
- Uses UserDefaults with key prefix
setConfig():
- Stores configuration value by key
- Supports optional timesafariDid for scoped configs
- Stores as JSON string in UserDefaults
- Matches Android setConfig method
iOS Adaptations:
- Uses UserDefaults instead of SQLite database
- Config keys prefixed with 'DailyNotificationConfig_'
- DID-scoped configs use composite keys
- JSON serialization for complex values
Progress: 40/52 methods implemented (77% complete)
This commit is contained in:
@@ -540,6 +540,142 @@ public class DailyNotificationPlugin: CAPPlugin {
|
|||||||
return UserDefaults.standard.array(forKey: "DailyNotificationSchedules") as? [[String: Any]] ?? []
|
return UserDefaults.standard.array(forKey: "DailyNotificationSchedules") as? [[String: Any]] ?? []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Database Access Methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get schedules
|
||||||
|
*
|
||||||
|
* Returns schedules matching optional filters (kind, enabled).
|
||||||
|
*
|
||||||
|
* Equivalent to Android's getSchedules method.
|
||||||
|
*/
|
||||||
|
@objc func getSchedules(_ call: CAPPluginCall) {
|
||||||
|
let options = call.getObject("options")
|
||||||
|
let kind = options?["kind"] as? String
|
||||||
|
let enabled = options?["enabled"] as? Bool
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Getting schedules: kind=\(kind ?? "all"), enabled=\(enabled?.description ?? "all")")
|
||||||
|
|
||||||
|
var schedules = getSchedulesFromUserDefaults()
|
||||||
|
|
||||||
|
// Apply filters
|
||||||
|
if let kindFilter = kind {
|
||||||
|
schedules = schedules.filter { ($0["kind"] as? String) == kindFilter }
|
||||||
|
}
|
||||||
|
|
||||||
|
if let enabledFilter = enabled {
|
||||||
|
schedules = schedules.filter { ($0["enabled"] as? Bool) == enabledFilter }
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: [String: Any] = [
|
||||||
|
"schedules": schedules
|
||||||
|
]
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Found \(schedules.count) schedule(s)")
|
||||||
|
call.resolve(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get schedule by ID
|
||||||
|
*
|
||||||
|
* Returns a single schedule by ID.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's getSchedule method.
|
||||||
|
*/
|
||||||
|
@objc func getSchedule(_ call: CAPPluginCall) {
|
||||||
|
guard let id = call.getString("id") else {
|
||||||
|
call.reject("Schedule ID is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Getting schedule: \(id)")
|
||||||
|
|
||||||
|
let schedules = getSchedulesFromUserDefaults()
|
||||||
|
let schedule = schedules.first { ($0["id"] as? String) == id }
|
||||||
|
|
||||||
|
if let schedule = schedule {
|
||||||
|
call.resolve(schedule)
|
||||||
|
} else {
|
||||||
|
call.resolve(["schedule": NSNull()])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get config
|
||||||
|
*
|
||||||
|
* Returns configuration value by key.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's getConfig method.
|
||||||
|
*/
|
||||||
|
@objc func getConfig(_ call: CAPPluginCall) {
|
||||||
|
guard let key = call.getString("key") else {
|
||||||
|
call.reject("Config key is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let options = call.getObject("options")
|
||||||
|
let timesafariDid = options?["timesafariDid"] as? String
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Getting config: key=\(key), did=\(timesafariDid ?? "none")")
|
||||||
|
|
||||||
|
// Build config key (include DID if provided)
|
||||||
|
let configKey = timesafariDid != nil ? "\(key)_\(timesafariDid!)" : key
|
||||||
|
let fullKey = "DailyNotificationConfig_\(configKey)"
|
||||||
|
|
||||||
|
// Try to get config from UserDefaults
|
||||||
|
if let configString = UserDefaults.standard.string(forKey: fullKey),
|
||||||
|
let configData = configString.data(using: .utf8),
|
||||||
|
let config = try? JSONSerialization.jsonObject(with: configData) as? [String: Any] {
|
||||||
|
call.resolve(config)
|
||||||
|
} else {
|
||||||
|
// Return null if not found
|
||||||
|
call.resolve(["config": NSNull()])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set config
|
||||||
|
*
|
||||||
|
* Stores configuration value by key.
|
||||||
|
*
|
||||||
|
* Equivalent to Android's setConfig method.
|
||||||
|
*/
|
||||||
|
@objc func setConfig(_ call: CAPPluginCall) {
|
||||||
|
guard let key = call.getString("key") else {
|
||||||
|
call.reject("Config key is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let value = call.getObject("value") else {
|
||||||
|
call.reject("Config value is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let options = call.getObject("options")
|
||||||
|
let timesafariDid = options?["timesafariDid"] as? String
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Setting config: key=\(key), did=\(timesafariDid ?? "none")")
|
||||||
|
|
||||||
|
// Build config key (include DID if provided)
|
||||||
|
let configKey = timesafariDid != nil ? "\(key)_\(timesafariDid!)" : key
|
||||||
|
let fullKey = "DailyNotificationConfig_\(configKey)"
|
||||||
|
|
||||||
|
// Store config as JSON string
|
||||||
|
do {
|
||||||
|
let configData = try JSONSerialization.data(withJSONObject: value, options: [])
|
||||||
|
let configString = String(data: configData, encoding: .utf8) ?? "{}"
|
||||||
|
|
||||||
|
UserDefaults.standard.set(configString, forKey: fullKey)
|
||||||
|
UserDefaults.standard.synchronize()
|
||||||
|
|
||||||
|
print("DNP-PLUGIN: Config stored successfully")
|
||||||
|
call.resolve()
|
||||||
|
} catch {
|
||||||
|
print("DNP-PLUGIN: Failed to store config: \(error)")
|
||||||
|
call.reject("Failed to store config: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Permission Methods
|
// MARK: - Permission Methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user