Почему несоответствие Bundle ID нарушает работу iOS Universal Links? Несоответствие Bundle ID приводит к сбоям Universal Links, когда подписанный идентификатор приложения (Application Identifier) не совпадает с соответствующей записью appID/appIDs в файле AASA для связанного домена, из-за чего проверка связанных доменов завершается ошибкой.
Bundle ID (CFBundleIdentifier) — это уникальная строка, идентифицирующая конкретное приложение для iOS в экосистеме Apple. В архитектуре Universal Links идентификатор Bundle ID объединяется с префиксом идентификатора приложения (Application Identifier Prefix), образуя идентификатор приложения, который операционная система сверяет с размещенным файлом apple-app-site-association для авторизации обработки нативных URL-адресов.
| Термин | Определение |
|---|---|
| Bundle ID | Уникальный идентификатор в формате обратного DNS, назначаемый таргету приложения iOS в Xcode (CFBundleIdentifier). |
| Префикс идентификатора приложения | Префикс App ID, назначаемый в настройках аккаунта Apple Developer (часто, но не всегда, совпадает с Team ID). |
| Universal Links | Стандартный механизм Apple для перенаправления веб-ссылок HTTPS напрямую в представления нативного приложения. |
| Связанные домены (Associated Domains) | Энтайтлмент в Xcode, определяющий, какие веб-домены приложение уполномочено обрабатывать (applinks:). |
| Файл AASA | JSON-файл (apple-app-site-association), размещаемый на домене для авторизации обработки URL-адресов приложения. |
Каноническая цепочка диагностики
На схеме ниже представлена многоуровневая последовательность проверки, выполняемая во время установки приложения и валидации домена:
Слой 1: Подписанный бинарный файл приложения
│
├── application-identifier (<Prefix>.<BundleID>)
├── com.apple.developer.team-identifier
└── com.apple.developer.associated-domains (applinks:example.com)
│
▼
Слой 2: Доставка AASA и кэширование CDN
│ (Инфраструктура под управлением Apple получает исходный файл AASA)
▼
Слой 3: Схема AASA и сопоставление шаблонов
│ (Проверяет массив appIDs и правила маршрутизации components/paths)
▼
Слой 4: Состояние ассоциации на устройстве
│ (Операционная система регистрирует проверенные домены в локальной базе данных)
▼
Слой 5: Выполнение маршрутизации приложения
│ (Система перенаправляет соответствующие URL-адреса обработчикам жизненного цикла приложения)

Чек-лист быстрого исправления: 30-секундная процедура диагностики
Если Universal Links неожиданно переключаются на обработку в веб, проверьте следующие пункты по порядку:
- Извлечение подписанного идентификатора: Проверьте встроенный энтайтлмент скомпилированного бинарного файла, чтобы получить точный
application-identifier(<Prefix>.<BundleID>). - Проверка формата энтайтлментов: Убедитесь, что
com.apple.developer.associated-domainsсодержит точное доменное имя (например,applinks:subdomain.domain.com) без лишних путей, строк запроса или завершающих слэшей. - Аудит исходного файла AASA: Запросите
https://subdomain.domain.com/.well-known/apple-app-site-associationи убедитесь, что подписанный идентификатор приложения дословно указан в массивеappIDs. - Проверка сопоставления путей: Убедитесь, что целевой URL соответствует паттернам
componentsилиpaths, заданным в конфигурации AASA. - Проверка охвата доменов: Убедитесь, что энтайтлмент связанных доменов охватывает целевое доменное имя и что для этого домена доступна соответствующая конфигурация AASA. Для поддоменов используйте явное имя хоста или поддерживаемую подстановочную форму
*.. - Изоляция режимов разработки: Используйте параметр
?mode=developerв сборках с девелоперской подписью, чтобы обходить кэширование CDN Apple во время итераций тестирования.
Почему важна точность Bundle ID и идентификатора приложения
Анатомия идентификатора приложения
Проверка Universal Links не оценивает отображаемое имя приложения, внутреннюю схему URL или имя бандла. Согласно документации Apple по applinks.Details, модель безопасности опирается исключительно на полностью квалифицированный идентификатор приложения (Application Identifier), структурированный следующим образом:
Где:
ApplicationIdentifierPrefix: Префикс App ID, назначенный в конфигурации вашего аккаунта Apple Developer (например,9JA723G82S). Для многих современных учетных записей разработчиков это значение совпадает с 10-значным Team ID, однако инженерам следует проверять актуальный префикс на портале Apple Developer Portal, а не предполагать их взаимозаменяемость.CFBundleIdentifier(Bundle ID): Регистрозависимая строка в формате обратного DNS, определяемая в настройках сборки таргета (например,com.example.mobileapp).
В размещенном JSON-файле apple-app-site-association (AASA) эта составная строка отображается внутри массива appIDs или записей словаря appID (например, 9JA723G82S.com.example.mobileapp). Если между встроенным энтайтлментом скомпилированного бинарного файла и размещенной записью AASA обнаружится расхождение в символах, разница в регистре или лишний пробел, проверка домена завершится ошибкой.
Несоответствие Bundle ID является одной из приоритетных причин, которые необходимо проверять при устранении неполадок интеграции, но это не единственная причина, по которой Universal Links могут возвращаться к веб-обработке.
Как связанные домены и AASA устанавливают двустороннюю ассоциацию
В отличие от пользовательских схем URL (custom URL schemes), которые любое установленное приложение может объявить без проверки домена, Universal Links устанавливают безопасную двустороннюю ассоциацию:
- Декларация от приложения к домену: Скомпилированное приложение iOS заявляет о правах на определенный веб-домен, включая энтайтлмент
com.apple.developer.associated-domainsв свою цифровую подпись. - Авторизация от домена к приложению: Веб-домен подтверждает предоставление прав на маршрутизацию конкретным приложениям путем размещения JSON-файла AASA по адресу
https://<domain>/.well-known/apple-app-site-associationилиhttps://<domain>/apple-app-site-association.
Во время установки или обновления приложения операционная система сверяет подписанный энтайтлмент связанных доменов приложения с конфигурацией AASA, полученной для этого домена. Идентификатор приложения, используемый для ассоциации, должен совпадать с соответствующим идентификатором, указанным в конфигурации AASA. После совпадения идентификаторов запрошенный URL также должен удовлетворять настроенным правилам components или paths.
Признак сбоя: почему несовпадающие идентификаторы приводят к откату в веб
При несоответствии идентификаторов приложения iOS обычно не выдает фатальную ошибку времени выполнения. Вместо этого сбой отражается в статусе проверки связанных доменов, диагностике устройства или поведении при веб-откате:
- Системная обработка: Когда ассоциация доменов терпит неудачу, система не вызывает приложение через проверенный путь Universal Link. В зависимости от того, как был открыт URL-адрес и контекста браузера, ссылка остается в веб-обработке или перенаправляется в неё, вместо передачи нативному приложению.
- Влияние на пользовательский опыт: Когда пользователь нажимает на соответствующую веб-ссылку в Сообщениях (Messages), Почте (Mail) или Сафари (Safari), система не распознает авторизованное сопоставление с нативным приложением и открывает веб-ссылку в браузере.
Смотрите также: Bundle ID ──> Архитектура Universal Links
Как CDN Apple получает и кэширует файлы AASA
Рукопожатие при установке и механика CDN Apple
Когда приложение, содержащее энтайтлмент com.apple.developer.associated-domains, устанавливается или обновляется, система создает или обновляет связь со связанным доменом:
- Скрапер на базе CDN: Когда система устанавливает или обновляет отношение связанных доменов, она получает данные AASA домена через инфраструктуру связанных доменов Apple и использует их для проверки ассоциации.
- Независимый жизненный цикл кэширования: Управляемая Apple CDN контролирует собственный жизненный цикл обновления и кэширования, поэтому нельзя полагаться на то, что обновление на источнике станет мгновенно видимым через CDN. При тестировании изменений используйте документированный альтернативный режим разработки и проверяйте состояние ассоциации на устройстве.
- Требования к исходному серверу: Исходный веб-сервер должен отдавать файл AASA по протоколу HTTPS с действительным доверенным TLS-сертификатом (самоподписанные сертификаты отклоняются), используя MIME-тип
application/json. Хостинг AASA не должен полагаться на HTTP-редиректы; эндпоинт AASA должен возвращать файл напрямую с кодом ответа HTTP 200 OK.
Согласованность формата JSON в AASA
Современные версии iOS поддерживают детализированный синтаксис словаря components, сохраняя при этом обратную совместимость с устаревшими массивами paths.
Согласно технической заметке Apple TN3155 по отладке Universal Links, в рамках конкретной записи details разработчикам следует использовать либо современную структуру appIDs + components, либо устаревшую структуру appID + paths; не смешивайте эти две структуры в одной записи, так как смешанные конфигурации могут привести к неожиданному поведению при проверке.
Более ранние примеры AASA часто включали параметр "apps": []. Для развертывания под современные релизы ОС Apple этот ключ не требуется; сохраняйте его только при поддержке устаревших версий ОС, которым он явно необходим.
Протокол диагностики: пошаговый рабочий процесс устранения неполадок
Шаг 1: Проверка подписанных энтайтлментов приложения с помощью codesign
Чтобы определить, содержит ли экспортированный IPA-файл или отладочная сборка точные ожидаемые идентификаторы приложения и связанные домены, проверьте цифровую подпись бинарного файла напрямую с помощью командной строки codesign в macOS. Проверьте application-identifier, com.apple.developer.team-identifier и com.apple.developer.associated-domains в комплексе.
Профили провизионирования показывают, какие возможности и домены разрешены профилем; подписанный исполняемый файл (codesign) показывает, что на самом деле содержит отправленный бинарник.
Шаг 2: Аудит схемы размещенного JSON-файла AASA
Убедитесь, что на исходном сервере размещен валидный файл AASA, общедоступный без аутентификации и перенаправлений. Обратите внимание, что старые примеры AASA часто содержали "apps": [], в то время как современные конфигурации для актуальных релизов iOS опускают этот ключ.
Стандартная схема JSON AASA ниже демонстрирует правильную маршрутизацию путей с использованием современной структуры appIDs и components:
```json
{
"applinks": {
"details": [
{
"appIDs": [
"9JA723G82S.com.example.mobileapp",
"9JA723G82S.com.example.mobileapp.staging"
],
"components": [
{
"/": "/product/*",
"comment": "Соответствует маршрутам сведений о товаре"
},
{
"/": "/invite/*",
"?": { "ref": "?*" },
"comment": "Соответствует реферальным ссылкам с пользовательскими параметрами запроса"
},
{
"/": "/help/*",
"exclude": true,
"comment": "Исключает URL технической поддержки из нативной маршрутизации"
}
]
}
]
}
}
Шаг 3: Запуск диагностических CLI-утилит (codesign, swcutil, curl)
В версиях macOS, предоставляющих диагностику swcutil, используйте этот инструмент для проверки данных связанных доменов. Поскольку параметры команд могут различаться в зависимости от ОС и релизов тулчейна, перед запуском диагностических процедур проверьте доступные параметры с помощью swcutil --help:
# 0. Подтверждение доступных параметров (синтаксис может отличаться в зависимости от ОС и тулчейна)
swcutil --help
# 1. Распаковка экспортированного архива IPA
unzip -q YourApp.ipa -d UnpackedApp
# 2. Извлечение и проверка подписанных энтайтлментов напрямую из бинарного файла
codesign -d --entitlements :- "UnpackedApp/Payload/YourApp.app" > signed-entitlements.plist 2>/dev/null
/usr/libexec/PlistBuddy -c "Print" signed-entitlements.plist
# 3. Проверка возможности загрузки данных AASA для домена с помощью swcutil (диагностическая утилита macOS)
sudo swcutil dl -d custom.opwakeup.com
# 4. Проверка сопоставления шаблона AASA с определенным URL с помощью swcutil
sudo swcutil verify -d custom.opwakeup.com -j ./apple-app-site-association -u https://custom.opwakeup.com/product/123
# 5. Прямой запрос диагностического эндпоинта CDN связанных доменов под управлением Apple
curl -i https://app-site-association.cdn-apple.com/a/v1/custom.opwakeup.com
Проверяйте эндпоинт CDN связанных доменов Apple при устранении неполадок с доставкой AASA на периферию. Рассматривайте этот эндпоинт как диагностическую инфраструктуру, а не как публичный контракт API.
Шаг 4: Использование режима разработчика для связанных доменов при тестировании AASA
Согласно документации Apple по настройке связанных доменов, Apple предоставляет альтернативный режим для разработки. Режим разработчика (developer, ?mode=developer) позволяет подходящим для разработки устройствам обходить CDN Apple и загружать файл AASA напрямую с исходного веб-сервера по протоколу HTTPS.
Ниже приведена конфигурация, демонстрирующая объявление режима разработчика в отдельных конфигурациях энтайтлментов Xcode:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:custom.opwakeup.com</string>
</array>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:custom.opwakeup.com?mode=developer</string>
</array>
</dict>
</plist>
После того как операционная система установит ассоциацию доменов, маршрутизация на уровне приложения обрабатывает входящие URL-пакеты с помощью стандартных делегатов жизненного цикла UIKit или SwiftUI:
import UIKit
// ----------------------------------------------------------------------------
// 1. Реализация UIKit AppDelegate
// ----------------------------------------------------------------------------
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
return true
}
// Стандартный callback продолжения Universal Link в Apple
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL else {
return false
}
print("Обработка проверенной Universal Link: \(incomingURL.absoluteString)")
// Передача incomingURL во внутренний роутер или слой SDK для извлечения параметров
return handleIncomingRoute(incomingURL)
}
private func handleIncomingRoute(_ url: URL) -> Bool {
// Логика маршрутизации назначения на уровне приложения
// Примечание: Возврат true означает, что приложение обработало активность, а не то, что разбор URL прошел успешно.
return true
}
}
// ----------------------------------------------------------------------------
// 2. Реализация жизненного цикла SceneDelegate (iOS 13+)
// ----------------------------------------------------------------------------
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let userActivity = connectionOptions.userActivities.first(where: { $0.activityType == NSUserActivityTypeBrowsingWeb }),
let incomingURL = userActivity.webpageURL {
print("Universal Link при холодном запуске: \(incomingURL.absoluteString)")
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL {
print("Universal Link на переднем плане: \(incomingURL.absoluteString)")
}
}
}
Чтобы включить режим разработчика на стороне клиента на физическом устройстве:
- На iOS 16+ перейдите в меню Настройки > Конфиденциальность и безопасность > Режим разработчика (Settings > Privacy & Security > Developer Mode) и включите его (требуется перезагрузка устройства).
- Перейдите в меню Настройки > Разработчик > Разработка связанных доменов (Settings > Developer > Associated Domains Development) и переведите переключатель в положение ВКЛ.
- Установите девелоперскую сборку, подписанную профилем провизионирования для разработки, содержащим энтайтлмент
?mode=developer. - Примечание для продакшена: Оставляйте параметр
?mode=developerтолько для разработки и конфигураций внутреннего тестирования, не включая его в энтайтлмент связанных доменов для продакшена, если ваше развертывание прямо не требует и не поддерживает эту конфигурацию.
Дерево принятия решений для поиска первопричин
Universal Link переключается на веб-обработку
│
├── Совпадает ли подписанный application-identifier с appIDs в AASA?
│ ├── НЕТ ──> Исправьте App ID Prefix или Bundle ID в AASA
│ └── ДА
│
├── Указан ли точный домен в энтайтлменте associated-domains?
│ ├── НЕТ ──> Добавьте applinks:<domain> в энтайтлменты таргета
│ └── ДА
│
├── Успешно ли выполняется sudo swcutil dl -d <domain>?
│ ├── НЕТ ──> Исправьте HTTPS на источнике, TLS-сертификаты или редиректы 301/302
│ └── ДА
│
├── Соответствует ли путь целевого URL по результатам sudo swcutil verify?
│ ├── НЕТ ──> Исправьте синтаксис components или paths в AASA
│ └── ДА
│
└── Проверьте состояние ассоциации на устройстве и обработчики маршрутизации внутри приложения

Диагностическая матрица: первопричины сбоев Universal Links
| Тип сбоя | Основная первопричина | Наблюдаемое поведение системы | Рекомендуемое устранение |
|---|---|---|---|
| Опечатка в Bundle ID | Учет регистра или несоответствие символов в appIDs файла AASA |
Ссылка открывает браузер вместо нативного приложения | Исправьте строку в JSON AASA и выполните повторное развертывание на источник |
| Несоответствие префикса App ID | Использование неверного префикса вместо фактического Developer App ID Prefix | Ассоциация домена завершается сбоем при установке | Проверьте префикс идентификатора приложения в Apple Member Center |
| Несоответствие поддомена | Энтайтлмент указывает на www.example.com, в то время как AASA находится на example.com |
Приложение не может перехватить ссылки с поддомена | Разместите отдельный файл AASA на каждом заявляемом поддомене или настройте wildcard |
| HTTP-редирект на эндпоинте | Исходный сервер возвращает редирект 301 или 302 для URL AASA | Скрапер CDN Apple отклоняет файл AASA | Настройте веб-сервер на прямой возврат кода 200 OK |
| Несогласованность формата AASA | Смешивание устаревших appID/paths с современными appIDs/components |
Несогласованное или частичное сопоставление путей | Стандартизируйте синтаксис на современные appIDs + components |
| Несоответствие шаблона URL | AASA успешно загружается, но запрошенный URL не соответствует шаблонам | Ссылка открывается в веб-браузере | Проверьте синтаксис путей и компонентов с помощью swcutil verify |
| Режим разработчика оставлен в релизе | Дистрибутивная сборка сохраняет альтернативный режим разработки | Нестандартный энтайтлмент в релизной сборке | Удалите ?mode=developer в конфигурации релизной сборки |

Реализация конфигурации для двух сред в Xcode
Управление несколькими конфигурациями сборки (Debug, Staging, Production)
Пайплайны разработки на уровне предприятия часто управляют различными Bundle ID в средах сборки (например, com.example.app.debug, com.example.app.staging, com.example.app).
Для поддержания работоспособности Universal Links во всех конфигурациях сборки:
-
Явные объявления AASA: Размещаемый файл AASA должен явно перечислять полностью квалифицированный идентификатор приложения каждой среды в своем массиве
appIDs:"appIDs": [ "9JA723G82S.com.example.app", "9JA723G82S.com.example.app.staging", "9JA723G82S.com.example.app.debug" ] -
Энтайтлменты под конкретный таргет: Используйте настройки конфигурации сборки Xcode для привязки отдельных файлов
.entitlementsпод каждую конфигурацию сборки, гарантируя, что продакшн-домены не опрашиваются внутренними отладочными сборками.
Управление идентификаторами таргетов
Для поиска и устранения неполадок Universal Links используйте точный Bundle ID и префикс идентификатора приложения из подписанной сборки, вместо того чтобы полагаться на подстановочные идентификаторы (wildcard). Обрабатывайте каждое доменное имя явно: если приложение заявляет права на example.com и www.example.com, настройте соответствующие записи связанных доменов и убедитесь, что каждое доменное имя обслуживает соответствующие данные AASA. Убедитесь, что энтайтлмент настроен на таргете, который фактически обрабатывает Universal Links, и проверяйте любые апп-экстеншены или таргеты watchOS отдельно, если применимо.
Проверка внедренных профилей провизионирования и подписанных бинарных файлов в CI/CD
Автоматизируйте проверку энтайтлментов и идентификаторов приложения внутри скриптов сборки непрерывной интеграции (CI) перед загрузкой бинарных файлов в TestFlight:
# Автоматизированный скрипт валидации для CI
security cms -D -i /path/to/embedded.mobileprovision > provision.plist
# 1. Проверка энтайтлментов профиля на разрешенные связанные домены
/usr/libexec/PlistBuddy -c "Print :Entitlements:com.apple.developer.associated-domains" provision.plist
# 2. Извлечение фактических подписанных энтайтлментов из скомпилированного бинарника
codesign -d --entitlements :- "UnpackedApp/Payload/YourApp.app" > signed-entitlements.plist 2>/dev/null
SIGNED_APP_ID=$(/usr/libexec/PlistBuddy -c "Print :application-identifier" signed-entitlements.plist)
echo "Извлеченный подписанный идентификатор приложения: $SIGNED_APP_ID"
# 3. Проверка того, что подписанные связанные домены соответствуют целевому домену
/usr/libexec/PlistBuddy -c "Print :com.apple.developer.associated-domains" signed-entitlements.plist
# 4. Проверка наличия подписанного App ID в размещенном файле AASA с помощью Python
python3 -c "
import json, sys
signed_id = sys.argv[1]
data = json.load(open('apple-app-site-association'))
app_ids = [app for detail in data.get('applinks', {}).get('details', []) for app in detail.get('appIDs', [])]
if signed_id not in app_ids:
print(f'Несоответствие AASA: {signed_id} не найден в appIDs AASA: {app_ids}')
sys.exit(1)
print(f'Проверка согласованности AASA успешно пройдена: {signed_id} зарегистрирован')
" "$SIGNED_APP_ID"
Если скрипт проверки завершается с кодом ошибки, прервите конвейер сборки, чтобы предотвратить поставку неработоспособных бинарных файлов диплинкинга в продакшн.

Критерии сопоставления Universal Links
Для обеспечения надежной маршрутизации должны одновременно выполняться следующие условия:
Конфигурация подписанного приложения:
application-identifier = <ApplicationIdentifierPrefix>.<CFBundleIdentifier>
com.apple.developer.associated-domains = applinks:<hostname>
Конфигурация AASA:
appIDs = [..., "<ApplicationIdentifierPrefix>.<CFBundleIdentifier>", ...]
components / paths = Соответствие путей целевого URL и параметров запроса
Системные требования (элиgибельность):
1. Энтайтлмент связанных доменов явно содержит целевое доменное имя.
2. Подписанный идентификатор приложения совпадает с авторизованной записью в appIDs домена.
3. Входящий URL удовлетворяет шаблонам маршрутизации AASA.
4. Состояние ассоциации на устройстве и контекст пользователя/браузера разрешают делегирование нативному приложению.
Даже когда энтайтлмент, ассоциация AASA и шаблон URL полностью совпадают, наблюдаемая маршрутизация все равно может зависеть от состояния устройства, контекста пользователя или браузера. Например, когда пользователь нажимает на universal link, уже просматривая тот же домен в Safari, операционная система может учесть намерение пользователя остаться в Safari.
Часто задаваемые вопросы (FAQ)
Каков точный формат идентификатора приложения в файле AASA?
Почему моя ссылка Universal Link работает в режиме разработчика (Developer Mode), но не работает в продакшене?
Могу ли я использовать символы подстановки (wildcard звёздочки) в массиве appIDs файла AASA?
Резюме и фреймворк принятия решений
Надежность маршрутизации Universal Links зависит от точного посимвольного соответствия в трех узлах: конфигурации App ID на портале Apple Developer Portal, энтайтлменте Xcode com.apple.developer.associated-domains и размещенном JSON-файле apple-app-site-association. Сторонний SDK или фреймворк маршрутизации не может исправить сбой ассоциации доменов на уровне операционной системы; он может лишь обработать URL после того, как iOS успешно передаст Universal Link в приложение. Если Universal Links корректно связаны на уровне операционной системы, но извлечение параметров не удается, проверяйте слой маршрутизации на уровне приложения отдельно от слоя ассоциации доменов.
Если вашему приложению также требуется восстановление параметров динамических ссылок (dynamic-link) и маршрутизация онбординга после успешной ассоциации Universal Link, OpoInstall предоставляет опциональный слой SDK для этого рабочего процесса на уровне приложения.
Чтобы узнать больше о паттернах конфигурации доменов и интеграции диплинков, ознакомьтесь с документацией OpoInstall по диплинкам.
Связанные материалы
-
Концепции: Проверка идентификатора приложения (Application Identifier), валидация схемы AASA, кэширование CDN Apple, извлечение энтайтлментов
-
Технологии: iOS Universal Links, энтайтлменты Xcode, Apple Developer Portal, общие веб-учетные данные (Shared Web Credentials)
-
Стандарты: IETF RFC 8259 (передача данных JSON), спецификация TLS 1.3
-
Диагностические инструменты: Инструмент командной строки Apple
codesign, утилита macOSswcutil, запрос к кэшу CDN под управлением Apple
Официальная документация
Share this article



