← Все расширения

Нативное расширение

KlugRegister

com.klug.register.KlugRegister

APM НЕ НУЖЕН. Скачайте и пользуйтесь. Проще уже некуда.

Создаёт QR-коды и сканирует их нативным полноэкранным сканером камеры, так что второе устройство можно авторизовать, наведя его камеру на первое, без ввода имени пользователя и пароля.

AndroidiOSmacOSiPad на Mac В продакшене От €19 / год · Купить

Обзор

Многим приложениям нужно второе устройство: камера и зритель, телефон и планшет, киоск и телефон администратора. Именно на входе на этом втором устройстве пользователи сдаются: нужно вспомнить имя пользователя, ввести пароль или ждать код из e-mail.

KlugRegister превращает этот шаг в один снимок камерой. Первое устройство создаёт QR-код; второе сканирует его нативным сканером, и приложение выполняет вход. QR-код несёт всё, что нужно вашему приложению, обычно одноразовый код с вашего сервера, но никогда не сам пароль.

Обе части нативные: QR-коды генерирует система (чёткие при любом размере, в виде BitmapData AIR, готового к показу), а сканер — нативный: полноэкранный вид камеры с вашей собственной подсказкой на iOS и сканер кода Google на Android, которому разрешение на камеру вообще не нужно.

KlugRegister работает в текущем выпуске наших приложений, нашего доказательства работоспособности: после регистрации приложение показывает QR-код, и второе устройство подключается за секунды, даже сразу после установки приложения из магазина.

Возможности

  • Автономность: один ANE, без базовой библиотеки и зависимых ANE
  • Создание QR-кодов из любого текста или URL, возвращаются как BitmapData с правильной свободной зоной
  • Размер задаётся в пикселях на модуль, чётко на любом экране
  • Нативный полноэкранный сканер камеры с вашей подсказкой и кнопкой отмены
  • Запрашивает разрешение на камеру и сообщает, если оно отклонено
  • Android: сканер кода Google из служб Play, разрешение на камеру не нужно
  • Работает в портретной и альбомной ориентации, на телефонах и планшетах
  • iOS и macOS: только системные фреймворки; Android: ZXing и сканер кода Google, подключаются автоматически при упаковке приложения

Поддерживаемые платформы

Android создание + сканирование
iOS создание + сканирование · arm64
macOS создание + сканирование (macOS 13+) · arm64 · x86_64
iPad на Mac создание + сканирование

Там, где функция недоступна, isSupported и isScanSupported возвращают false, поэтому один и тот же код можно оставить в любом приложении.

Начало работы

Добавьте расширение в дескриптор вашего приложения:

app.xml
<extensions>
    <extensionID>com.klug.register.KlugRegister</extensionID>
</extensions>

Для сканирования на iOS добавьте описание использования камеры в InfoAdditions:

app.xml · InfoAdditions
<key>NSCameraUsageDescription</key>
<string>Scan the QR code of your first device</string>

Примеры кода

Четыре полных сценария подключения второго устройства. Создание кода выполняется мгновенно; результат сканирования приходит как KlugRegisterEvent. Полная документация →

1 · Показ кода подключения на первом устройстве
PairingCode.as
import com.klug.register.KlugRegister;
import com.klug.register.KlugRegisterEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;

var reg:KlugRegister = KlugRegister.getInstance();

if ( reg.isSupported )   // Android, iOS, macOS
{
    // a short-lived one-time code from your server, never the password
    var bmp:BitmapData = reg.createQRCode( "https://your.server/pair?t=" + oneTimeCode, 10 );
    if ( bmp != null )    // null: no code could be made from the text
    {
        var qr:Bitmap = new Bitmap( bmp );   // black on white, 4-module quiet zone included
        qr.x = ( stage.stageWidth - qr.width ) / 2;
        qr.y = 120;
        addChild( qr );
    }
}
2 · Сканирование на втором устройстве
Scan.as
reg.addEventListener( KlugRegisterEvent.SCANNED,  onScanned );
reg.addEventListener( KlugRegisterEvent.CANCELED, onScanCanceled );
reg.addEventListener( KlugRegisterEvent.ERROR,    onScanError );

function startScan():void
{
    if ( !reg.isScanSupported )
    {
        showCodeEntry();   // your app function: type the one-time code instead
        return;
    }
    // iOS: full-screen scanner with your hint and button; macOS 13+: a sheet on the app window;
    // Android: Google's own localized scanner, hint and cancel title are not used
    if ( !reg.scanQRCode( "Point the camera at the code on your first device", "Cancel" ) )
        trace( "a scanner is already open" );
}
3 · Погашение кода на вашем сервере
Redeem.as
function onScanned( e:KlugRegisterEvent ):void
{
    var prefix:String = "https://your.server/pair?t=";
    if ( e.text.indexOf( prefix ) != 0 )
    {
        showMessage( "This is not a pairing code." );   // your app function
        return;
    }

    var vars:URLVariables = new URLVariables();
    vars.t = e.text.substr( prefix.length );
    var req:URLRequest = new URLRequest( "https://your.server/pair" );
    req.method = URLRequestMethod.POST;
    req.data = vars;

    var loader:URLLoader = new URLLoader();
    loader.addEventListener( Event.COMPLETE, function( ev:Event ):void {
        signInWith( String( loader.data ) );   // your app function: the server's answer
    });
    loader.load( req );
}
4 · Отмена и ошибки
ScanErrors.as
function onScanCanceled( e:KlugRegisterEvent ):void
{
    showPairingScreen();   // the user closed the scanner: back to the screen, no message
}

function onScanError( e:KlugRegisterEvent ):void
{
    switch ( e.errorCode )
    {
        case "denied":     // iOS, macOS: camera permission refused
            showMessage( "Allow camera access in Settings to scan the code." );
            break;
        case "nocamera":   // iOS, macOS: no usable camera
            showCodeEntry();
            break;
        default:           // Android: "scanner" (e.g. scanner not ready yet) or "empty"
            showMessage( "The scanner could not start: " + e.errorMessage );
    }
}

Обзор API

KlugRegister.getInstance()Возвращает единственный экземпляр.
isSupportedTrue там, где можно создавать QR-коды (Android, iOS, macOS).
isScanSupportedTrue там, где доступен сканер: Android, iOS и macOS 13 или новее с камерой.
createQRCode(text, modulePx)Возвращает QR-код как BitmapData, чёрный на белом, со свободной зоной в 4 модуля; modulePx пикселей на модуль (по умолчанию 8). Null, если создать код не удалось.
scanQRCode(hint, cancelTitle)Открывает сканер: на весь экран на iOS, в виде листа на Mac, сканер Google на Android (подсказка и заголовок там не используются). Результат приходит как событие. Возвращает false, если сканер уже открыт.
KlugRegisterEventtext, errorCode, errorMessage.

События

KlugRegisterEvent.SCANNEDКод считан; e.text содержит его содержимое.
KlugRegisterEvent.CANCELEDПользователь закрыл сканер.
KlugRegisterEvent.ERRORe.errorCode: denied (нет разрешения на камеру) · nocamera на iOS и macOS; scanner · empty на Android. Подробности в e.errorMessage.

Купить KlugRegister

Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия

Базовый
€19 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Без поддержки
Купить Базовый
Стандартный
€149 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Ответ по e-mail в течение 7 дней
Купить Стандартный
Приоритетный
€299 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Ответ по e-mail в течение 48 часов
Купить Приоритетный
Налоги рассчитываются при оформлении заказа через Link (Stripe). ID приложения вашего приложения AIR вы указываете при оформлении заказа.

Требования

AIR SDK51.x (HARMAN)
AndroidAndroid 6 или новее, службы Google Play (сканер)
iOSiOS 13 или новее
macOSmacOS 10.15 или новее (создание QR-кодов); macOS 13 или новее для сканирования
РазрешенияiOS и macOS: камера для сканирования (NSCameraUsageDescription); Android: нет