Обновление продукта.
С Днем независимости: достижения в путешествиях и друзья в Mapsake
С Днем независимости всем, кто отмечает этот праздник в Соединенных Штатах. Эта версия делает приватный атлас более интересным благодаря понятным достижениям и намеренному обмену между друзьями.
С Днем независимости!
С Днем независимости всем, кто отмечает этот праздник в Соединенных Штатах!
Это обновление посвящено двум способам, с помощью которых личная карта путешествий может стать более живой: достижения позволяют пользователю обнаруживать новые закономерности в своей истории, а Mapsake Friends позволяет сравнивать эту историю с людьми, которых они действительно знают.
Ни одна из этих функций не изменяет основное правило. Mapsake – это прежде всего личная карта. Здесь нет публичного количества подписчиков, глобальной таблицы лидеров или ленты, предназначенной для того, чтобы незнакомцы демонстрировали друг другу свои достижения.
Причины еще раз посмотреть на карту вокруг 160.
Mapsake теперь включает около 160 достижений. Некоторые из них – это знакомые этапы: первое отмеченное место, пять стран, каждый континент или растущий список городов и аэропортов. Другие описывают географические группы, культуру, природу, науку, авиацию и менее очевидные закономерности, скрытые в истории путешествий.
Каталог намеренно охватывает широкий спектр тем. Пользователь, совершающий поездки по близлежащим регионам, все равно должен увидеть значительный прогресс; система не предназначена только для тех, кто пытается собрать все страны.
В интерфейсе оценка достижений – это детерминированный процесс, охватывающий всю карту. Каждое достижение определяет места или пороговые значения, которые оно учитывает. Mapsake сравнивает это определение с текущей записью «Посещенных» и «Мест проживания», и результат включает прогресс, состояние разблокировки, дату и уровень медали. Он не зависит от аналитической службы или удаленного движка правил.
Этот подход имеет полезное следствие: достижения работают в автономном режиме и обновляются сразу после импорта или ручного изменения. Это также делает их тестируемыми. Один и тот же набор данных всегда может создавать один и тот же набор достижений.
Каталог вырос от 11 до примерно 160.
Первый движок достижений был выпущен с 11 простыми этапами. Этого было достаточно, чтобы продемонстрировать принцип: извлекать прогресс из карты, выделять то, что открыто, и показывать индикатор прогресса для остального. Однако он был слишком простым, чтобы оставаться интересным для тех, у кого уже есть богатая история путешествий.
Во второй версии были добавлены семьи и географические группы. Вехи подсчета стран стали одним списком вместо набора почти идентичных карточек. Завершение континентов и группы, такие как Европейский союз, Шенгенская зона, АСЕАН, G7, Магриб и Стан, добавили цели, которые были связаны с формой путешествия, а не только с его объемом.
Затем каталог расширился и включил искусство, музыку, науку, технологии, природу, геологию и экономику. Именно тогда он стал по-настоящему узнаваемым как Mapsake. Группа любителей истории джаза и группа, занимающаяся космическими программами, могут географически пересекаться, рассказывая совершенно разные истории о том, почему эти места связаны друг с другом.
Задача заключалась в том, чтобы избежать произвольных мелочей. Каждой группе требуется защищенный, фиксированный список участников и объяснение, которое имеет смысл после того, как новизна пройдет. Информация о членстве хранится в исходном коде, а не поступает из изменяющегося веб-сервиса, поэтому обновление каталога рассматривается и версионируется, как и любое другое поведение продукта.
Вокруг 160 достаточно информации, чтобы сделать поиск и организацию необходимыми. Это не цель, которую нужно постоянно развивать. Лучше иметь небольшой, структурированный каталог, чем тысячи процедурных значков, которые никто не понимает.
Даты и семьи разблокировок изменили интерфейс.
Когда количество элементов в каталоге достигло примерно 80, обычная сетка перестала работать. Различные пороговые значения из одной и той же категории перекрывали все остальное, и давний пользователь не мог понять, какое из них является новым.
Mapsake теперь объединяет полученные достижения в группы, где высший уровень находится сверху. При раскрытии группы отображаются более ранние этапы. Закрепленные достижения остаются видимыми в качестве целей, но по умолчанию сортировка выполняется по тому, что ближе всего к завершению.
Даты разблокировки записываются в первый раз, когда достижение становится истинным. Они сохраняются при последующих оценках и передаются в снимок друга, что позволяет странице достижений друга показывать, когда что-то произошло, не раскрывая частный журнал событий. Существующие пользователи получают базовые значения при первом запуске, поэтому установка обновления не вызывает фейерверк для каждого этапа, который их старая карта уже прошла.
Это базовое поведение связано с тем, что миграция рассматривается как часть функции. Технически правильный движок, который объявляет 70 «новые» достижения при запуске, будет казаться сломанным, даже если каждое достижение математически заслужено.
Прогресс должен быть понятным.
Стена из заблокированных значков не очень полезна, поэтому вкладка «Достижения» организована вокруг объяснений.
- Поиск по имени и фильтрация по категории или континенту.
- Сортировка по ближайшему, недавно разблокированному или уже выполненному.
- Откройте достижение, чтобы увидеть его описание, связанные места, карту и текущий прогресс.
- Переходите между уровнями поддержки: бронзовым, серебряным, золотым и платиновым.
- Долгое нажатие на достижение позволяет создать карточку для публикации, но без автоматической публикации.
Праздничные уведомления о разблокировке кратковременны и тактильны, а полные детали остаются доступными позже. Тон намеренно легкий и иногда немного забавный. Это должно вызывать ощущение открытия чего-то о карте, а не получение оценки эффективности.
Экран подробной информации также решил проблему доверия. Название, такое как «Five Eyes» или «Ring of Fire», не является самоочевидным для всех. Открытие показывает полное описание, регион карты, страны в группе, какие из них считаются пройденными, и диапазон дат посещения, если он доступен. Для многоуровневых семейств бронзовый, серебряный и платиновый уровни демонстрируют прогресс без необходимости использования четырех несвязанных визуальных систем.
Карта намеренно выделяет отсутствующие элементы, а также достигнутые. Прогресс легче понять, когда человек видит, что цель находится в соседней стране, а не просто читает «8 из 9».
Празднование не может включать навигацию.
Во время тестирования проявилась одна особенность реализации: изначально празднование достижений работало как модальное окно. Карточки выглядели интерактивными, но слой празднования не содержал достаточного количества данных для навигации к исходным деталям.
Исправление заключалось в том, чтобы рассматривать каждое достижение как ту же идентификацию достижения, которая используется в основном каталоге, и направлять его на существующий экран подробностей. Празднование остается временным представлением; модель достижения остается надежным источником. Это небольшой пример более широкого правила Mapsake: специальные эффекты должны быть поверх продукта, а не его форком.
Друзья, без создания социальной сети.
Mapsake Friends начинается с приглашения, а не с общедоступного каталога. Ссылка содержит личный код для обмена, а не имя или учетную запись. Открытие ссылки создает взаимную связь: каждый пользователь может видеть карту другого.
Ссылки хорошо работают на больших расстояниях, в то время как QR-коды и обнаружение поблизости полезны, когда два человека находятся в одной комнате. Приложение публикует компактный снимок путешествия для подключения, вместо того чтобы пытаться синхронизировать две полные локальные базы данных.
Первая модель совместного использования была недостаточно надежной.
Ранее для каждой связи использовался отдельный общий ресурс CloudKit. Это казалось привлекательным, потому что CloudKit обрабатывал приглашения к доступу, но это затрудняло дружеские отношения. Один человек мог принять общий доступ без получения надежного пути обратно для исходного отправителя, и системный URL-адрес общего доступа было трудно преобразовать в предсказуемый процесс в приложении.
Новая модель предоставляет каждому профилю стабильную общую запись карты, адресуемую непрозрачным кодом. Ссылка-приглашение открывает запись друга, кэширует снимок, публикует собственную карту принимающей стороны и отправляет небольшой запрос обратно на исходный код. Обновление в фоновом и переднем планах завершает взаимное соединение.
В первой версии этой замены использовался стабильный код непосредственно в ссылке. Это работало, но ссылка могла быть использована бесконечно, если бы она выходила за пределы предполагаемого разговора. Теперь одноразовые токены приглашения находятся перед стабильной картой идентификации. Использованный токен нельзя использовать повторно, в то время как основная дружба может продолжать обновляться.
Это пример одновременного изменения продукта и инфраструктуры. «Поделиться моей картой» – это одна кнопка в интерфейсе, но под ней находятся маршрутизация универсальных ссылок, поиск записей CloudKit, обработка взаимных запросов, локальное кэширование, дедупликация и четкое сообщение об успехе или неудаче. Скрытие этой инфраструктуры – это задача; притворство, что ее не существует, сделало бы невозможным объяснение сбоев.
Профиль друга содержит много полезной информации. Он может включать интерактивную карту, паспорт с элементами управления для выбора объектива, региона и года, достижения и вид сравнения, показывающий пересечения и места, уникальные для каждого человека. Домашнее местоположение не отображается, если владелец явно не включил общий доступ к нему.
Изначально экран друзей использовал более простую глобус и сводку. Это быстро стало казаться предварительным просмотром, а не отражением отношений. Текущая версия использует те же настройки карты, что и атлас владельца, те же расчеты для паспорта и ту же модель детализации достижений, но с другим источником данных.
Повторное использование этих компонентов выявило полезную абстракцию: экраны карт и паспортов должны получать данные о путешествиях, а не предполагать, что эти данные принадлежат локальному профилю пользователя. После реализации функции создания снимков друзей, фильтрация по объективам, диапазоны лет, континенты, прогресс достижений и сравнения могли бы использовать общий код, не предоставляя друзьям доступ к основной базе данных владельца.
В процессе разработки возникла менее заметная навигационная ошибка. Строка «друг» была напрямую связана с объектом модели SwiftData, но зеркальное копирование CloudKit могло перезаписать этот объект и изменить его идентификатор непосредственно перед началом навигации. Использование стабильного идентификатора друга для навигации устранило кажущуюся проблему с неработающей кнопкой. Ошибки распределенных данных часто проявляются как обычные ошибки интерфейса.
Фотографии профиля соответствовали тому же правилу создания снимков. Небольшой аватар можно опубликовать вместе с профилем и обновить после редактирования. Если фотография не установлена, в качестве резервного варианта используются инициалы. Mapsake запрашивает узнаваемое имя и фотографию перед первым приглашением, но ни одно из них не является обязательным.
Лента, составленная из значимых изменений.
Вкладка «Друзья» – это не поток загруженных публикаций. Mapsake периодически сравнивает последнюю версию данных о друзьях с сохраненной версией на устройстве. Если друг добавил новые места или получил достижения, эти изменения отображаются в виде небольшой локальной ленты активности.
Этот подход, основанный на сравнении снимков, упрощает функцию. Друзьям не нужно каждый раз, когда меняется их атлас, создавать новую запись, и Mapsake не требуется система ранжирования контента. Лента записывает полезное событие, потому что изменилась основная история путешествий.
Он также избегает добавления еще одного типа записи CloudKit для каждого события фида. Приложение уже имеет старые и новые снимки. Сравнение их идентификаторов местоположения и достижений может локально вывести интересные изменения, а затем сохранить ограниченный фид в небольшом хранилище JSON на устройстве.
Добавления мест и достижения группируются в отдельные блоки, даже если они появляются при одном обновлении. Это предотвращает создание множества почти идентичных строк при импорте большого объема данных и делает ленту похожей на "Эмма добавила Японию, Киото и еще два места", а не на журнал транзакций базы данных.
Уведомления можно включить для каждого туристического режима с периодом ожидания, чтобы избежать большого количества предупреждений при импорте большой истории. Функция обновления остается доступной, когда кто-то хочет проверить информацию вручную.
Конфиденциальность является частью функциональности, а не отказом от ответственности.
История путешествий может раскрыть места жительства, распорядок дня и будущие планы. Поэтому функция «Друзья» должна быть более явной, чем обычная социальная функция.
- Для добавления кого-либо требуется приглашение, сканирование QR-кода или личная встреча.
- Общий пакет содержит данные карты, необходимые для функции «Друзья», а не копию библиотеки фотографий.
- Функция домашнего обмена работает отдельно и отключена по умолчанию.
- Удаление друга удаляет локальную связь и связанные с ней кэшированные данные.
- Для использования Mapsake по-прежнему не требуется учетная запись Mapsake.
Снимок друга никогда не содержит исходные байты фотографии. Он содержит отметки о путешествиях, поля профиля, информацию об объективе, даты, необходимые для статистических данных, и достижения, необходимые для интерфейсов, которые может открывать пользователь. Это ограничение не позволяет превратить богатый опыт в сервис для обмена фотографиями.
Mapsake также различает обмен с друзьями и публичную ссылку для браузера. Связь с другом является взаимной и существует внутри приложения. Публичная карта – это отдельный, опциональный элемент для тех, кто хочет получить ссылку только для чтения. Включение одного не включает автоматически другое.
Достижения и друзья делают атлас более интересным, но они не превращают его в публичный профиль. Эта граница достаточно важна, чтобы ее постоянно подчеркивать по мере развития приложения.
Выполните обновление.
Открыть. Достижения Чтобы выполнить поиск по всему каталогу и посмотреть, что находится ближе всего. Затем откройте Друзья,, поделитесь ссылкой приглашения или используйте опцию «рядом» и «QR-код», и сравните карты с кем-то, кого вы знаете.
Лучший результат – это не более высокий балл. Это разговор: место, которое любят оба человека, регион, о котором один человек никогда не думал, или странное достижение, о котором никто не знал, что близок к его получению.