Мобильные приложения и WebView

Виджет KYC работает в браузере, поэтому в мобильное приложение его встраивают через WebView или открывают в системном браузере. Ниже — что нужно настроить, чтобы камера и проверка работали.

Какой способ выбрать

СпособКогда подходитЧто настроить
Страница с виджетом в WebViewПроверка должна идти внутри приложенияРазрешение камеры в приложении и в WebView, см. ниже
Прямая ссылка в системном браузере (Safari View Controller, Custom Tabs)Нужен самый простой путь без настройки WebViewАдрес возврата в сценарии, см. «Прямая ссылка с возвратом»
Страница с виджетом в <iframe>Не рекомендуется — только если без фрейма не обойтисьallow="camera" у фрейма

Общие требования

  • Страница с виджетом открывается по HTTPS с вашего домена. Локальный файл или нестандартная схема адреса не подойдут: браузер не даст камеру, а виджет работает только на разрешённых доменах.
  • Домен страницы добавлен в «Доступ» → «Разрешённые домены». Подробнее — Подключение.
  • Пользователь выдаёт приложению доступ к камере.

iOS (WKWebView)

  1. Добавьте в Info.plist ключ NSCameraUsageDescription с понятным пользователю текстом. Без него приложение не получит камеру.
  2. Включите воспроизведение видео внутри страницы: allowsInlineMediaPlayback = true. Иначе превью камеры откроется в полноэкранном плеере или не появится.
  3. Чтобы WebView не спрашивал разрешение повторно для своей страницы, выдайте его в делегате (iOS 15 и новее).
let config = WKWebViewConfiguration()
config.allowsInlineMediaPlayback = true
config.mediaTypesRequiringUserActionForPlayback = []

let webView = WKWebView(frame: .zero, configuration: config)
webView.uiDelegate = self
webView.load(URLRequest(url: URL(string: "https://your-domain.example/kyc")!))

// WKUIDelegate
func webView(_ webView: WKWebView,
             requestMediaCapturePermissionFor origin: WKSecurityOrigin,
             initiatedByFrame frame: WKFrameInfo,
             type: WKMediaCaptureType,
             decisionHandler: @escaping (WKPermissionDecision) -> Void) {
    decisionHandler(origin.host == "your-domain.example" ? .grant : .prompt)
}

Android (WebView)

  1. Объявите разрешение CAMERA в AndroidManifest.xml.
  2. Запросите CAMERA у пользователя во время работы приложения, до открытия проверки.
  3. Включите JavaScript и хранилище страницы, разрешите автозапуск видео.
  4. Выдайте странице доступ к камере в WebChromeClient.onPermissionRequest — без этого WebView откажет странице, даже если приложению камера разрешена.
<uses-permission android:name="android.permission.CAMERA" />
webView.settings.apply {
    javaScriptEnabled = true
    domStorageEnabled = true
    mediaPlaybackRequiresUserGesture = false
}

webView.webChromeClient = object : WebChromeClient() {
    override fun onPermissionRequest(request: PermissionRequest) {
        val video = PermissionRequest.RESOURCE_VIDEO_CAPTURE
        if (request.origin.host == "your-domain.example" &&
            request.resources.contains(video)) {
            request.grant(arrayOf(video))
        } else {
            request.deny()
        }
    }
}

webView.loadUrl("https://your-domain.example/kyc")

Встроенные браузеры мессенджеров и соцсетей

Ссылка, открытая внутри мессенджера или соцсети, попадает во встроенный браузер, где доступ к камере может быть ограничен. Если проверка не запускается, предложите пользователю открыть ссылку в системном браузере (Safari, Chrome). В своём приложении для той же цели используйте Safari View Controller на iOS и Custom Tabs на Android: в них камера работает как в обычном браузере.

Встраивание в iframe

❗ Не рекомендуется встраивать Web SDK в <iframe>. Подключайте виджет только в основную страницу сайта — как элемент корневого DOM-документа.

Если без фрейма не обойтись, разрешите ему камеру:

<iframe src="https://your-domain.example/kyc" allow="camera"></iframe>

Инлайн-режим (mountElementId) внутри cross-origin iframe не работает — см. Подключение.

Прямая ссылка с возвратом в приложение

Вместо встраивания можно открыть проверку по прямой ссылке в системном браузере, Safari View Controller или Custom Tabs:

https://kyc.neuro-vision.ru/<scenarioId>/<зашифрованный clientKey>
  1. В основных настройках сценария задайте «URL-адрес мобильного перенаправления в случае успеха» — адрес, который ваше приложение умеет перехватить (например, универсальная ссылка или App Link на вашем домене).
  2. По завершении виджет переходит на этот адрес и дописывает ?sessionId=<id сессии>&status=<итоговый статус>: при итоге success — автоматически через 5 секунд, при любом итоге — по кнопке возврата на экране результата.
  3. Приложение перехватывает адрес, закрывает браузер и показывает пользователю следующий шаг.

Статус из адреса — подсказка для интерфейса. Итог проверки берите на сервере из вебхука или запросом статуса сессии. Как собрать ссылку и зашифровать clientKey — Подключение и Работа с clientKey.

Если камера не запускается

ПризнакЧто проверить
Виджет показывает экран «разрешите доступ к камере»Разрешение камеры у приложения в настройках телефона; на Android — onPermissionRequest
Превью камеры открывается на весь экран или чёрное (iOS)allowsInlineMediaPlayback = true
Виджет не открывается на страницеСтраница по HTTPS, домен в «Разрешённых доменах»
Не работает только во встроенном браузере мессенджераОткройте ссылку в системном браузере