Journal des développeurs
"Ce jour-là", "Then & Now" et "Passport Stamps"
"Ce jour-là", "Then & Now" et "Passport Stamps" utilisent différentes techniques : associations de calendrier, regroupement spatial et reconnaissance optique de caractères (OCR). Ils suivent la même règle : trouver quelque chose d'utile, l'expliquer et laisser le choix final au voyageur.
Trois façons de ramener le passé à la vie.
La plupart des logiciels de suivi de voyage sont optimisés pour le prochain voyage. Mapsake doit également être capable de ramener quelqu'un à un voyage qui a eu lieu il y a cinq, dix ou vingt ans.
Cette mise à jour ajoute trois chemins différents vers le passé. Ce jour-là trouve une connexion avec le calendrier. Avant et maintenant trouve une connexion géographique. Tampons de passeport conserve un artefact physique et l'utilise pour améliorer l'atlas.
Ils partagent un principe de conception : commencez par les données que l'utilisateur possède déjà, effectuez le travail intéressant sur l'appareil et demandez une confirmation chaque fois qu'une inférence pourrait être incorrecte.
Il y a une idée de conservation derrière cette version, mais ce n'est pas "envoyer plus de notifications". Un atlas à vie devient utile lorsqu'il crée de nouvelles raisons de revisiter les anciennes données. La meilleure raison est une véritable connexion que l'utilisateur n'a pas eu à organiser manuellement.
"Ce jour-là", "Then & Now" et "Stamps" créent ces connexions différemment. Cela en a fait un bon test pour savoir si l'ensemble de fonctionnalités en croissance de Mapsake pouvait partager le chargement des photos, la résolution des lieux, le rendu, la navigation et les règles de confidentialité sans se transformer en un seul moteur de mémoire géant.
"Ce jour-là" utilise des dates provenant de plus que des photos.
L'implémentation la plus évidente rechercherait dans la bibliothèque de photos le mois et le jour en cours. Mapsake va plus loin, car les photos ne sont qu'un type de preuve de voyage.
Chaque endroit de l'atlas peut contenir des jours de présence provenant de saisies manuelles, d'importations, de vols et de l'historique des photos. "Ce jour-là" combine ces dates avec les métadonnées des photos mises en cache, regroupe le résultat par année et affiche les endroits les plus spécifiques en premier. Une ville ou un aéroport peuvent être mis en évidence dans le souvenir, tandis que sa région et son pays font partie de la même histoire.
Le filtrage des photos est séparé de l'interface principale, car une grande bibliothèque reste une grande bibliothèque, même lorsque la requête semble simple. Les résultats sont regroupés par ordre chronologique inverse et affichés sous forme de cartes d'années claires. L'ouverture d'une carte révèle sa galerie et des liens vers les histoires de lieux correspondantes.
Il existe également une fonction de repli "mémoire la plus proche" pour les jours calmes. Si juillet 9 n'a rien, Mapsake peut pointer vers la date la plus proche qui en a, plutôt que de présenter une impasse.
La fonction de correspondance du calendrier comporte plus de subtilités qu'il n'y paraît.
"Le même mois et le même jour" peut sembler être un prédicat trivial jusqu'à ce que les fuseaux horaires et les enregistrements incomplets entrent en jeu. Les dates des photos proviennent des médias capturés, tandis que les dates de lieux saisies manuellement ou importées peuvent représenter un jour plutôt qu'un instant précis. Cette fonctionnalité fonctionne donc dans les composants du calendrier au lieu de vérifier si les horodatages sont exactement 365 jours séparés.
Les lieux sont classés du plus fin au plus fin pour la présentation. Si l'atlas connaît l'aéroport, la ville, la région et le pays pour une journée, l'aéroport ou la ville doivent être mis en évidence dans la carte ; lister les quatre comme des souvenirs distincts exagérerait une pièce de preuve. La hiérarchie complète est disponible sous forme de puces de lieu et contribue à l'histoire environnante.
L'affichage des photos utilise le cache de métadonnées que Mapsake a créé lors de l'importation. Il ne demande pas à PhotoKit de rescanner toute la bibliothèque à chaque fois que le profil est ouvert. Le filtre par jour s'exécute dans une tâche distincte, puis l'interface reçoit une petite collection de références d'éléments qu'elle peut charger de manière différée.
Le premier point d'entrée se trouvait dans l'Atlas. Les tests ont montré qu'un bouton de calendrier rendait l'écran le plus important visuellement plus encombré, même les jours sans souvenirs. Déplacer le point d'entrée vers le profil lui a permis de s'afficher de manière conditionnelle, de s'associer naturellement à d'autres fonctionnalités personnelles et d'afficher un état non lu sans entrer en concurrence avec les contrôles de la carte.
Les notifications nécessitent leur propre travail de routage. Une notification locale n'arrive pas par le même chemin qu'un lien universel ordinaire. Mapsake écrit un lien profond dans la charge de la notification, capture la réponse dans le délégué de l'application et la transmet au même état de navigation que les autres liens profonds. La fonctionnalité visible est une phrase ; le tapotement fiable nécessite tout le chemin.
Le rappel est délibérément facultatif.
"Ce jour-là" peut programmer une notification douce, mais seulement après que l'utilisateur l'a activée. Mapsake prépare les dates de mémoire à venir à partir des données locales et ajoute un lien profond afin que, lorsque vous touchez la notification, la bonne vue s'ouvre.
Aucun serveur ne décide de l'importance d'un souvenir, et aucune photo ne doit quitter l'appareil pour que le rappel fonctionne. La vignette du profil n'apparaît que lorsque le jour en question a réellement quelque chose à afficher, avec un petit point non lu qui disparaît après l'ouverture.
La notification peut résumer plus d'un an ou d'un lieu, car le calcul local connaît déjà le résultat groupé. Un rappel pourrait indiquer que le voyageur était à Redmond, Rome et Tokyo un jour donné, au cours de plusieurs années. Le texte est assemblé sur l'appareil et localisé avec le reste de l'application.
Cette entrée conditionnelle était une décision aussi bien de produit que d'ingénierie. Une carte permanentement vide ferait la promotion de la fonctionnalité plus souvent, mais rendrait le profil plus bruyant chaque jour où la fonctionnalité n'avait rien d'utile à dire.
"Then & Now" considère la localisation comme le fil conducteur.
"Then & Now" recherche des photos prises à proximité du même endroit avec un écart d'au moins deux ans. L'implémentation utilise une grille spatiale compacte : les coordonnées des photos filtrées sont placées dans des cellules d'environ 280 mètres de large, et chaque cellule conserve uniquement la photo la plus ancienne et la plus récente tout en étant analysée.
Les cellules avec une durée suffisamment longue deviennent des candidates. Les durées les plus longues sont affichées en premier, les candidates à proximité sont dédupliquées afin qu'un seul endroit ne puisse pas remplir toute la liste, et le gazetteer regroupé fournit une étiquette de ville et de pays. Le résultat est mis en cache jusqu'à ce que l'index de photos change.
Il ne s'agit pas, intentionnellement, de similarité d'images. Les photos ne doivent pas montrer la même composition ou le même sujet ; c'est un travail différent pour Constellations. Comment ressemblait cet endroit lorsque vous y êtes retourné des années plus tard ?
Les paires s'ouvrent dans le visualiseur de photos normal et peuvent être partagées via le même chemin de rendu que les cartes Passport. Les originaux restent dans leur bibliothèque source, tandis que Mapsake conserve les métadonnées légères nécessaires pour retrouver la paire.
Pourquoi 280 mètres et deux ans ?
La cellule spatiale est délibérément tolérante. Le GPS du téléphone peut dériver, un point de repère peut être photographié depuis les côtés opposés d'une place, et un appareil photo plus ancien peut avoir des coordonnées moins précises. Une correspondance exacte des coordonnées laisserait de côté de nombreux résultats valides. Une correspondance au niveau de la ville serait trop large et associerait des quartiers non liés.
Environ 280 mètres est un seuil de produit, et non une affirmation que deux photos montrent le même point physique. Cela demande si la correspondance est suffisamment proche pour créer un sentiment de connexion lorsque les images sont placées côte à côte. Le minimum de deux ans évite que le premier et le dernier jour d'un voyage ne soient présentés comme un changement à long terme.
Seules la photo la plus ancienne et la plus récente de chaque cellule sont conservées pendant le scan. Cela rend l'utilisation de la mémoire proportionnelle au nombre de cellules occupées plutôt qu'au nombre total d'images et maximise naturellement la période de temps. Les paires candidates sont ensuite triées par durée et dédupliquées spatialement, de sorte qu'une personne ayant des centaines de photos autour d'une seule cellule voit tout de même de la variété.
La clé de mémoïsation suit la génération de métadonnées de photo et le nombre d'exclusions. Importez un nouveau lot de bibliothèques ou supprimez une photo de la carte, et les paires sont recalculées ; rouvrez l'écran sans modifier la source et l'application réutilise le résultat.
Un premier test de référence a montré que "Then & Now" passait également beaucoup de temps dans les recherches de villes voisines. Étant donné qu'il utilise le Gazetteer partagé plutôt qu'un décodage géographique inverse spécifique à une fonctionnalité, le travail d'indexation géographique qui a accéléré les importations et "Constellations" a également rendu ces étiquettes beaucoup moins coûteuses. Les bases partagées créent des succès partagés.
Le partage utilise le pipeline de Passport.
"Then & Now" avait besoin d'une carte avec deux photos, des années, un lieu et une période. La création d'un nouvel exportateur aurait dupliqué le rendu de la lumière et de l'obscurité, les ratios d'aspect sociaux, le préchargement des images, la sauvegarde des photos et la feuille de partage du système.
Au lieu de cela, la paire est enveloppée dans une carte Passport personnalisée et remise à l'écran de partage existant. Les images sources sont préchargées car ImageRenderer hors écran de SwiftUI est synchrone au point de rendu final. L'utilisateur voit le même flux de prévisualisation et de destination utilisé pour les cartes et les statistiques.
Cette réutilisation va au-delà de l'économie de code. Elle rend le comportement du partage prévisible : rien n'est publié automatiquement, l'exportation ressemble à l'aperçu, et les mêmes règles d'accessibilité et de couleur s'appliquent.
Les tampons Passport ont besoin d'une aide, pas d'une fausse certitude.
Les tampons de passeport réels sont un matériau difficile à traiter par OCR. Ils sont décolorés, tournés, superposés à des illustrations, écrits dans de nombreuses langues et parfois estampillés directement les uns sur les autres. Tout scanner qui prétend offrir une reconnaissance automatique parfaite induit l'utilisateur en erreur en lui fournissant des données de voyage inexactes.
Mapsake utilise le framework Vision d'Apple sur l'appareil pour extraire le texte qu'il peut lire, puis classe les correspondances possibles. Un code d'aéroport IATA est un signal fort. Un code pays de deux lettres, le nom du pays, un endonyme local, une ville, un port d'entrée ou une date européenne peuvent fournir des preuves supplémentaires. Les noms d'aéroport en langue locale aident à reconnaître qu'une entrée a probablement été effectuée en avion, même lorsque la reconnaissance optique de caractères échoue à la fin du mot.
Le moteur de correspondance propose une suggestion et une chaîne de lieux préférés : pays, région, ville et aéroport, le cas échéant. Il ne fait jamais de supposition par lui-même. L'écran de révision permet toujours un autre candidat ou un choix entièrement manuel.
Cette approche prudente est importante. Une suggestion manquée coûte un simple clic. Une suggestion incorrecte et certaine corrompt silencieusement l'atlas.
Un tampon de passeport de l'Islande décoloré a modifié le système de correspondance.
Un véritable tampon a rendu les limites concrètes. Le texte de l'aéroport aurait dû indiquer KEFLAVIKURFLUGVOLLUR, mais l'encre effacée et le saut de ligne ont été interprétés par Vision comme quelque chose de plus proche de KEFLAVIKURFLUGVOLI UR. Une vérification de mots entiers a échoué pour le terme de l'aéroport islandais, Mapsake n'a donc ni déduit de vol ni résolu l'aéroport de Keflavik.
La correction n'était pas un cas particulier pour un seul passeport. Le comparateur reconnaît désormais les préfixes des mots courants des noms d'aéroports dans plusieurs langues : des fragments correspondant au mot "aéroport" en islandais, allemand, espagnol, portugais, néerlandais, langues scandinaves et autres. Une fin endommagée peut toujours suggérer le mode d'entrée et biaiser la résolution de localisation vers un aéroport.
Deux leçons supplémentaires ont été ajoutées concernant les tampons de l'UE et de l'espace Schengen. Un code pays ISO à deux lettres dans l'ovale est utile uniquement lorsqu'il apparaît seul ; traiter chaque mot de deux lettres comme un pays créerait des correspondances absurdes. Les dates européennes doivent également être analysées en premier selon le jour avant qu'un détecteur général sensible à la locale ne puisse lire le mois.
La résolution du point d'entrée est tolérante aux préfixes pour la même raison. Les longs mots composés dans une langue locale peuvent contenir un nom de ville ou d'aéroport, même lorsque le glossaire inclus stocke la forme anglaise la plus courte. Le résolveur tente d'utiliser des fragments initiaux significatifs, puis construit la chaîne de pays, de région, de ville et d'aéroport autour du résultat confirmé.
La chaîne est affichée avant l'enregistrement. Le choix d'un aéroport avec un niveau de détail fin peut marquer sa ville, sa région et son pays ensemble, mais chaque niveau inféré reste visible et modifiable. L'interface utilisateur est conçue autour d'une suggestion forte suivie d'une décision humaine.
Conservez l'artefact, pas une autre copie.
Un enregistrement de tampon de passeport stocke les métadonnées et une référence à la photo source, et non aux octets complets de l'image. Mapsake crée une miniature petite et régénérable pour le mur de tampons et charge l'image originale sur demande. Si une image originale provenant de Photos est supprimée, la réconciliation peut supprimer son tampon orphelin sans prétendre que l'image existe toujours.
Le mot "véritablement" dans cette phrase est important. Une autorisation limitée de Photos ne peut pas prouver qu'un élément non visible a été supprimé ; il peut simplement être en dehors de la sélection autorisée. La réconciliation supprime une marque uniquement lorsque l'autorisation de la bibliothèque est suffisante et que ni l'identifiant local ni celui du cloud ne sont résolus. L'ambiguïté conserve l'enregistrement.
Ce modèle basé sur les références maintient également les données compatibles avec CloudKit, de petite taille. Un tampon peut synchroniser son pays, sa date, son livre, sa méthode d'enregistrement, sa page, son état préféré, une note et ses identifiants, sans essayer de stocker une photographie de passeport dans une ligne de base de données. Une miniature locale 256 pixel est un cache, et non la source de vérité.
Les timbres peuvent être organisés dans des carnets de passeport nommés, marqués comme arrivées ou départs, affectés de dates et de méthodes d'entrée, et consultés par pays. Le recadrage, le redressement, la rotation et un pinceau de flou aident à préparer une image utile avant de partager une mosaïque d'un pays ou d'un continent.
Le même processus peut numériser une page d'identité d'un passeport dans un livre. L'analyse de la zone lisible par machine fournit des champs structurés lorsque cela est possible, tandis que l'image reste une référence à la propre bibliothèque de l'utilisateur.
La reconnaissance MRZ désactive la correction linguistique. La zone lisible par machine est une séquence rigide de lettres, de chiffres et de chevrons ; demander à l'OCR de la convertir en mots naturels peut la rendre plus lisible, tout en rendant les champs analysés moins précis. Les champs imprimés, tels que le lieu de naissance, utilisent un processus distinct de meilleur effort, et chaque résultat est affiché dans un format de livre modifiable.
Les flux de la caméra et du sélecteur partagent une étape de recadrage et de rotation avant la reconnaissance. Par la suite, un cadran de redressement, un zoom et un panoramique, ainsi qu'un pinceau de flou pour les détails sensibles, ont été ajoutés. L'éditeur désactive les gestes conflictuels pendant que le pinceau de flou est actif, puis combine les modifications dans l'image source enregistrée en fonction du comportement de stockage choisi par l'utilisateur.
La galerie de timbres regroupe les artefacts par continent et pays, plutôt que seulement par livre de passeport. Appuyer sur une pile de pays dépliée ouvre les timbres individuels ; les arrivées, les départs et les favoris peuvent être filtrés ; les en-têtes de continent et de pays peuvent afficher une mosaïque via le pipeline de partage Passport. Les passeports restent des métadonnées utiles, mais la géographie est le chemin de navigation le plus naturel dans un atlas de voyage.
Assez technique pour être digne de confiance
Ces fonctionnalités utilisent trois techniques différentes : jointures de calendrier, regroupement spatial et reconnaissance optique de caractères (OCR). L'expérience utilisateur suit le même schéma :
- Dérivez un candidat à partir de données locales existantes.
- Gardez les tâches complexes hors de l'interface principale.
- Expliquez ce qui a été trouvé.
- Laissez l'utilisateur ouvrir, corriger, partager ou ignorer cela.
C'est le type d'intelligence que je veux dans Mapsake. Il doit faciliter la redécouverte de l'enregistrement privé sans agir comme si un algorithme comprenait une vie mieux que la personne qui l'a vécue.
Il y a plus d'ingénierie dans ces fonctionnalités que ne le suggèrent leurs surfaces calmes, mais aucune de celles-ci ne doit devenir un devoir pour l'utilisateur. Le travail technique est réussi lorsque "On This Day" s'ouvre à la bonne année, "Then & Now" montre un retour surprenant, et une marque difficile offre un candidat utile sans exagérer la certitude.