import Foundation import React import WidgetKit /** * App Group 共享存储(RN Bridge) * * 约定: * - suiteName:group.com.damer.mindfulness(已在主 App 与 Widget Extension 的 entitlements 配置) * - 值统一使用字符串(通常是 JSON),由 JS 侧负责序列化与反序列化 */ @objc(AppGroupStorage) final class AppGroupStorage: NSObject { // 通过 AppGroupStorageBridge.m 的 RCT_EXTERN_MODULE 导出到 RN // 这里不需要显式实现/遵循 RCTBridgeModule,避免某些 Archive 场景下找不到协议类型 @objc static func requiresMainQueueSetup() -> Bool { false } private let suiteName = "group.com.damer.mindfulness" private func defaults() -> UserDefaults? { UserDefaults(suiteName: suiteName) } @objc(setString:value:resolver:rejecter:) func setString(_ key: String, value: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { guard let d = defaults() else { reject("E_APP_GROUP", "无法初始化 App Group UserDefaults(suiteName=\(suiteName))", nil) return } d.set(value, forKey: key) resolve(nil) } @objc(getString:resolver:rejecter:) func getString(_ key: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { guard let d = defaults() else { reject("E_APP_GROUP", "无法初始化 App Group UserDefaults(suiteName=\(suiteName))", nil) return } let v = d.string(forKey: key) resolve(v) } /** * 触发 Widget 刷新(系统仍可能延迟) */ @objc(reloadAllTimelines:rejecter:) func reloadAllTimelines(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { WidgetCenter.shared.reloadAllTimelines() resolve(nil) } }