Visão geral
Páginas de ajuda, termos e políticas de privacidade devem abrir dentro do app, sem jogar o usuário para um navegador. O status da rede decide se é preciso avisar antes de transmitir em dados móveis. Uma verificação por impressão digital ou Face ID substitui a digitação de uma senha em um dispositivo compartilhado. O KlugSystem cobre os três casos com os componentes do próprio sistema.
O navegador integrado é uma Chrome Custom Tab no Android (sem biblioteca extra) e o SFSafariViewController no iOS, com a cor da sua barra de ferramentas; seu app é avisado quando o usuário volta. O status da rede informa a conectividade e Wi-Fi versus dados móveis, e envia um evento quando algo muda. A biometria usa o BiometricPrompt no Android 9+ e o LocalAuthentication no iOS; as falhas vêm com os mesmos códigos de erro nas duas plataformas, então um único handler funciona em todo lugar.
O KlugSystem roda na próxima versão de nossos apps, nossa prova de conceito, para páginas de ajuda, o aviso de dados móveis e a confirmação de logout de um dispositivo.
Recursos
- Autossuficiente: uma ANE, sem biblioteca principal nem ANEs de dependência para adicionar
- Navegador integrado: Chrome Custom Tab (Android) / SFSafariViewController (iOS), cor da barra de ferramentas, evento de fechamento
- Rede: acessível, Wi-Fi ou dados móveis, eventos de mudança (ConnectivityManager / NWPathMonitor)
- Biometria: impressão digital e Face ID / Touch ID com o seu texto de motivo e o rótulo de cancelar
- Mesmos códigos de erro nas duas plataformas (cancelar, alternativa, bloqueado, não cadastrado)
- Sem bibliotecas de terceiros; no Android, a avaliação na loja usa a própria biblioteca de avaliações do Google Play
- Verificação isSupported, para que o mesmo código rode em todas as plataformas
Plataformas compatíveis
Dispositivos sem sensor biométrico informam canAuthenticate = false, para que o seu app possa recorrer à senha.
Primeiros passos
Adicione a extensão ao descritor do seu aplicativo:
<extensions>
<extensionID>com.klug.system</extensionID>
</extensions>
Android: adicione USE_BIOMETRIC, USE_FINGERPRINT e ACCESS_NETWORK_STATE às adições do manifesto. iOS: adicione NSFaceIDUsageDescription às InfoAdditions.
Exemplos de código
Cinco fluxos completos. Cada chamada retorna imediatamente; os resultados do navegador, da rede e da biometria chegam como eventos do tipo KlugSystem.*. Documentação completa →
import com.klug.system.KlugSystem; import flash.events.Event; import flash.net.URLRequest; import flash.net.navigateToURL; var sys:KlugSystem = KlugSystem.getInstance(); sys.addEventListener( KlugSystem.BROWSER_CLOSED, onBrowserClosed ); function openHelp():void { var url:String = "https://example.com/help"; // false: not supported here, or no browser could open the page if ( !sys.isSupported || !sys.openBrowser( url, 0x2B2B2B ) ) // toolbar 0xRRGGBB navigateToURL( new URLRequest( url ) ); } function onBrowserClosed( e:Event ):void { // iOS: the user tapped Done. Android: your app is in the foreground again. refreshAccount(); // your app }
sys.addEventListener( KlugSystem.NETWORK_CHANGE, onNetworkChange ); sys.startNetworkWatch(); // the first event usually arrives right away function onNetworkChange( e:Event ):void { // the event carries no detail: ask for the current state if ( !sys.isReachable() ) showOfflineBanner(); // your app else if ( sys.isWWAN() ) showMobileDataWarning(); // on mobile data else hideBanners(); }
sys.addEventListener( KlugSystem.AUTH_SUCCESS, onAuthOk ); sys.addEventListener( KlugSystem.AUTH_FAILED, onAuthFailed ); function confirmLogout():void { // iOS: 1 = Touch ID, 2 = Face ID. // Android 9+: 1 = any enrolled biometric; 2 is always false there. var bio:Boolean = sys.canAuthenticate( KlugSystem.BIOMETRY_FINGERPRINT ) || sys.canAuthenticate( KlugSystem.BIOMETRY_FACE ); if ( !bio || !sys.authenticate( "Confirm to log out", "Cancel" ) ) askForPassword(); // no sensor, nothing enrolled, or Android below 9 } function onAuthOk( e:Event ):void { logOut(); // your app } function onAuthFailed( e:Event ):void { // iOS error numbers on both platforms if ( sys.lastAuthError == -2 ) return; // the user tapped Cancel askForPassword(); // -3 fallback (iOS), -8 locked out, -4 system cancel, -1 failed }
// after a good moment, for example the tenth successful session if ( sessionCount == 10 ) // your app's counter sys.requestReview(); // the store decides whether the dialog really appears: // iOS at most 3 times in 365 days and never in TestFlight; // Google Play has its own quota and never shows it for sideloaded installs
function leaveScreen():void { sys.stopNetworkWatch(); sys.cancelAuthenticate(); // closes a running prompt; AUTH_FAILED may follow sys.removeEventListener( KlugSystem.NETWORK_CHANGE, onNetworkChange ); sys.removeEventListener( KlugSystem.AUTH_SUCCESS, onAuthOk ); sys.removeEventListener( KlugSystem.AUTH_FAILED, onAuthFailed ); }
Visão geral da API
| KlugSystem.getInstance() | Retorna a instância única. |
| isSupported | Verdadeiro onde a parte nativa está presente (iOS e Android). |
| openBrowser(url, toolbarColor) | Abre o navegador integrado, cor da barra de ferramentas 0xRRGGBB (padrão: branco). Retorna false se não conseguiu abrir; BROWSER_CLOSED quando o usuário volta. |
| isReachable() / isWWAN() | Online de qualquer forma / em dados móveis. |
| startNetworkWatch() / stopNetworkWatch() | NETWORK_CHANGE a cada mudança; leia isReachable() e isWWAN() no handler. |
| canAuthenticate(type) | Verdadeiro se a biometria está disponível e cadastrada. iOS: BIOMETRY_FINGERPRINT = Touch ID, BIOMETRY_FACE = Face ID. Android 9+: BIOMETRY_FINGERPRINT = qualquer biometria, BIOMETRY_FACE sempre falso. |
| authenticate(reason, cancelLabel) | Mostra o prompt do sistema; AUTH_SUCCESS ou AUTH_FAILED. Retorna false se nenhum prompt puder ser exibido (Android abaixo de 9). |
| lastAuthError | Erro do último AUTH_FAILED, com os números do iOS nas duas plataformas: -1 falhou, -2 cancelado, -3 alternativa, -4 cancelado pelo sistema, -6 indisponível, -7 não cadastrado, -8 bloqueado. |
| cancelAuthenticate() | Fecha um prompt em andamento. |
| requestReview() | Pede à App Store ou ao Google Play o diálogo de avaliação dentro do app; a loja decide se ele aparece. |
| BIOMETRY_FINGERPRINT, BIOMETRY_FACE | Tipos para canAuthenticate(): 1 e 2. |
Eventos
| BROWSER_CLOSED | O navegador integrado foi fechado: Concluído no iOS, de volta ao seu app no Android. |
| NETWORK_CHANGE | A rede mudou (após startNetworkWatch()). |
| AUTH_SUCCESS | O usuário foi confirmado. |
| AUTH_FAILED | Sem confirmação; o motivo está em lastAuthError. |
Compre o KlugSystem
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) |
| iOS | iOS 13 ou posterior |
| Android | Android 6 ou posterior; biometria no Android 9 ou posterior |
| Permissões | Android: USE_BIOMETRIC, USE_FINGERPRINT, ACCESS_NETWORK_STATE · iOS: NSFaceIDUsageDescription |