// // KBAuthManager.h // 主 App 与键盘扩展共享使用 // // 通过 Keychain Sharing 统一管理用户登录态(access/refresh token)。 // 线程安全;在保存/清空时同时发送进程内通知与 Darwin 跨进程通知, // 以便键盘扩展正运行在其他 App 时也能及时感知变更。 // #import NS_ASSUME_NONNULL_BEGIN /// Darwin 跨进程通知名称:当令牌更新或清除时发送,用于提示 App/扩展刷新缓存。 extern NSString * const kKBDarwinAuthChanged; /// 进程内通知(NSNotificationCenter):令牌更新或清除时发送。 extern NSNotificationName const KBAuthChangedNotification; /// 简单的会话容器;可按需扩展字段。 @interface KBAuthSession : NSObject @property (nonatomic, copy, nullable) NSString *accessToken; @property (nonatomic, copy, nullable) NSString *refreshToken; @property (nonatomic, strong, nullable) NSDate *expiryDate; // 可选:过期时间 @property (nonatomic, copy, nullable) NSString *userIdentifier; // 可选:如“用 Apple 登录”的 userIdentifier @end /// 基于“共享钥匙串”的鉴权管理器(使用 Keychain Sharing 访问组)。 @interface KBAuthManager : NSObject + (instancetype)shared; /// 当前会话(内存缓存),在加载/保存/清除后更新。 @property (atomic, strong, readonly, nullable) KBAuthSession *current; /// 是否已登录:存在 accessToken 且未明显过期(未设置过期时间则只要有 token 即视为已登录)。 - (BOOL)isLoggedIn; /// 从钥匙串加载到内存;通常首次访问时会自动加载。 - (void)reloadFromKeychain; /// 保存令牌到“共享钥匙串”并通知观察者。 - (BOOL)saveAccessToken:(NSString *)accessToken refreshToken:(nullable NSString *)refreshToken expiryDate:(nullable NSDate *)expiryDate userIdentifier:(nullable NSString *)userIdentifier; /// 从钥匙串与内存中清除令牌,并通知观察者。 - (void)signOut; /// 便捷方法:若存在有效令牌,返回 `Authorization` 请求头;否则返回空字典。 - (NSDictionary *)authorizationHeader; @end NS_ASSUME_NONNULL_END