54 lines
1.8 KiB
Swift
54 lines
1.8 KiB
Swift
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)
|
||
}
|
||
}
|
||
|