Visão geral
Muitos apps precisam de um segundo dispositivo: uma câmera e um visualizador, um celular e um tablet, um quiosque e um celular de administração. É no login nesse segundo dispositivo que os usuários desistem: eles precisam lembrar um nome de usuário, digitar uma senha ou esperar um código por e-mail.
O KlugRegister transforma essa etapa em uma única foto da câmera. O primeiro dispositivo cria um código QR; o segundo dispositivo o lê com um leitor nativo e o app faz o login. O código QR carrega o que o seu app precisar, normalmente um código de uso único do seu servidor, nunca a senha em si.
As duas partes são nativas: os códigos QR são gerados pelo sistema (nítidos em qualquer tamanho, como um BitmapData do AIR pronto para exibir), e o leitor é nativo: uma visualização de câmera em tela cheia com o seu próprio texto de dica no iOS, e o leitor de códigos do Google no Android, que não precisa de nenhuma permissão de câmera.
O KlugRegister roda na versão atual de nossos apps, nossa prova de conceito: após o cadastro, o app mostra um código QR e o segundo dispositivo é pareado em segundos, mesmo logo após instalar o app pela loja.
Recursos
- Autossuficiente: uma ANE, sem biblioteca principal nem ANEs de dependência para adicionar
- Crie códigos QR a partir de qualquer texto ou URL, devolvidos como BitmapData com uma margem de silêncio adequada
- Escolha o tamanho em pixels por módulo, nítido em qualquer tela
- Leitor nativo de câmera em tela cheia, com o seu próprio texto de dica e botão de cancelar
- Solicita a permissão de câmera e informa quando ela é negada
- Android: leitor de códigos do Google, dos Play Services, sem necessidade de permissão de câmera
- Funciona em retrato e paisagem, em celulares e tablets
- iOS e macOS: apenas os frameworks do sistema; Android: ZXing e o leitor de códigos do Google, resolvidos automaticamente quando o app é empacotado
Plataformas compatíveis
Onde um recurso não está disponível, isSupported e isScanSupported retornam false, para que o mesmo código possa permanecer em todos os apps.
Primeiros passos
Adicione a extensão ao descritor do seu aplicativo:
<extensions>
<extensionID>com.klug.register.KlugRegister</extensionID>
</extensions>
Para a leitura no iOS, adicione uma descrição de uso da câmera às InfoAdditions:
<key>NSCameraUsageDescription</key> <string>Scan the QR code of your first device</string>
Exemplos de código
Quatro fluxos completos para parear um segundo dispositivo. Criar um código é imediato; o resultado do leitor chega como um KlugRegisterEvent. Documentação completa →
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 ); } }
Visão geral da API
| KlugRegister.getInstance() | Retorna a instância única. |
| isSupported | Verdadeiro onde códigos QR podem ser criados (Android, iOS, macOS). |
| isScanSupported | Verdadeiro onde o leitor está disponível: Android, iOS e macOS 13 ou posterior com câmera. |
| createQRCode(text, modulePx) | Devolve o código QR como BitmapData, preto sobre branco, com margem de silêncio de 4 módulos; modulePx pixels por módulo (padrão 8). Null se nenhum código pôde ser gerado. |
| scanQRCode(hint, cancelTitle) | Abre o leitor: tela cheia no iOS, uma sheet no Mac, o leitor do Google no Android (dica e título não são usados lá). O resultado chega como um evento. Retorna false se um leitor já está aberto. |
| KlugRegisterEvent | text, errorCode, errorMessage. |
Eventos
| KlugRegisterEvent.SCANNED | Um código foi lido; e.text contém o seu conteúdo. |
| KlugRegisterEvent.CANCELED | O usuário fechou o leitor. |
| KlugRegisterEvent.ERROR | e.errorCode: denied (sem permissão de câmera) · nocamera no iOS e macOS; scanner · empty no Android. Detalhes em e.errorMessage. |
Compre o KlugRegister
Uma licença anual para um app AIR, com todas as atualizações por 12 meses. Após o pagamento, você recebe a extensão, a biblioteca ActionScript e a documentação por e-mail, normalmente em até um dia útil. Licença e termos
- Licença para um app AIR
- Todas as atualizações por 12 meses
- Sem suporte
- Licença para um app AIR
- Todas as atualizações por 12 meses
- Resposta por e-mail em até 7 dias
- Licença para um app AIR
- Todas as atualizações por 12 meses
- Resposta por e-mail em até 48 horas
Requisitos
| AIR SDK | 51.x (HARMAN) |
| Android | Android 6 ou posterior, Google Play Services (leitor) |
| iOS | iOS 13 ou posterior |
| macOS | macOS 10.15 ou posterior (criação de códigos QR); macOS 13 ou posterior para leitura |
| Permissões | iOS e macOS: câmera, para leitura (NSCameraUsageDescription); Android: nenhuma |