tauri-plugin-widgets 0.3.0

A Tauri plugin to interact with App Widgets on Android, iOS, and macOS (WidgetKit). On Windows/Linux a desktop-widget window approach is supported.
import Foundation
#if canImport(WidgetKit)
import WidgetKit
#endif

@_cdecl("macos_widget_reload_all")
public func macosWidgetReloadAll() -> Bool {
    #if canImport(WidgetKit)
    if #available(macOS 11.0, *) {
        WidgetCenter.shared.reloadAllTimelines()
        return true
    }
    #endif
    return false
}

@_cdecl("macos_widget_reload_kind")
public func macosWidgetReloadKind(_ kind: UnsafePointer<CChar>) -> Bool {
    #if canImport(WidgetKit)
    if #available(macOS 11.0, *) {
        WidgetCenter.shared.reloadTimelines(ofKind: String(cString: kind))
        return true
    }
    #endif
    return false
}

@_cdecl("macos_widget_container_path")
public func macosWidgetContainerPath(_ groupId: UnsafePointer<CChar>) -> UnsafeMutablePointer<CChar>? {
    let group = String(cString: groupId)
    guard let url = FileManager.default.containerURL(
        forSecurityApplicationGroupIdentifier: group
    ) else {
        return nil
    }
    return strdup(url.path)
}

@_cdecl("macos_widget_free_string")
public func macosWidgetFreeString(_ ptr: UnsafeMutablePointer<CChar>?) {
    free(ptr)
}

@_cdecl("macos_widget_set_defaults")
public func macosWidgetSetDefaults(
    _ groupId: UnsafePointer<CChar>,
    _ key: UnsafePointer<CChar>,
    _ value: UnsafePointer<CChar>
) -> Bool {
    let group = String(cString: groupId)
    let k = String(cString: key)
    let v = String(cString: value)
    guard let defaults = UserDefaults(suiteName: group) else { return false }

    var map = defaults.dictionary(forKey: "widget_data") as? [String: String] ?? [:]
    map[k] = v
    defaults.set(map, forKey: "widget_data")
    defaults.synchronize()
    return true
}