## Universal Links

1. [Теория Universal Links](https://habr.com/ru/articles/423315/)
2. Подробная информация об универсальных ссылках в [официальной документации Apple](https://developer.apple.com/videos/play/wwdc2020/10098/)

Универсальные ссылки позволяют открывать web-ссылку в мобильном приложении, если оно установлено, а если приложения нет – открывается страница платформы в веб браузере.

> Пример: https://<domain.com>/platform/support/pages/profile/7905

В отличие от [deeplink](./4.2.2.2%20Deeplink.md), Universal Links открывают ваше приложение напрямую, без запроса у пользователя, создавая более интегрированный и удобный для пользователя опыт.

![universal_links](/pictures/IosDevTools/universal_links.png?raw=true)

Поэтому можно не задумываться о наличии у пользователя приложения, переход по ссылкам из почты и мессенджеров будет всегда работать. Также это полезно при рассылках по почте – с компьютера будет открыт браузер и Почта в нем, а на айфоне приложение.

### 1) Xcode

Связать приложение с доменом (домен может быть как собственный, так и рекламных трекеров) в настройках приложения через XCode;

### 2) AASA

У iOS есть список [Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains) всех приложений, которые установлены сейчас на телефоне. 

iOS соотносит с каждым appID приложения из этого списка и проверяет, установлено ли приложение или нет:

* appID присутствует => iOS пытается открыть ее, __как универсальную__;
* iOS не нашла ни одного установленного appID - ссылка __открывается в Safari__;

Если приложение установлено, то далее идет поиск универсальная ссылки по [paths](/2%20ComputerScience/2.3%20Networking/2.3.1%20API/2.3.1.3%20URI\URL\URN.md), где path одна из paths в **apple-app-site-association (AASA)**:

* если она начинается с [Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains)/path - __откроется приложение__. 
* Если среди paths установленных приложений нет подходящего, то ссылка __открывается в Safari__.

Файл AASA должен быть размещен в **JSON-формате без расширений** на сервере вашего веб-сайта с определенным [URL](/2%20ComputerScience/2.3%20Networking/2.3.1%20API/2.3.1.3%20URI\URL\URN.md)-путем. Этот файл должен быть храниться в **корневом каталоге домена**, доступного по [**HTTPS**](/2%20ComputerScience/2.3%20Networking/2.3.2%20Web/2.3.2.3%20Protocols.md), поэтому убедитесь, что на вашем веб-сайте установлен сертификат SSL.

> [Убедитесь](https://stackoverflow.com/questions/74866698/how-do-i-access-apples-aasa-validator-app-search-api-validation-tool), что файл имеет правильный формат и соответствует спецификациям Apple

Файл должен быть доступен по адресу `https://<mydomain>/apple-app-site-association` и убедитесь, что тип содержимого файла - application/json. Файл должен иметь следующее содержание:

```swift
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAM_ID.APP_BUNDLE_ID",
        "paths": [ "/path/to/content/*", "/another/path/*" ]
      }
    ]
  }
}
```

После того, как вы сгенерировали и разместили файл AASA, вам нужно будет настроить свой веб-сайт для поддержки Universal Links. Это включает в себя добавление некоторой HTML-разметки и метаданных на страницы вашего веб-сайта.

Разметка HTML включает добавление тега ссылки «apple-app-site-association» в раздел заголовка вашего HTML-документа, указывающего на местоположение вашего файла AASA. Кроме того, вам нужно будет добавить метатег «applinks», чтобы указать проверенный домен веб-сайта.


### 3) Обработка универсальных ссылок внутри iOS приложения

Внутри приложения универсальные ссылки можно обрабатывать, реализуя специальный метод UIApplicationDelegate делегата приложения — `application:continueUserActivity:restorationHandler:`.

```swift
// ⭐️ - 8.1) universal link (Пример: https://...)
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool 
```

На рисунке это 8.1 метод:

![AppMethodLifeCycleWithUniversalLink](/pictures/IosDevTools/AppMethodLifeCycleWithHelper.jpg?raw=true)

iOS вызовет 8.1 метод и описанную реализацию дальнейшего потока приложения при нажатии универсальной ссылки, настроив поведение и перенаправление на основе входящей активности пользователя.

### [Deeplink](./4.2.2.2%20Deeplink.md) vs Universal Links

1) Установка приложения
* Универсальные ссылки устраняют необходимость установки приложения и предлагают более плавный путь;
* Deeplink не будут работать без предустановленного приложения;

2) Разные методы внутри UIApplicationDelegate
* Универсальные ссылки - `application:continueUserActivity:restorationHandler:` метод;
* Deeplink - `open url: URL` метод;

3) Поиск в Xcode
* Универсальные ссылки - Scheme - Signing & Capabilities - Associated Domains - applinks:...; 
* Deeplink - Scheme - Info - URL Types - URL schemes;

4) Безопасность
* Универсальные ссылки - имеют SSL сертификат;
* Deeplink - не имеют

------

[4.2.2.2 DeepLink Theme](./4.2.2.2%20Deeplink.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.2.3 Persistance Theme Folder](../4.2.3%20Persistence/)
