diff --git a/CustomKeyboard/Resource/002.zip b/CustomKeyboard/Resource/002.zip index f241135..3823509 100644 Binary files a/CustomKeyboard/Resource/002.zip and b/CustomKeyboard/Resource/002.zip differ diff --git a/Shared/KBSkinManager.m b/Shared/KBSkinManager.m index 7e527b3..545ea06 100644 --- a/Shared/KBSkinManager.m +++ b/Shared/KBSkinManager.m @@ -129,7 +129,11 @@ static void KBSkinDarwinCallback(CFNotificationCenterRef center, void *observer, } - (BOOL)applyImageSkinWithData:(NSData *)imageData skinId:(NSString *)skinId name:(NSString *)name { + // 仅作为“存在背景图”的标记使用:图像文件本身存放在 App Group 容器 + // Skins//background.png 中,这里不再把二进制图片写入 Keychain, + // 避免卸载 App 后仍残留旧背景图。 if (imageData.length == 0) return NO; + // 构造新主题,继承当前配色作为按键/强调色的默认值 KBSkinTheme *base = self.current ?: [self.class defaultTheme]; KBSkinTheme *t = [KBSkinTheme new]; @@ -143,14 +147,34 @@ static void KBSkinDarwinCallback(CFNotificationCenterRef center, void *observer, // 继承按键文本隐藏配置和图标映射,避免仅切换背景时丢失这些设置 t.hiddenKeyTextIdentifiers = base.hiddenKeyTextIdentifiers; t.keyIconMap = base.keyIconMap; - t.backgroundImageData = imageData; + // 不再把背景图二进制存进主题(从而写入 Keychain),统一改为按 skinId + // 从 App Group 容器读取 Skins//background.png。 + t.backgroundImageData = nil; return [self applyTheme:t]; } - (UIImage *)currentBackgroundImage { - NSData *d = self.current.backgroundImageData; - if (d.length == 0) return nil; - return [UIImage imageWithData:d scale:[UIScreen mainScreen].scale] ?: nil; + // 新策略:始终从 App Group 容器按 skinId 读取背景图文件, + // 确保当 AppGroup 目录被系统清理时,背景图与按键图标一起消失, + // 不再依赖 Keychain 中可能残留的 backgroundImageData。 + NSString *skinId = self.current.skinId; + if (skinId.length == 0) return nil; + + NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:AppGroup]; + if (!containerURL) return nil; + + NSString *relative = [NSString stringWithFormat:@"Skins/%@/background.png", skinId]; + NSString *bgPath = [[containerURL.path stringByAppendingPathComponent:relative] stringByStandardizingPath]; + + NSFileManager *fm = [NSFileManager defaultManager]; + BOOL isDir = NO; + if (![fm fileExistsAtPath:bgPath isDirectory:&isDir] || isDir) { + return nil; + } + + NSData *data = [NSData dataWithContentsOfFile:bgPath]; + if (data.length == 0) return nil; + return [UIImage imageWithData:data scale:[UIScreen mainScreen].scale] ?: nil; } - (BOOL)shouldHideKeyTextForIdentifier:(NSString *)identifier {