Лицензирование
Лицензирование плагинов является принудительным. Прежде чем приступить к разработке плагина, необходимо получить лицензию разработчика, она позволит запустить тестовый экземпляр приложения iikoFront для разработки, отладки и тестирования плагина. Пользователям, устанавливающим уже готовый плагин, необходимо будет приобрести на него лицензию. Этот механизм защищает разработчиков плагинов от их несанкционированного использования, а также позволяет компании iiko контролировать использование некоторых функций.
Схемы лицензирования
С технической точки зрения, есть две схемы лицензирования:
- Плата за экземпляр плагина: ограничивается количество одновременно работающих экземпляров плагина.
- Плата за внешнее подключение к плагину: ограничивается количество одновременно работающих с плагином устройств.
Плата за экземпляр плагина
Данный вариант может применяться для плагинов, предоставляющих законченную функциональность и представляющих самостоятельную ценность. Например, плагин, дублирующий состав текущего заказа на экран покупателя, мог бы лицензироваться по этой схеме. Контроль лицензий осуществляется автоматически приложением iikoFront, плагин будет загружен только при наличии лицензии на него. Для одновременного использования плагина на нескольких терминалах требуется лицензия на соответствующее количество плагинов. Так, если плагин должен быть установлен на 10 терминалов, потребуется лицензия на 10 экземпляров плагина.
Чтобы защитить плагин по этой схеме, необходимо:
- Зарегистрироваться в iiko для получения идентификатора лицензируемого модуля.
- Пометить класс плагина атрибутом
PluginLicenseModuleId, указав полученный при регистрации идентификатор.
Плата за внешнее подключение к плагину
Данная схема применима для плагинов, которые являются посредниками между iikoFront и внешними устройствами. За контроль лицензий в таком случае отвечает плагин. Помимо самого факта включения модуля в лицензию, могут быть установлены дополнительные ограничения, основное из которых — количество слотов. Слот модуля — это своего рода ячейка, которую на время может занять плагин или подключенное к нему устройство. Подключаясь попеременно, два устройства могут обходиться одним слотом, по очереди занимая и освобождая его, но для одновременной работы им понадобится два слота. Например, если плагин обеспечивает работу мобильных терминалов на предприятии, состоящем из двух групп отделений, в каждой из которых установлено по одному экземпляру плагина, и в обеих группах используется по 5 мобильных терминалов, то пользователю необходима лицензия на 10 слотов. Количество работающих экземпляров плагина при этом не учитывается.
Для реализации этой схемы защиты необходимо:
- Зарегистрироваться в iiko для получения идентификаторов двух лицензируемых модулей:
- модуля для самого плагина, как в предыдущем варианте, но здесь это формальность, нужен только для привязки плагина с помощью атрибута
PluginLicenseModuleId, чтобы плагин запускался, на практике это может быть бесплатный модуль без ограничения количества, - модуля для внешних подключений, который и будет использоваться в дальнейшем.
- модуля для самого плагина, как в предыдущем варианте, но здесь это формальность, нужен только для привязки плагина с помощью атрибута
- Реализовать возможность идентификации подключающихся устройств таким образом, чтобы одному устройству всегда соответствовал один и тот же идентификатор.
- При установке внешнего подключения вызвать метод
AcquireSlotсервисаILicensingService, указав полученный при регистрации идентификатор модуля и идентификатор подключающегося устройства. Запомнить ссылку на возвращённый методом объект. - При завершении внешнего подключения вызвать метод
Disposeу объекта, возвращённого методомAcquireSlotпри установке подключения.
При вызове AcquireSlot один из слотов модуля плагина отмечается занятым указанным устройством.
Если свободных слотов нет, метод генерирует исключение InsufficientLicenseException, значит, уже подключено максимально разрешённое количество устройств, и очередному устройству в подключении должно быть отказано.
Необходимо учитывать, что возможность освободить слот есть не всегда: работа плагина или приложения iikoFront может быть прервана внезапным выключением питания компьютера, возможны сетевые проблемы (манипуляции с лицензиями могут требовать сетевого взаимодействия) и прочее. Чтобы избежать «утечки» слотов, когда они занимаются, но не освобождаются, важно обеспечить неизменную идентификацию устройств. Например, если некое устройство подключилось к плагину, заняв один слот, а после внезапной перезагрузки это устройство подключается снова, то, имея прежний идентификатор, оно повторно займёт свой слот, а будь у него новый идентификатор, ему бы понадобился ещё один слот, а первый слот навсегда остался бы занятым.
Регистрация
Разработчику необходимо зарегистрировать свой плагин как лицензируемый модуль в iiko, а пользователю получить лицензию на использование этого модуля.
При регистрации плагину назначается некий идентификатор, целое число, это и будет идентификатором модуля.
Это может быть как новый модуль, созданный специально для этого плагина, так и универсальный, используемый для небольших частных доработок.
Разработчик привязывает плагин к модулю, указывая его идентификатор с помощью атрибута PluginLicenseModuleId.
Пользователю необходимо будет получить лицензию, включающую в себя соответствующий модуль.
Для регистрации, получения лицензии разработчика, получения идентификатора лицензируемого модуля и заключения договора необходимо отправить заявку по адресу api@iiko.ru.
Уникальность ModuleId
Правило
ModuleId (LicenseModuleId) должен быть уникальным для каждого плагина. Если несколько плагинов используют один ModuleId, они начинают конфликтовать между собой.
ModuleId должен совпадать в двух местах:
Manifest.xml(LicenseModuleId)- атрибут
PluginLicenseModuleIdв классе плагина
❗Почему это важно
ModuleId используется как ключ для:
- лицензирования и идентификации плагина
- межплагинной маршрутизации (вызов внешних операций по ModuleId)
- изоляции данных плагина (например, CustomData)
- диагностики и анализа проблем (логи/отчётность)
При дубликатах ModuleId возможны такие эффекты:
- один плагин «съедает» лицензию другого или мешает запуску
- вызовы внешних операций уходят «не тому» плагину или конфликтуют при регистрации
- данные CustomData перемешиваются или перезаписываются
- становится сложнее диагностировать проблемы по логам
Признаки проблемы
- плагин исчезает или заменяется после обновления
- регистрация внешней операции падает с ошибкой вида «already registered»
- плагин читает или получает события CustomData, которые явно относятся к другому плагину
- нестабильное поведение лицензирования при запуске нескольких плагинов
Быстрые проверки
- Сравнить
LicenseModuleIdво всехManifest.xmlустановленных плагинов. - Проверить соответствие между
Manifest.xmlи атрибутомPluginLicenseModuleId. - При использовании межплагинных операций убедиться, что целевой ModuleId принадлежит нужному плагину.
Рекомендации
- Не копируйте ModuleId из чужих плагинов или примеров.
- Форк плагина считается новым продуктом: используйте новый ModuleId.
- Разные версии одного и того же плагина должны сохранять один ModuleId (для корректных обновлений).
- Dev/stage/prod используйте разные ModuleId, если сборки могут сосуществовать на одной установке.
Миграция (смена ModuleId)
Смена ModuleId делает плагин «новым» с точки зрения iikoFront. Это может затронуть:
- лицензирование (может потребоваться другая лицензия)
- ранее сохранённые данные плагина (например, CustomData)
- интеграции, которые обращаются к плагину по ModuleId
Рекомендуется сначала проверить смену ModuleId на тестовом контуре.