Обзор
Справочные страницы, условия и политики конфиденциальности должны открываться внутри приложения, а не выбрасывать пользователя в браузер. Статус сети определяет, нужно ли предупреждать перед трансляцией по мобильным данным. Проверка отпечатка или Face ID заменяет ввод пароля на общем устройстве. KlugSystem охватывает все три задачи с помощью собственных компонентов системы.
Встроенный браузер — это Chrome Custom Tab на Android (дополнительная библиотека не нужна) и SFSafariViewController на iOS, с цветом вашей панели инструментов; приложение узнаёт, когда пользователь вернулся. Статус сети сообщает о доступности и о том, Wi-Fi это или мобильные данные, и отправляет событие при изменении. Биометрия использует BiometricPrompt на Android 9+ и LocalAuthentication на iOS; ошибки приходят с одинаковыми кодами на обеих платформах, поэтому один обработчик работает везде.
KlugSystem работает в следующем выпуске наших приложений, нашего доказательства работоспособности, — для справочных страниц, предупреждения о мобильных данных и подтверждения выхода с устройства.
Возможности
- Автономность: один ANE, без базовой библиотеки и зависимых ANE
- Встроенный браузер: Chrome Custom Tab (Android) / SFSafariViewController (iOS), цвет панели инструментов, событие закрытия
- Сеть: доступность, Wi-Fi или мобильные данные, события изменения (ConnectivityManager / NWPathMonitor)
- Биометрия: отпечаток пальца и Face ID / Touch ID с вашим текстом причины и подписью отмены
- Одинаковые коды ошибок на обеих платформах (отмена, запасной вариант, блокировка, не настроено)
- Без сторонних библиотек; на Android оценка в магазине использует собственную библиотеку отзывов Google Play
- Проверка isSupported, поэтому один и тот же код работает на любой платформе
Поддерживаемые платформы
Устройства без биометрического датчика сообщают canAuthenticate = false, поэтому ваше приложение может вернуться к паролю.
Начало работы
Добавьте расширение в дескриптор вашего приложения:
<extensions>
<extensionID>com.klug.system</extensionID>
</extensions>
Android: добавьте USE_BIOMETRIC, USE_FINGERPRINT и ACCESS_NETWORK_STATE в дополнения манифеста. iOS: добавьте NSFaceIDUsageDescription в InfoAdditions.
Примеры кода
Пять полных сценариев. Каждый вызов возвращается сразу; результаты браузера, сети и биометрии приходят как события типа KlugSystem.*. Полная документация →
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 ); }
Обзор API
| KlugSystem.getInstance() | Возвращает единственный экземпляр. |
| isSupported | True там, где есть нативная часть (iOS и Android). |
| openBrowser(url, toolbarColor) | Открывает встроенный браузер, цвет панели инструментов 0xRRGGBB (по умолчанию белый). Возвращает false, если открыть не удалось; BROWSER_CLOSED, когда пользователь вернулся. |
| isReachable() / isWWAN() | Онлайн вообще / на мобильных данных. |
| startNetworkWatch() / stopNetworkWatch() | NETWORK_CHANGE при каждом изменении; в обработчике читайте isReachable() и isWWAN(). |
| canAuthenticate(type) | True, если биометрия доступна и настроена. iOS: BIOMETRY_FINGERPRINT = Touch ID, BIOMETRY_FACE = Face ID. Android 9+: BIOMETRY_FINGERPRINT = любая биометрия, BIOMETRY_FACE всегда false. |
| authenticate(reason, cancelLabel) | Показывает системный запрос; AUTH_SUCCESS или AUTH_FAILED. Возвращает false, если запрос показать нельзя (Android ниже 9). |
| lastAuthError | Ошибка последнего AUTH_FAILED, числа iOS на обеих платформах: -1 сбой, -2 отмена, -3 запасной вариант, -4 системная отмена, -6 недоступно, -7 не настроено, -8 заблокировано. |
| cancelAuthenticate() | Закрывает открытый запрос. |
| requestReview() | Запрашивает у App Store или Google Play диалог оценки в приложении; магазин сам решает, показывать ли его. |
| BIOMETRY_FINGERPRINT, BIOMETRY_FACE | Типы для canAuthenticate(): 1 и 2. |
События
| BROWSER_CLOSED | Встроенный браузер закрыт: «Готово» на iOS, возврат в приложение на Android. |
| NETWORK_CHANGE | Сеть изменилась (после startNetworkWatch()). |
| AUTH_SUCCESS | Пользователь подтверждён. |
| AUTH_FAILED | Подтверждения нет; причина в lastAuthError. |
Купить KlugSystem
Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Без поддержки
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 7 дней
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 48 часов
Требования
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 или новее |
| Android | Android 6 или новее; биометрия — Android 9 или новее |
| Разрешения | Android: USE_BIOMETRIC, USE_FINGERPRINT, ACCESS_NETWORK_STATE · iOS: NSFaceIDUsageDescription |