Файл ассоциации apple-app-site не найден

Мы пытаемся создать файл ассоциации для веб-сайта, на котором его раньше не было.

Мы загрузили файл в https://www.our-website.com/.well-known/apple-app-site-association (как предложено в документации). К сожалению, это не сработало, ссылки по-прежнему открываются в браузере, а не в нашем приложении, и мы не можем понять, почему.

Мы попробовали запросить Apple CDN, и по какой-то причине он возвращает 404:

$ curl -v https://app-site-association.cdn-apple.com/a/v1/www.our-website.com
>
< HTTP/2 404
< apple-failure-details: {"cause":"invalid character '\u003c' looking for beginning of value"}
< apple-failure-reason: SWCERR00401 Bad JSON content
< apple-from: https://www.our-website.com/.well-known/apple-app-site-association
< apple-try-direct: false
< cache-control: max-age=3600,public
< content-type: text/plain; charset=utf-8
< via: https/1.1 dkvib1-3p-pst-001.ts.apple.com (acdn/153.14426), http/1.1 dkvib1-3p-pac-001.ts.apple.com (acdn/153.14426), https/1.1 dkvib1-3p-pfe-002.ts.apple.com (acdn/153.14426), 1.1 varnish
< cdnuuid: 1741f0c3-efb3-42fa-b574-ae3bfebb13f6-333001418
< expires: Fri, 24 May 2024 10:43:27 GMT
< accept-ranges: bytes
< age: 1693
< date: Fri, 24 May 2024 11:11:25 GMT
< x-cdn: fsly
< x-served-by: cache-bma1670-BMA
< x-cache: hit-stale, hit-fresh, hit-stale, HIT
< x-cache-hits: 0
< x-timer: S1716549085.460891,VS0,VE1
< content-length: 10
<
Not Found

Однако прямой запрос файла ассоциации возвращает 200 (мы пробовали из разных сетей, все работает нормально):

$ https://www.our-website.com/.well-known/apple-app-site-association
< HTTP/2 200
< date: Fri, 24 May 2024 11:03:15 GMT
< content-type: application/json; charset=utf-8
< content-length: 200
< cache-control: no-store
< x-varnish-director: sports_web_pro
< vary: Accept-Encoding,User-Agent
< x-cache: MISS
< x-age: 0
< age: 0
< accept-ranges: bytes
<
(json content here)

По мнению валидатора AASA, всё хорошо:

Прошло уже несколько дней, так что, надеюсь, это не проблема с кешированием. Ранее мы также пытались разместить файл на https://www.our-website.com/apple-app-site-association, но результат был тот же.

Как ни странно, диагностический инструмент на iPhone (в «Настройки» > «Разработчик») сообщает, что все в порядке:

Все это совершенно сбивает с толку, особенно сообщение о неудаче: {"cause":"invalid character '\u003c' looking for beginning of value"}. Бот CDN пытается проанализировать тело даже после получения ошибки 404? Или это кэшированный HTML-код, который был возвращен в .well-known, когда мы пытались разместить файл в корне? (поскольку '\u003c' — это открывающая угловая скобка).

У кого-нибудь есть идеи?


ОБНОВЛЕНИЕ: TN3155 предлагает запустить sudo swcutil dl -d www.our-website.com:

The operation couldn’t be completed. (SWCErrorDomain error 7.)

Я понятия не имею, что означает эта ошибка, но нахожу ссылки на ту же причину, invalid character '\u003c' looking for beginning of value.


ОБНОВЛЕНИЕ 2. Я не опубликовал содержимое файла (так как не думал, что это причина проблемы), но вот:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "ABCDE12345.com.our-website.www",
                "paths": [
                    "*"
                ]
            }
        ]
    },
    "activitycontinuation": {
        "apps": [
            "ABCDE12345.com.our-website.www"
        ]
    },
    "webcredentials": {
        "apps": [
            "ABCDE12345.com.our-website.www"
        ]
    }
}

Файл довольно простой. Я подтвердил, что это работает в режиме разработчика (когда я добавляю applinks:www.our-website.com?mode=developer в список связанных доменов). Мы также попытались разместить этот файл на промежуточном сервере (в stage-www.our-website.com он практически такой же, как и рабочий сервер), и https://app-site-association.cdn-apple.com/a/v1/stage-www.our-website.com возвращает 200, так что это, должно быть, проблема с CDN.

«Мы загрузили файл на наш-сайт.com/.well-known/apple-app-site-association» Ну, это не единственное, что вам нужно сделать, чтобы подготовить свое приложение к универсальные ссылки. Вы также должны предоставить своему приложению право на домен. Ты сделал это? Если да, то почему в вашем вопросе это не упоминается? Плюс, вы понимаете, как обойти кеширование, чтобы протестировать свои универсальные ссылки во время разработки?

matt 24.05.2024 19:05

@matt да, права на домен настроены. Конфигурация была скопирована из другой цели в проекте, поэтому я не ожидал каких-либо проблем, но вы правы, я должен был упомянуть об этом в вопросе. Я также знаю о режиме разработки: если бы возникла проблема с содержимым файла ассоциации, это, вероятно, помогло бы его найти, но в данном случае проблема в том, что бот CDN не может найти файл (если только конечно, ошибка 404 — отвлекающий маневр).

Andrii Chernenko 25.05.2024 17:04

Не могли бы вы показать (в вопросе) содержимое файла ассоциации сайта? Я всегда следовал developer.apple.com/videos/play/wwdc2020/10098 в точности, и это всегда работало.

matt 25.05.2024 18:24

Я буду отсутствовать у компьютера неделю или около того, обновлю вопрос, когда вернусь.

Andrii Chernenko 25.05.2024 19:29

@matt Я обновил вопрос, указав в нем содержимое файла ассоциации (извините за задержку). Несмотря на то, что файл использует устаревший формат, он отлично работает в режиме разработчика и при развертывании на промежуточном сервере, что заставляет меня думать, что это проблема CDN. Мы попытаемся удалить и повторно развернуть файл и, возможно, преобразовать его в новый синтаксис, если это не поможет. В противном случае нам придется подать запрос в службу поддержки разработчиков (как только они вернутся к обработке частных запросов на поддержку после WWDC).

Andrii Chernenko 03.06.2024 12:27

Цитируем из документации «Сеть доставки контента Apple запрашивает файл ассоциации apple-app-site-association для вашего домена в течение 24 часов. Устройства проверяют наличие обновлений примерно раз в неделю после установки приложения».

derpirscher 04.06.2024 12:38

@derpirscher Мне бы хотелось, чтобы это было так просто, как просто подождать некоторое время, но на данный момент прошли недели.

Andrii Chernenko 04.06.2024 17:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
283
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы попробовал следующие диагностические проверки:

  1. Дважды проверьте свой формат JSON и убедитесь, что он обслуживается с типом application/json MIME.
  2. Убедитесь, что в файле нет метки порядка байтов (BOM).
  3. Если в кэше CDN неправильная версия, возможно, вам придется обратиться в Apple, чтобы очистить ее. Или, может быть, попробовать развернуть на другом сервере? (Глупый вариант?)
  4. Убедитесь, что вы случайно не обслуживаете HTML — ошибка CDN предполагает, что он может просматривать HTML-страницу.

Попробуйте также следующее:

Установите для заголовка управления кешем значение Cache-Control: public, max-age=0.

Удачи!

Ответ принят как подходящий

Мы нашли виновника: сервер, на котором размещен файл ассоциации, обертывал содержимое файла в HTML, если пользовательский агент содержал слово «бот» (и возвращал правильный JSON для веб-браузеров и Curl). И, конечно же, бот CDN отправляет запрос с помощью User-Agent: AASA-Bot/*:

curl -A "AASA-Bot/*" https://www.our-website.com/.well-known/apple-app-site-association
<html><head><meta name = "color-scheme" content = "light dark"></head><body><pre style = "word-wrap: break-word; white-space: pre-wrap;">{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "ABCDE12345.com.our-website.www",
                "paths": [
                    "*"
                ]
            }
        ]
    },
    "activitycontinuation": {
        "apps": [
            "ABCDE12345.com.our-website.www"
        ]
    },
    "webcredentials": {
        "apps": [
            "ABCDE12345.com.our-website.www"
        ]
    }
}</pre></body></html>

Вот откуда взялась открывающаяся угловая скобка, на которую жаловался бот.

Как только проблемная часть логики была обновлена, все заработало как положено.

Другие вопросы по теме