← すべての拡張機能

ネイティブ拡張機能

KlugSystem

com.klug.system

APMは不要。ダウンロードしてすぐに使えます。これ以上シンプルにはできません。

あらゆるアプリに必要なシステムサービスを、ひとつの小さな拡張機能で:アプリ内ブラウザでWebページを開き、デバイスがオンラインか、Wi-Fi かモバイルデータかを把握し、指紋や Face ID でユーザーを確認し、ストア評価を依頼できます。

iOSAndroid 本番稼働中 年額€19から · 購入

概要

ヘルプページ、利用規約、プライバシーポリシーは、ユーザーをブラウザに追い出すのではなく、アプリ内で開くべきです。ネットワーク状態は、モバイルデータでのストリーミング前に警告するかどうかを判断します。指紋や 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 チェックにより、同じコードがすべてのプラットフォームで動作

対応プラットフォーム

iOS ブラウザ · ネットワーク · Face ID / Touch ID · arm64
Android ブラウザ · ネットワーク · 指紋認証(Android 9+)

生体認証センサーのないデバイスは canAuthenticate = false を返すため、アプリはパスワード認証にフォールバックできます。

はじめに

アプリケーション記述子に拡張機能を追加します:

app.xml
<extensions>
    <extensionID>com.klug.system</extensionID>
</extensions>

Android:マニフェスト追加分に USE_BIOMETRIC、USE_FINGERPRINT、ACCESS_NETWORK_STATE を追加します。iOS:InfoAdditions に NSFaceIDUsageDescription を追加します。

コード例

5つの完全なフローです。すべての呼び出しは即座に返り、ブラウザ、ネットワーク、生体認証の結果は KlugSystem.* 型のイベントとして届きます。完全なドキュメント →

1 · アプリ内ブラウザでヘルプページを開く
Help.as
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
}
2 · モバイルデータでのストリーミング前に警告する
Network.as
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();
}
3 · 指紋または Face ID でユーザーを確認する
Confirm.as
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
}
4 · ストア評価を依頼する
Rating.as
// 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
5 · クリーンなシャットダウン
Shutdown.as
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_FACEcanAuthenticate() の type:1 と 2。

イベント

BROWSER_CLOSEDアプリ内ブラウザが閉じられました:iOS では「完了」、Android ではアプリに戻ったとき。
NETWORK_CHANGEネットワークが変化しました(startNetworkWatch() の後)。
AUTH_SUCCESSユーザーが確認されました。
AUTH_FAILED確認されませんでした。理由は lastAuthError にあります。

KlugSystem を購入

AIR アプリケーション1つ分の年間ライセンスで、12か月間のすべてのアップデートが含まれます。お支払い後、拡張機能、ActionScript ライブラリ、ドキュメントをメールでお送りします(通常は1営業日以内)。ライセンスと条件

シンプル
€19 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • サポートなし
シンプルを購入
スタンダード
€149 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • 7日以内にメールで回答
スタンダードを購入
プライオリティ
€299 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • 48時間以内にメールで回答
プライオリティを購入
税金は Link(Stripe)によりチェックアウト時に計算されます。チェックアウト時に、AIR アプリのアプリケーションIDを入力してください。

動作要件

AIR SDK51.x(HARMAN)
iOSiOS 13 以降
AndroidAndroid 6 以降。生体認証は Android 9 以降
権限Android:USE_BIOMETRIC, USE_FINGERPRINT, ACCESS_NETWORK_STATE · iOS:NSFaceIDUsageDescription