Resumen
Las páginas de ayuda, los términos y las políticas de privacidad deben abrirse dentro de la app, no sacar al usuario a un navegador. El estado de la red decide si avisar antes de hacer streaming con datos móviles. Una comprobación con huella dactilar o Face ID sustituye a escribir una contraseña en un dispositivo compartido. KlugSystem cubre los tres casos con los componentes propios del sistema.
El navegador integrado es un Chrome Custom Tab en Android (sin necesidad de bibliotecas adicionales) y SFSafariViewController en iOS, con el color de barra de herramientas que elijas; tu app recibe un aviso cuando el usuario vuelve. El estado de la red informa de la conectividad y de Wi-Fi frente a datos móviles, y envía un evento cuando cambia. La biometría usa BiometricPrompt en Android 9+ y LocalAuthentication en iOS; los fallos llegan con los mismos códigos de error en ambas plataformas, así que un único manejador funciona en todas partes.
KlugSystem se incluirá en la próxima versión de nuestras apps, nuestra prueba de concepto, para las páginas de ayuda, el aviso de datos móviles y la confirmación del cierre de sesión de un dispositivo.
Funciones
- Autónoma: una ANE, sin biblioteca central ni ANE de dependencias que añadir
- Navegador integrado: Chrome Custom Tab (Android) / SFSafariViewController (iOS), color de la barra de herramientas, evento de cierre
- Red: conectividad, Wi-Fi o datos móviles, eventos de cambio (ConnectivityManager / NWPathMonitor)
- Biometría: huella dactilar y Face ID / Touch ID con tu texto de motivo y la etiqueta de cancelar
- Mismos códigos de error en ambas plataformas (cancelar, alternativa, bloqueado, sin registrar)
- Sin bibliotecas de terceros; en Android la valoración en la tienda usa la propia biblioteca de reseñas de Google Play
- Comprobación isSupported, por lo que el mismo código funciona en todas las plataformas
Plataformas compatibles
Los dispositivos sin sensor biométrico informan canAuthenticate = false, para que tu app pueda recurrir a la contraseña.
Primeros pasos
Añade la extensión al descriptor de tu aplicación:
<extensions>
<extensionID>com.klug.system</extensionID>
</extensions>
Android: añade USE_BIOMETRIC, USE_FINGERPRINT y ACCESS_NETWORK_STATE a las adiciones del manifiesto. iOS: añade NSFaceIDUsageDescription a InfoAdditions.
Ejemplos de código
Cinco flujos completos. Cada llamada devuelve de inmediato; los resultados del navegador, la red y la biometría llegan como eventos de tipo KlugSystem.*. Documentación 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 ); }
Resumen de la API
| KlugSystem.getInstance() | Devuelve la instancia única. |
| isSupported | Verdadero donde existe la parte nativa (iOS y Android). |
| openBrowser(url, toolbarColor) | Abre el navegador integrado, color de la barra de herramientas 0xRRGGBB (blanco por defecto). Devuelve false si no pudo abrirse; BROWSER_CLOSED cuando el usuario vuelve. |
| isReachable() / isWWAN() | En línea en general / con datos móviles. |
| startNetworkWatch() / stopNetworkWatch() | NETWORK_CHANGE en cada cambio; lee isReachable() e isWWAN() en el manejador. |
| canAuthenticate(type) | Verdadero si la biometría está disponible y registrada. iOS: BIOMETRY_FINGERPRINT = Touch ID, BIOMETRY_FACE = Face ID. Android 9+: BIOMETRY_FINGERPRINT = cualquier biometría, BIOMETRY_FACE siempre falso. |
| authenticate(reason, cancelLabel) | Muestra el aviso del sistema; AUTH_SUCCESS o AUTH_FAILED. Devuelve false si no se puede mostrar ningún aviso (Android anterior a 9). |
| lastAuthError | Error del último AUTH_FAILED, con los números de iOS en ambas plataformas: -1 falló, -2 cancelar, -3 alternativa, -4 cancelación del sistema, -6 no disponible, -7 sin registrar, -8 bloqueado. |
| cancelAuthenticate() | Cierra un aviso en curso. |
| requestReview() | Solicita a la App Store o a Google Play el diálogo de valoración integrado; la tienda decide si se muestra. |
| BIOMETRY_FINGERPRINT, BIOMETRY_FACE | Tipos para canAuthenticate(): 1 y 2. |
Eventos
| BROWSER_CLOSED | El navegador integrado se cierra: Done en iOS, vuelta a tu app en Android. |
| NETWORK_CHANGE | La red cambió (tras startNetworkWatch()). |
| AUTH_SUCCESS | Se confirmó la identidad del usuario. |
| AUTH_FAILED | Sin confirmación; el motivo está en lastAuthError. |
Compra KlugSystem
Una licencia anual para una aplicación AIR, con todas las actualizaciones durante 12 meses. Tras el pago recibes la extensión, la biblioteca ActionScript y la documentación por e-mail, normalmente en un día hábil. Licencia y términos
- Licencia para una aplicación AIR
- Todas las actualizaciones durante 12 meses
- Sin soporte
- Licencia para una aplicación AIR
- Todas las actualizaciones durante 12 meses
- Respuesta por e-mail en un plazo de 7 días
- Licencia para una aplicación AIR
- Todas las actualizaciones durante 12 meses
- Respuesta por e-mail en un plazo de 48 horas
Requisitos
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 o posterior |
| Android | Android 6 o posterior; biometría Android 9 o posterior |
| Permisos | Android: USE_BIOMETRIC, USE_FINGERPRINT, ACCESS_NETWORK_STATE · iOS: NSFaceIDUsageDescription |