Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Expand
titleОглавление...

Table of Contents
 

Общая информация

Эта статья описывает интеграцию устройств Рутокен Описание интеграции устройств Рутокен в мобильные приложения для платформы Android   без использования приложения "Панель управления Рутокен" .

...

располагается на https://github.com/AktivCo/

...

android

...

-

...

Поддерживаемые версии Android

Android 7.0 (API Level 24) и выше.

Настройка зависимостей в проекте

Для встраивания необходимо добавить в зависимости библиотеку rtpcscbridge

...

titleGradle (Groovy DSL)
Code Block
implementation 'ru.rutoken.rtpcscbridge:rtpcscbridge:1.0.0'

...

titleGradle (Kotlin DSL)
Code Block
implementation("ru.rutoken.rtpcscbridge:rtpcscbridge:1.0.0")
Tip

Библиотека доступна в репозитории Maven Central.

Инициализация библиотеки

Точкой входа встраивания является класс ru.rutoken.rtpcscbridge.RtPcscBridge, который необходим для инициализации библиотеки rtpcscbridge.

Для каждого процесса приложения, в котором происходит взаимодействие с устройствами Рутокен, необходимо вызвать статический метод setAppContext и передать ему в качестве параметра Android application context.

Типичное место вызова метода – внутри onCreate() класса-наследника Application.

Code Block
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RtPcscBridge.setAppContext(this);
    }
}

Режимы работы библиотеки

С библиотекой можно работать в двух режимах:

...

UI Tab
titleРучной режим

В данном режиме осуществляется явный вызов методов инициализации и финализации встраивания, а также управление считыванием устройств Рутокен с NFC.

Это обеспечивает полный контроль над поведением библиотеки со стороны приложения, например, при необходимости активации встраивания только для некоторых Activity приложения.

UI Tab
titleАвтоматический режим

В данном режиме методы ручного API вызываются автоматически на определенных этапах жизненного цикла приложения.

Библиотека позволяет опционально включить автоматическую обработку NFC-устройств Рутокен для всех Activity, реализующих OnNewIntentProvider.

Остальные устройства Рутокен обрабатываются во всех Activity приложения.

Ручной API

Для работы с библиотекой в Ручном режиме используется интерфейс ru.rutoken.rttransport.RtTransport. Его инстанс можно получить с помощью метода RtPcscBridge.getTransport().

Рекомендуется  следующий порядок вызова API:

...

Порядок
вызова

...

Метод

...

Описание

...

Место вызова

...

Рекомендуется:

  • в методе Activity.onStart;
  • в методе Service.onCreate – в случае использования внутри сервиса.

...

ТОЛЬКО из Main потока в методе Activity.onResume.

...

При получении каждого NFC интента.

Например.
внутри Activity.onNewIntent

...

Рекомендуется:

  • в методе Activity.onStop;
  • в методе Service.onDestroy – в случае использования внутри сервиса.

Автоматический API

Для работы с библиотекой в Автоматическом режиме используется интерфейс ru.rutoken.rttransport.RtTransportExtension. Его инстанс можно получить из метода RtPcscBridge.getTransportExtension().

Для включения Автоматического режима необходимо вызвать метод attachToLifecycleРекомендуемое место вызова: в методе onCreate() внутри класса-наследника Application.

Пример.
Инициализация библиотеки и включение автоматического режима: 

Code Block
languagejava
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RtPcscBridge.setAppContext(this);
        RtPcscBridge.getTransportExtension().attachToLifecycle(this, true);
    }
}

В параметры метода attachToLifecycle дополнительно можно передать флаг useAutoNfcHandling для включения/выключения автоматической обработки устройств Рутокен с NFC.
По умолчанию значение флага – true.

Warning

Автоматическая обработка устройств Рутокен с NFC осуществляется только для тех Activity, которые реализуют OnNewIntentProvider.

Если базовый класс Activity уже реализует интерфейс OnNewIntentProvider (как в случае с ComponentActivity), то явная реализация интерфейса не обязательна.

Для отключения Автоматического режима применяется метод RtTransportExtension.detachFromLifecycle(app).

Если взаимодействие с устройством Рутокен осуществляется на протяжении всей работы приложения, то данный метод можно не применять.

Автоматический API и жизненный цикл приложения

Жизненный цикл автоматического API непосредственно связан с жизненными циклами всех Activity приложения.

Вызов метода RtTransportExtension.attachToLifecycle(app) инициирует следующие операции внутри библиотеки:

  • добавление подписчика ru.rutoken.rttransport.RtTransportProcessLifecycleObserver на жизненный цикл процесса приложения.
  • добавление ru.rutoken.rttransport.RtTransportNfcLifecycleCallbacks в качестве Activity Lifecycle callbacks для данного приложения (если параметр useAutoNfcHandling = true и NFC адаптер физически существует).

Зависимость RtTransport от жизненного цикла Activity

Зависимость поведения RtTransport от жизненного цикла Activity при автоматическом режиме встраивания и включенном автоуправлении NFC приведена ниже:

Image Removed

После перехода первой Activity в состояние Started (событие Lifecycle.Event.ON_START) вызывается инициализация RtTransport.

После перехода последней Activity в состояние Stopped (событие Lifecycle.Event.ON_STOP) вызывается финализация RtTransport. Вызов финализации осуществляется с задержкой, что исключает лишнюю переинициализацию при:

  • смене конфигурации (переворот экрана);
  • быстром переключении между приложениями;
  • быстром переключении на Home screen и обратно.

При включенном автоуправлении NFC дополнительно автоматически вызываются методы:

...

Метод

...

Описание

...

Условия вызова

...

Если метод Activity.onResume() переопределен – при super.onResume()

Иначе  неявно во время перехода в состояние Resumed

...

Если метод Activity.onNewIntent(intent) переопределен – при super.onNewIntent(intent)

Иначе  автоматически во время получения NFC интента

...

Если метод Activity.onPause() переопределен – при super.onPause()

Иначе  неявно во время перехода в состояние Paused

Когда Activity находится в стадии Resumed, библиотека реагирует на события о состоянии NFC адаптера через внутренний BroadcastReceiver:

  • при переходе адаптера в состояние NfcAdapter.STATE_ON, вызывается enableNfcForegroundDispatch;
  • при переходе адаптера в состояние NfcAdapter.STATE_OFF, вызывается disableNfcForegroundDispatch.

Отслеживание подключения (отключения) устройств Рутокен

Встраивание позволяет отслеживать подключение и отключение устройств Рутокен с помощью интерфейса ru.rutoken.rttransport.RtTransport.PcscReaderObserver.

Tip

Отслеживание подключения (отключения) устройств Рутокен может быть полезно при работе через КриптоПро CSP.

Отслеживание устройств доступно в любом режиме использования встраивания.

Для старта отслеживания (в любой момент работы со встраиванием) используются интерфейс ru.rutoken.rttransport.RtTransport и метод addPcscReaderObserver.

Допускается добавление нескольких подписчиков на событияПри добавлении подписчика ему поступят события обо всех подключенных на данный момент к устройству Рутокенах. Для каждого Рутокена будет вызываться метод RtTransport.PcscReaderObserver.onReaderAdded(reader).

Для отключения отслеживания используется метод RtTransport.removePcscReaderObserver.

Warning

Если подписка производится внутри Activity или другого компонента, который может быть создан несколько раз за время жизни приложения, то необходимо своевременно отписываться во избежание утечки памяти.

Пример.
Если подписка была произведена внутри Activity.onStart(), то отписаться следует внутри Activity.onStop().

Требования для встраивания в зависимости от физического интерфейса устройства Рутокен

USB

Для работы с USB-устройствами Рутокен в Ручном режиме необходимо вызвать методы RtTransport.initialize(context) и RtTransport.finalize(context).

Для работы в Автоматическом режиме  необходимо  использовать метод attachToLifecycle(application).

При каждом подключении Рутокена система запрашивает у пользователя разрешение на использование этого USB-устройства.

Note

Выданное пользователем разрешение действует до переподключения Рутокена.

Дополнительных runtime permission  приложению получать не требуется.

Bluetooth

Для работы с Bluetooth-устройствами Рутокен в Ручном режиме необходимо вызвать методы RtTransport.initialize(context) и RtTransport.finalize(context).

Для работы в Автоматическом режиме  необходимо  использовать метод attachToLifecycle(application).

Note

На Android версии 12 и выше требуется самостоятельно запросить permission BLUETOOTH_CONNECT для всех режимов встраивания.

NFC

Для работы с NFC-устройствами Рутокен в Ручном режиме необходимо вызвать все методы раздела "Ручной API".

Для работы в Автоматическом режиме необходимо передать флаг useAutoNfcHandling=true в метод RtTransportExtension.attachToLifecycle(application, boolean)  или использовать метод attachToLifecycle(application)(по умолчанию включает авто-обработку NFC).

Дополнительных runtime permission приложению получать не требуется.

Работа встраивания в многопроцессных приложениях

Корректность работы встраивания не гарантируется при одновременном использовании устройств Рутокен несколькими процессами приложения.

Логирование

Уровень логирования в библиотеках по умолчанию – ERROR.

Для отладки можно расширить логирование до уровня DEBUG, который содержит информацию об:

  • автоматической инициализации встраивания;
  • автоматической финализации встраивания;
  • обнаружении токенов по различным физическим интерфейсам.

Для расширения логирования необходимо вызвать RtPcscBridge.enableDebugLogs() перед началом работы со встраиванием, а именно – до вызова RtPcscBridge.setAppContext.

Конфигурация R8/ProGuard

При включении обфускации приложения для корректной работы библиотеки необходимо прописать следующие правила в proguard-rules.pro:

Code Block
languagejava
-dontwarn ru.rutoken.spi.SpiDevice
-dontwarn ru.rutoken.spi.SpiManager
-keep class ru.rutoken.rtcore.network.methodhandler.** { *; }
-keep class ru.rutoken.rtpcscbridge.** { *; }
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }

При использовании расширенного логирования (уровень DEBUG), для сохранения читаемости логов, необходимо прописать следующие правила в proguard-rules.pro:

...

languagejava

...

standalone-scheme-docs.

Пример приложения, которое демонстрирует работу такой интеграции https://github.com/AktivCo/rutoken-tech-android