概要
ヘルプページ、利用規約、プライバシーポリシーは、ユーザーをブラウザに追い出すのではなく、アプリ内で開くべきです。ネットワーク状態は、モバイルデータでのストリーミング前に警告するかどうかを判断します。指紋や Face ID の確認は、共有デバイスでのパスワード入力の代わりになります。KlugSystem は、この3つをシステム標準のコンポーネントでカバーします。
アプリ内ブラウザは、Android では Chrome Custom Tab(追加ライブラリ不要)、iOS では SFSafariViewController で、ツールバーの色を指定できます。ユーザーが戻ってくると、アプリに通知されます。ネットワーク状態は、到達可能性と Wi-Fi かモバイルデータかを報告し、変化があるとイベントを送信します。生体認証は、Android 9 以降では BiometricPrompt、iOS では LocalAuthentication を使用します。失敗時は両プラットフォームで同じエラーコードが返るため、ひとつのハンドラーがどこでも動作します。
KlugSystem は、ヘルプページ、モバイルデータの警告、デバイスのログアウト確認のために、実証の場である当社のアプリの次のリリースで使われます。
機能
- 自己完結型:ANE 1つで完結し、コアライブラリや依存 ANE の追加は不要
- アプリ内ブラウザ:Chrome Custom Tab(Android)/ SFSafariViewController(iOS)、ツールバーの色、クローズイベント
- ネットワーク:到達可能性、Wi-Fi かモバイルデータか、変更イベント(ConnectivityManager / NWPathMonitor)
- 生体認証:指紋と Face ID / Touch ID。理由テキストとキャンセルラベルを指定可能
- 両プラットフォームで同じエラーコード(cancel、fallback、locked out、not enrolled)
- サードパーティライブラリ不要。Android のストア評価には Google 純正の Play レビューライブラリを使用
- isSupported チェックにより、同じコードがすべてのプラットフォームで動作
対応プラットフォーム
生体認証センサーのないデバイスは canAuthenticate = false を返すため、アプリはパスワード認証にフォールバックできます。
はじめに
アプリケーション記述子に拡張機能を追加します:
<extensions>
<extensionID>com.klug.system</extensionID>
</extensions>
Android:マニフェスト追加分に USE_BIOMETRIC、USE_FINGERPRINT、ACCESS_NETWORK_STATE を追加します。iOS:InfoAdditions に NSFaceIDUsageDescription を追加します。
コード例
5つの完全なフローです。すべての呼び出しは即座に返り、ブラウザ、ネットワーク、生体認証の結果は 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 | ネイティブ部分が存在する環境(iOS と Android)で true になります。 |
| 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。プロンプトを表示できない場合(Android 9 未満)は false を返します。 |
| lastAuthError | 直近の AUTH_FAILED のエラー。両プラットフォームとも iOS の番号を使用:-1 失敗、-2 キャンセル、-3 フォールバック、-4 システムによるキャンセル、-6 利用不可、-7 未登録、-8 ロックアウト。 |
| cancelAuthenticate() | 表示中のプロンプトを閉じます。 |
| requestReview() | App Store または Google Play にアプリ内の評価ダイアログを要求します。表示するかどうかはストアが判断します。 |
| BIOMETRY_FINGERPRINT, BIOMETRY_FACE | canAuthenticate() の type:1 と 2。 |
イベント
| BROWSER_CLOSED | アプリ内ブラウザが閉じられました:iOS では「完了」、Android ではアプリに戻ったとき。 |
| NETWORK_CHANGE | ネットワークが変化しました(startNetworkWatch() の後)。 |
| AUTH_SUCCESS | ユーザーが確認されました。 |
| AUTH_FAILED | 確認されませんでした。理由は lastAuthError にあります。 |
KlugSystem を購入
AIR アプリケーション1つ分の年間ライセンスで、12か月間のすべてのアップデートが含まれます。お支払い後、拡張機能、ActionScript ライブラリ、ドキュメントをメールでお送りします(通常は1営業日以内)。ライセンスと条件
動作要件
| AIR SDK | 51.x(HARMAN) |
| iOS | iOS 13 以降 |
| Android | Android 6 以降。生体認証は Android 9 以降 |
| 権限 | Android:USE_BIOMETRIC, USE_FINGERPRINT, ACCESS_NETWORK_STATE · iOS:NSFaceIDUsageDescription |