wip: iOS refactor — iMessage extension, sticker browser, app icon assets

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 13:43:06 +01:00
parent 20b93df9b0
commit b5d50c45da
8 changed files with 410 additions and 23 deletions

View File

@@ -1,4 +1,5 @@
import Foundation
import UIKit
final class StickerStore {
static let shared = StickerStore()
@@ -6,6 +7,7 @@ final class StickerStore {
private let packsKey = "savedPacks"
private let suiteName = "group.de.felixfoertsch.StickerCloner"
private let fileManager = FileManager.default
private let thumbnailCache = NSCache<NSString, UIImage>()
private lazy var defaults: UserDefaults = {
guard let defaults = UserDefaults(suiteName: suiteName) else {
@@ -66,6 +68,7 @@ final class StickerStore {
var packs = savedPacks
packs.removeAll { $0.name == name }
savedPacks = packs
thumbnailCache.removeObject(forKey: name as NSString)
let packDir = packDirectory(name: name)
try? fileManager.removeItem(at: packDir)
@@ -89,6 +92,14 @@ final class StickerStore {
return urls
}
func stickerFileURLs(forPack name: String) -> [URL] {
let packDir = packDirectory(name: name)
guard let files = try? fileManager.contentsOfDirectory(at: packDir, includingPropertiesForKeys: nil) else { return [] }
return files
.filter { $0.pathExtension == "png" }
.sorted { $0.lastPathComponent < $1.lastPathComponent }
}
func firstStickerURL(forPack name: String) -> URL? {
let packDir = packDirectory(name: name)
guard let files = try? fileManager.contentsOfDirectory(at: packDir, includingPropertiesForKeys: nil) else { return nil }
@@ -98,6 +109,16 @@ final class StickerStore {
.first
}
func thumbnail(forPack name: String) -> UIImage? {
let key = name as NSString
if let cached = thumbnailCache.object(forKey: key) { return cached }
guard let url = firstStickerURL(forPack: name),
let data = try? Data(contentsOf: url),
let image = UIImage(data: data) else { return nil }
thumbnailCache.setObject(image, forKey: key)
return image
}
// MARK: - Migration from old sandbox
private func migrateIfNeeded() {