Momentopname-formaat (Tijdmachine), versie 1
Albarium legt vóór elke actie op je albums en mappen een momentopname vast. Foto's verwijderen in de werkbank is zo'n actie niet: daarvoor legt de app geen momentopname vast, ook al verdwijnen die foto's daarmee uit je albums. Dit document beschrijft precies wat er in zo'n momentopname staat, zodat je zelf kunt controleren wat de app bewaart. Een momentopname is een gewoon tekstbestand in JSON; je kunt het exporteren in de Tijdmachine (open een actie, dan Momentopname van vlak ervoor) en openen in elke teksteditor.
Wat er wel en niet in staat
Wel:
- de namen van je eigen albums en mappen;
- de mappenstructuur en de volgorde van albums en mappen;
- per album de lijst foto-ID's, in de volgorde van het album;
- per album de ID's van foto's die je in Foto's hebt verborgen, als iOS die aan de app geeft; apart en zonder iets anders over die foto's (zie
hiddenAssetIDs); - per zichtbare foto in een album het iCloud-ID, als Foto's dat geeft;
- wanneer de momentopname is gemaakt, waarom (welke actie volgde), en met welke appversie.
Niet:
- foto's of video's zelf, miniaturen, of andere beeldgegevens;
- locaties, datums, gezichten, bijschriften of andere metadata van foto's;
- gedeelde albums, gesynchroniseerde albums (van een Mac) en slimme albums: die kan de app niet wijzigen en dus ook niet herstellen;
- iets over jou: geen account en geen apparaat-ID. Wel staat erin wanneer de momentopname is gemaakt en voor welke actie (zie hierboven).
De app verstuurt een momentopname nergens heen. Hij staat in de opslag van de app op je iPhone en gaat, net als andere appgegevens, mee in een reservekopie van je iPhone (in iCloud of op je computer), als je iPhone die maakt. Verder komt hij alleen buiten de app als je hem zelf exporteert.
Bestand
- Codering: UTF-8, JSON (RFC 8259).
- Sleutels staan alfabetisch gesorteerd en de uitvoer is ingesprongen, zodat twee momentopnames regel voor regel te vergelijken zijn.
- Datums zijn ISO 8601 in UTC, op hele seconden:
2025-10-14T08:52:45Z. Lezers accepteren ook fracties van seconden. - Schuine strepen in ID's worden niet ge-escaped (
/L0/040, niet\/L0\/040). - In de app staat elk bestand als
<id>.json; een export heetalbumbeheer-snapshot-<datum>-<id-begin>.jsonen is byte voor byte hetzelfde bestand. Die exportkopie zet de app klaar als je bij een actie in de Tijdmachine Momentopname van vlak ervoor opent, en hij verwijdert hem als je dat scherm sluit (of anders bij de volgende start).
Velden
| Veld | Type | Betekenis |
|---|---|---|
formatVersion | geheel getal | Versie van dit formaat. Nu 1. |
id | UUID (tekst) | Unieke naam van deze momentopname. |
createdAt | datum | Wanneer de momentopname is gemaakt. |
reason.kind | tekst | De actie waarvoor de momentopname is gemaakt: merge (samenvoegen), moveToNewFolder, moveToFolder, bundleAsFolder (bundelen in een map), rename, deleteAlbums, archiveAndDelete (eerst archiveren, dan wissen), cleanUp (werkbank: foto's naar een ander album verplaatst) of restore (herstel). Lezers moeten onbekende waarden accepteren. |
reason.title | tekst | Korte naam van waar de actie over ging, zoals de titel van het nieuwe album. |
appVersion | tekst | Versie van de app die de momentopname schreef. |
structure.albums | object | Per album-ID: title (tekst), assetIDs (lijst foto-ID's, in albumvolgorde, zonder dubbele) en, alleen als het album verborgen foto's bevat, hiddenAssetIDs (zie hieronder). |
structure.folders | object | Per map-ID: title (tekst) en children (lijst album- en map-ID's, in volgorde). |
structure.topLevel | lijst | De albums en mappen op het hoogste niveau, in volgorde. |
cloudIDs | object | Per foto-ID (alleen zichtbare foto's die in een album staan, dus niet die in hiddenAssetIDs) het iCloud-ID (PHCloudIdentifier). Ontbreekt als Foto's er geen gaf. |
ID's zijn de localIdentifiers van Foto's op dit toestel (bijvoorbeeld B84E5A21-…/L0/040 voor een album, …/L0/001 voor een foto). Ze zijn alleen op dit toestel geldig; de iCloud-ID's maken het mogelijk dezelfde foto's later op een ander toestel terug te vinden.
Verborgen foto's
Foto's die je in Foto's hebt verborgen, toont, telt en analyseert de app niet. In onze tests in de simulator, op iOS 27.0 met het album Verborgen vergrendeld (de standaard), gaf iOS ze de app helemaal niet: ze stonden dan niet in de momentopname, niet in assetIDs en niet in cloudIDs. Dat geldt voor foto's die al verborgen waren toen de momentopname werd gemaakt: een foto die je daarna verbergt, blijft erin staan, met zijn ID en, als Foto's dat gaf, zijn iCloud-ID. Zonder die vergrendeling, op iOS 26 en op een echte iPhone is dat niet getest. Een verborgen foto blijft wel in zijn albums staan. Daarom wist de app geen album waarvan hij denkt dat er een verborgen foto in staat; bij samenvoegen blijft zo'n bronalbum staan. Zeker weten doet de app het niet: hij kan een verborgen foto missen, en een album laten staan waarin geen verborgen foto staat. Gaat een album met een verborgen foto toch weg, dan blijft de foto in Foto's in het album Verborgen, maar zet terugzetten hem niet terug in het album.
Geeft iOS verborgen foto's wél aan de app, dan legt de momentopname per album alleen hun ID's vast in hiddenAssetIDs (gesorteerd; de volgorde is niet zichtbaar), en is terugzetten erop gebouwd om ze terug te zetten in precies die albums. Dat is niet getest, omdat iOS ze in onze tests niet gaf. Het veld ontbreekt bij een album zonder bekende verborgen foto's. Staan in een oudere momentopname verborgen foto's tussen de assetIDs, dan haalt de app ze daar bij terugzetten eerst uit.
Elk album en elke map hoort precies één keer in de boom te staan: ofwel in topLevel, ofwel in de children van één map.
Voorbeeld
{
"appVersion" : "1.0 (1)",
"cloudIDs" : {
"9A1B2C3D-4E5F-6A7B-8C9D-0E1F2A3B4C5D/L0/001" : "9A1B2C3D-4E5F-6A7B-8C9D-0E1F2A3B4C5D:001:AbCdEf0123456789"
},
"createdAt" : "2025-10-14T08:52:45Z",
"formatVersion" : 1,
"id" : "3F2A9C1E-7B4D-4E8A-9F21-6C0D5B8E4A17",
"reason" : {
"kind" : "merge",
"title" : "Zomer 2025"
},
"structure" : {
"albums" : {
"B84E5A21-0C3F-4D7E-A1B2-9F8E7D6C5B4A/L0/040" : {
"assetIDs" : [
"9A1B2C3D-4E5F-6A7B-8C9D-0E1F2A3B4C5D/L0/001",
"1F2E3D4C-5B6A-7988-9AAB-BCCDDEEFF001/L0/001"
],
"title" : "2025-07-14 Efteling"
},
"C95F6B32-1D40-4E8F-B2C3-A09F8E7D6C5B/L0/040" : {
"assetIDs" : [
],
"title" : "2025-07-15 Strand"
}
},
"folders" : {
"D06A7C43-2E51-4F90-C3D4-B1A09F8E7D6C/L0/040" : {
"children" : [
"C95F6B32-1D40-4E8F-B2C3-A09F8E7D6C5B/L0/040"
],
"title" : "Reizen"
}
},
"topLevel" : [
"B84E5A21-0C3F-4D7E-A1B2-9F8E7D6C5B4A/L0/040",
"D06A7C43-2E51-4F90-C3D4-B1A09F8E7D6C/L0/040"
]
}
}
Hoe herstellen werkt
Herstellen zet de albumstructuur terug zoals in de momentopname. Albums die nog bestaan worden teruggezet (naam, foto's, volgorde, map); albums die intussen gewist zijn worden opnieuw gemaakt met dezelfde foto's; albums en mappen die er sindsdien bij kwamen worden gewist, behalve albums waarvan de app denkt dat er een verborgen foto in staat: die blijven staan (staan ze in een map die gewist wordt, dan eerst in de dichtstbijzijnde map erboven die blijft, of op het hoogste niveau). Foto's zelf worden daarbij nooit gewist.
- Een herstel is zelf ook een actie met een eigen momentopname vooraf, dus ook een herstel kun je weer terugdraaien.
- Foto's die je hebt verwijderd, worden overgeslagen, ook als ze nog in Recent verwijderd staan: PhotoKit geeft ze de app niet meer. De app zegt na het terugzetten hoeveel het er zijn, niet welke. De momentopname zelf blijft ongewijzigd bewaard, met per zichtbare foto het iCloud-ID als Foto's dat gaf, zodat je in het geëxporteerde bestand kunt nagaan welke foto's in welk album stonden.
- Op iOS 26 en 27 kan de app de volgorde op het hoogste niveau bepalen, en herstellen zet die dus ook terug. Weigert iOS dat toch, of staat de volgorde daarna niet zoals gepland, dan stopt het herstel bij die stap en geldt het als niet afgerond, zoals bij elke stap die mislukt.
- Na een herstel vergelijkt de app de bibliotheek met de momentopname: per album titel, foto's in volgorde en verborgen foto's, per map titel en inhoud in volgorde. Albums die bewust bleven staan omdat er een verborgen foto in staat, laat die vergelijking weg; ze moeten er nog zijn. Alleen als de rest gelijk is, geldt het herstel als geslaagd.
Versies
- Een lezer weigert een bestand met een hogere
formatVersiondan hij kent, in plaats van het half te lezen. - Nieuwe optionele velden of nieuwe waarden voor
reason.kindverhogen de versie niet; lezers negeren wat ze niet kennen. - Een wijziging die de betekenis van een bestaand veld verandert, verhoogt
formatVersion. De app blijft oudere versies lezen.