- Drive chat list, timeline and forward picker from SwiftData @Query instead of AppModel's in-memory arrays; inject the per-account ModelContext from RootView with an in-memory fallback. - Physically delete locally deleted messages (context.delete) and purge rows marked deleted by older builds on store open, so @Query views never resurrect them. - Delete the legacy JSON snapshot only after a successful import save and restore the completeUntilFirstUserAuthentication data protection attribute on the store file. - Mirror the old ChatArchive tolerant decoding in LegacyArchiveImporter so snapshots from older schema versions (missing reactions, isGroupMessage, roster fields) still import. - Cover the new behaviour in ArchiveStoreTests and guard it with new verify.sh invariants; update AGENTS.md, ARCHITECTURE.md and SECURITY.md.
309 lines
6.8 KiB
JSON
309 lines
6.8 KiB
JSON
{
|
|
"images" : [
|
|
{
|
|
"filename" : "AppIcon-iPhone-20@2x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "2x",
|
|
"size" : "20x20"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-20@3x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "3x",
|
|
"size" : "20x20"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-29@2x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "2x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-29@3x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "3x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-40@2x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "2x",
|
|
"size" : "40x40"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-40@3x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "3x",
|
|
"size" : "40x40"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-60@2x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "2x",
|
|
"size" : "60x60"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPhone-60@3x.png",
|
|
"idiom" : "iphone",
|
|
"scale" : "3x",
|
|
"size" : "60x60"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-20@1x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "1x",
|
|
"size" : "20x20"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-20@2x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "2x",
|
|
"size" : "20x20"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-29@1x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "1x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-29@2x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "2x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-40@1x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "1x",
|
|
"size" : "40x40"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-40@2x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "2x",
|
|
"size" : "40x40"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-76@1x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "1x",
|
|
"size" : "76x76"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-76@2x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "2x",
|
|
"size" : "76x76"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-iPad-83.5@2x.png",
|
|
"idiom" : "ipad",
|
|
"scale" : "2x",
|
|
"size" : "83.5x83.5"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-AppStore-1024.png",
|
|
"idiom" : "ios-marketing",
|
|
"scale" : "1x",
|
|
"size" : "1024x1024"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-16.png",
|
|
"idiom" : "mac",
|
|
"scale" : "1x",
|
|
"size" : "16x16"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-16@2x.png",
|
|
"idiom" : "mac",
|
|
"scale" : "2x",
|
|
"size" : "16x16"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-32.png",
|
|
"idiom" : "mac",
|
|
"scale" : "1x",
|
|
"size" : "32x32"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-32@2x.png",
|
|
"idiom" : "mac",
|
|
"scale" : "2x",
|
|
"size" : "32x32"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-128.png",
|
|
"idiom" : "mac",
|
|
"scale" : "1x",
|
|
"size" : "128x128"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-128@2x.png",
|
|
"idiom" : "mac",
|
|
"scale" : "2x",
|
|
"size" : "128x128"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-256.png",
|
|
"idiom" : "mac",
|
|
"scale" : "1x",
|
|
"size" : "256x256"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-256@2x.png",
|
|
"idiom" : "mac",
|
|
"scale" : "2x",
|
|
"size" : "256x256"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-512.png",
|
|
"idiom" : "mac",
|
|
"scale" : "1x",
|
|
"size" : "512x512"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Mac-512@2x.png",
|
|
"idiom" : "mac",
|
|
"scale" : "2x",
|
|
"size" : "512x512"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Notification-38mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "notificationCenter",
|
|
"scale" : "2x",
|
|
"size" : "24x24",
|
|
"subtype" : "38mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Notification-42mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "notificationCenter",
|
|
"scale" : "2x",
|
|
"size" : "27.5x27.5",
|
|
"subtype" : "42mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Settings@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "companionSettings",
|
|
"scale" : "2x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Settings@3x.png",
|
|
"idiom" : "watch",
|
|
"role" : "companionSettings",
|
|
"scale" : "3x",
|
|
"size" : "29x29"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Notification-45mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "notificationCenter",
|
|
"scale" : "2x",
|
|
"size" : "33x33",
|
|
"subtype" : "45mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-38mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "40x40",
|
|
"subtype" : "38mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-40mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "44x44",
|
|
"subtype" : "40mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-41mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "46x46",
|
|
"subtype" : "41mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-44mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "50x50",
|
|
"subtype" : "44mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-45mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "51x51",
|
|
"subtype" : "45mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-Launcher-49mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "appLauncher",
|
|
"scale" : "2x",
|
|
"size" : "54x54",
|
|
"subtype" : "49mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-QuickLook-38mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "quickLook",
|
|
"scale" : "2x",
|
|
"size" : "86x86",
|
|
"subtype" : "38mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-QuickLook-42mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "quickLook",
|
|
"scale" : "2x",
|
|
"size" : "98x98",
|
|
"subtype" : "42mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-QuickLook-44mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "quickLook",
|
|
"scale" : "2x",
|
|
"size" : "108x108",
|
|
"subtype" : "44mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-QuickLook-45mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "quickLook",
|
|
"scale" : "2x",
|
|
"size" : "117x117",
|
|
"subtype" : "45mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-Watch-QuickLook-49mm@2x.png",
|
|
"idiom" : "watch",
|
|
"role" : "quickLook",
|
|
"scale" : "2x",
|
|
"size" : "129x129",
|
|
"subtype" : "49mm"
|
|
},
|
|
{
|
|
"filename" : "AppIcon-WatchStore-1024.png",
|
|
"idiom" : "watch-marketing",
|
|
"scale" : "1x",
|
|
"size" : "1024x1024"
|
|
}
|
|
],
|
|
"info" : {
|
|
"author" : "xcode",
|
|
"version" : 1
|
|
}
|
|
}
|