← Todas as extensões

Extensão nativa

KlugRegister

com.klug.register.KlugRegister

NÃO É NECESSÁRIO APM. Baixe e aproveite. Não tem como ser mais simples.

Cria códigos QR e os lê com um leitor nativo de câmera em tela cheia, de modo que um segundo dispositivo pode ser conectado apontando sua câmera para o primeiro, sem digitar nome de usuário nem senha.

AndroidiOSmacOSiPad no Mac Em produção A partir de €19 / ano · Comprar

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

Android criar + ler
iOS criar + ler · arm64
macOS criar + ler (macOS 13+) · arm64 · x86_64
iPad no Mac criar + ler

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:

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

Para a leitura no iOS, adicione uma descrição de uso da câmera às InfoAdditions:

app.xml · 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 →

1 · Mostrar um código de pareamento no primeiro dispositivo
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 · Ler o código no segundo dispositivo
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 · Resgatar o código com o seu servidor
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 · Cancelamento e erros
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 );
    }
}

Visão geral da API

KlugRegister.getInstance()Retorna a instância única.
isSupportedVerdadeiro onde códigos QR podem ser criados (Android, iOS, macOS).
isScanSupportedVerdadeiro 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.
KlugRegisterEventtext, errorCode, errorMessage.

Eventos

KlugRegisterEvent.SCANNEDUm código foi lido; e.text contém o seu conteúdo.
KlugRegisterEvent.CANCELEDO usuário fechou o leitor.
KlugRegisterEvent.ERRORe.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

Simples
€19 / ano
  • Licença para um app AIR
  • Todas as atualizações por 12 meses
  • Sem suporte
Comprar Simples
Padrão
€149 / ano
  • Licença para um app AIR
  • Todas as atualizações por 12 meses
  • Resposta por e-mail em até 7 dias
Comprar Padrão
Prioritário
€299 / ano
  • Licença para um app AIR
  • Todas as atualizações por 12 meses
  • Resposta por e-mail em até 48 horas
Comprar Prioritário
Os impostos são calculados no checkout pelo Link (Stripe). Você informa o ID do aplicativo do seu app AIR durante o checkout.

Requisitos

AIR SDK51.x (HARMAN)
AndroidAndroid 6 ou posterior, Google Play Services (leitor)
iOSiOS 13 ou posterior
macOSmacOS 10.15 ou posterior (criação de códigos QR); macOS 13 ou posterior para leitura
PermissõesiOS e macOS: câmera, para leitura (NSCameraUsageDescription); Android: nenhuma