Обзор
Многим приложениям нужно второе устройство: камера и зритель, телефон и планшет, киоск и телефон администратора. Именно на входе на этом втором устройстве пользователи сдаются: нужно вспомнить имя пользователя, ввести пароль или ждать код из 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, подключаются автоматически при упаковке приложения
Поддерживаемые платформы
Там, где функция недоступна, isSupported и isScanSupported возвращают false, поэтому один и тот же код можно оставить в любом приложении.
Начало работы
Добавьте расширение в дескриптор вашего приложения:
<extensions>
<extensionID>com.klug.register.KlugRegister</extensionID>
</extensions>
Для сканирования на iOS добавьте описание использования камеры в InfoAdditions:
<key>NSCameraUsageDescription</key> <string>Scan the QR code of your first device</string>
Примеры кода
Четыре полных сценария подключения второго устройства. Создание кода выполняется мгновенно; результат сканирования приходит как KlugRegisterEvent. Полная документация →
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 ); } }
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" ); }
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 ); }
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() | Возвращает единственный экземпляр. |
| isSupported | True там, где можно создавать QR-коды (Android, iOS, macOS). |
| isScanSupported | True там, где доступен сканер: Android, iOS и macOS 13 или новее с камерой. |
| createQRCode(text, modulePx) | Возвращает QR-код как BitmapData, чёрный на белом, со свободной зоной в 4 модуля; modulePx пикселей на модуль (по умолчанию 8). Null, если создать код не удалось. |
| scanQRCode(hint, cancelTitle) | Открывает сканер: на весь экран на iOS, в виде листа на Mac, сканер Google на Android (подсказка и заголовок там не используются). Результат приходит как событие. Возвращает false, если сканер уже открыт. |
| KlugRegisterEvent | text, errorCode, errorMessage. |
События
| KlugRegisterEvent.SCANNED | Код считан; e.text содержит его содержимое. |
| KlugRegisterEvent.CANCELED | Пользователь закрыл сканер. |
| KlugRegisterEvent.ERROR | e.errorCode: denied (нет разрешения на камеру) · nocamera на iOS и macOS; scanner · empty на Android. Подробности в e.errorMessage. |
Купить KlugRegister
Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Без поддержки
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 7 дней
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 48 часов
Требования
| AIR SDK | 51.x (HARMAN) |
| Android | Android 6 или новее, службы Google Play (сканер) |
| iOS | iOS 13 или новее |
| macOS | macOS 10.15 или новее (создание QR-кодов); macOS 13 или новее для сканирования |
| Разрешения | iOS и macOS: камера для сканирования (NSCameraUsageDescription); Android: нет |