割り当てられたアクセス用のキオスク アプリ: ベスト プラクティス

Windows 10 では、割り当てられたアクセスを使用してキオスク デバイスを作成できます。これにより、ユーザーは 1 つのユニバーサル Windows アプリとのみ対話できます。 この記事では、キオスク アプリを実装する方法とベスト プラクティスについて説明します。

割り当てられたアクセスには、次の 2 つの異なるエクスペリエンスがあります。

  1. シングル アプリ キオスク エクスペリエンス

    1 つのアプリをアカウントに割り当てます。 ユーザーがログインすると、ユーザーはこのアプリにのみアクセスでき、システム上の他のアクセス権は付与されません。 この間、キオスク デバイスはロックされ、キオスク アプリはロック画面の上で実行されます。 このエクスペリエンスは、一般に公開されているキオスク マシンでよく使用されます。 詳細については、「 Windows 10 Pro、Enterprise、または Education でキオスクを設定する」を参照してください。

  2. マルチアプリ キオスク エクスペリエンス (Windows 10 バージョン 1709 以降で利用可能)

    1 つまたは複数のアプリをアカウントに割り当てることができます。 ユーザーがログインすると、デバイスは、選択したアプリのみにアクセスできる制限付きシェル エクスペリエンスで起動します。 詳細については、「 複数のアプリ を実行する Windows 10 キオスクを作成する」を参照してください。

この記事では、単一アプリのキオスク エクスペリエンスについてのみ説明します。 マルチアプリ エクスペリエンスでは、選択したアプリは通常のデスクトップ コンテキストで実行され、特別な処理や変更は必要ありません。

用語

用語 説明
割り当てられたアクセス システム管理者が、デバイスのユーザーに公開されているアプリケーション エントリ ポイントを制限することで、ユーザーのエクスペリエンスを管理できるようにする機能。 たとえば、PC がキオスクのように動作するように、ビジネスの顧客が 1 つのアプリを使用するように制限できます。 指定したアカウントでサインインしたユーザーは、その 1 つのアプリのみを使用できます。 タッチ ジェスチャ、マウス、キーボード、ハードウェア ボタンを使用してアプリを切り替えたり、アプリを閉じたりすることはできません。 また、アプリの通知も表示されません。
ロック画面アプリ (またはロック アプリ) 動的壁紙を設定する機能を利用するか、新しいロック機能拡張フレームワークを利用するアプリケーション。
ロック画面アプリの上 (またはロック アプリの上) ロック画面アプリの実行中にロック画面の上で起動するアプリケーション (デスクトップがロックされている場合など)。
ロック アプリの下 ロック解除された Windows コンテキストで正常に実行されるアプリケーション。
LockApplicationHost 上記のロック画面アプリがデバイスのロック解除を要求し、デバイスのロック解除が開始されたときにアプリの登録を通知できるようにする WinRT クラス。
ビューまたはアプリケーション ビュー 各ビューは、アプリ内の個別のウィンドウです。 アプリはメイン ビューを持ち、必要に応じて複数のセカンダリ ビューを作成できます。 詳細については、 ApplicationView を参照してください。

windows.aboveLockScreen 拡張機能

Windows 10 で割り当てられたアクセスは、ロック フレームワークを使用します。 割り当てられたアクセス ユーザーがログインすると、バックグラウンド タスクによってデスクトップがロックされ、ロックの上にキオスク アプリが起動します。 アプリの動作は、windows.aboveLockScreen 拡張機能を使用するかどうかによって異なる場合があります。

windows.aboveLockScreen を使用すると、キオスク アプリは LockApplicationHost ランタイム クラスにアクセスできます。これにより、アプリはロックの上で実行されている (キオスク エクスペリエンスとして実行されている) ことをアプリで認識できます。 インスタンスが返されない場合、アプリは通常のデスクトップ コンテキストで実行されます。

ロック フレームワークがロックの上にキオスク アプリを起動し、アプリに windows.aboveLockScreen 拡張機能がある場合、ロック フレームワークによってロックの上に新しいセカンダリ ビューが自動的に作成されます。 メイン ビューはロックの下にあります。 このセカンダリ ビューには、アプリのコンテンツが含まれており、ユーザーに表示されます。 この追加のビューは、キオスク エクスペリエンスを調整するために拡張機能と共に使用できます。 たとえば、次のように操作できます。

アプリに windows.aboveLockScreen 拡張機能がない場合、セカンダリ ビューは作成されません。アプリは、通常どおりに実行されているかのように起動します。 さらに、アプリは LockApplicationHost のインスタンスにアクセスできないため、通常のコンテキストで実行されているか、キオスク エクスペリエンスで実行されているかを判断できません。 拡張機能を含まない場合は、複数のモニターをサポート できるなどの利点があります

アプリが拡張機能を使用しているかどうかに関係なく、データをセキュリティで保護してください。 詳細については、 割り当てられたアクセス アプリ のガイドラインを参照してください。

Windows 10 バージョン 1607 以降では、ユニバーサル Windows プラットフォーム (UWP) 拡張機能に制限がなくなりました。そのため、ユーザーが割り当てられたアクセスを構成するときに、ほとんどのアプリを設定表示できます。

ベスト プラクティス

このセクションは、windows.aboveLockScreen 拡張機能を使用するキオスク アプリケーションに適用されます。

情報をセキュリティで保護する

キオスク アプリが割り当てられたアクセスで上記のロックとロック解除された Windows コンテキストの両方を実行する場合は、ロックの上にレンダリングする別のページを作成し、ロックの下に別のページを作成することができます。 これにより、キオスク モードは通常匿名アクセスを意味するため、キオスク モードで機密情報を表示しないようにすることができます。 ロックの下とロックの上のページの 2 つの異なるページを使用するために従う手順を次に示します。

  1. App.xaml.csの OnLaunched 関数のオーバーライド内で、rootFrame ナビゲーションの前に LockApplicationHost クラスのインスタンスを取得してみてください。

  2. 呼び出しが失敗した場合、キオスク アプリはロックの下で正常に起動します。

  3. 呼び出しが成功した場合、キオスク アプリは、割り当てられたアクセス モードで実行されているロックの上で起動する必要があります。 このバージョンのキオスク アプリには、機密情報を非表示にするための別のメイン ページが必要な場合があります。

次の例では、これを行う方法を示します。 AssignedAccessPage.xaml は定義済みであり、アプリは上記のロック モードで実行されていることを検出すると AssignedAccessPage.xaml に移動します。 その結果、通常のページは、ロック中のシナリオでのみ表示されます。

このメソッドを使用すると、アプリのライフサイクルでいつでもアプリがロック画面の上で実行されているかどうかを判断し、それに応じて対応できます。

using Windows.ApplicationModel.LockScreen;

// inside the override OnLaunched function in App.xaml.cs

if (rootFrame.Content == null)
{
    LockApplicationHost host = LockApplicationHost.GetForCurrentView();
    if (host == null)
    {
        // if call to LockApplicationHost is null, this app is running under lock
        // render MainPage normally
        rootFrame.Navigate(typeof(MainPage), e.Arguments);
    }
    else
    {
        // If LockApplicationHost was successfully obtained
        // this app is running as a lock screen app, or above lock screen app
        // render a different page for assigned access use
        // to avoid showing regular main page to keep secure information safe
        rootFrame.Navigate(typeof(AssignedAccessPage), e.Arguments);
    }
}

複数のビュー、ウィンドウ、スレッド

Windows 10 バージョン 1803 以降では、windows.aboveLockScreen 拡張機能を持たないアプリのキオスク エクスペリエンスで複数のビューがサポートされています。 複数のビューを使用するには、キオスク デバイスの [複数のディスプレイ ] オプションが [表示の拡張] に 設定されていることを確認します

キオスク エクスペリエンス中に複数のビュー (および windows.aboveLockScreen なし) を持つアプリが起動すると、アプリのメイン ビューが最初のモニターにレンダリングされます。 CreateNewView() を使用してアプリによって新しいビューが作成された場合、2 番目のモニターにレンダリングされます。 アプリが別のビューを作成すると、3 番目のモニターに移動します。

重要

キオスク デバイスでは、モニターごとに 1 つのビューのみを表示できます。 たとえば、キオスク デバイスにモニターが 1 つしかない場合、キオスク アプリのメイン ビューが常に表示されます。 アプリによって作成された新しいビューは表示されません。

キオスク アプリに windows.aboveLockScreen 拡張機能があり、ロックの上で実行されている場合は、別の方法で初期化されます。 そのメイン ビューはロックの下にあり、その上にセカンダリ ビューがあります。 このセカンダリ ビューは、ユーザーに表示されるビューです。 新しいビューを明示的に作成しない場合でも、アプリ インスタンスには 2 つのビューがあります。

アプリがロック モードで実行されている場合のビューの z オーダー。

アプリのメイン ウィンドウ (割り当てられたアクセス モード) で次のコードを実行して、ビューの数と、現在の画面がメイン ビューであるかどうかを確認できます。

using Windows.ApplicationModel.Core;

CoreApplication.GetCurrentView().IsMain //false
CoreApplication.Views.Count //2

ディスパッチャー

各ビューまたはウィンドウには、独自のディスパッチャーがあります。 メイン ビューはユーザーに対して非表示になっているため、GetCurrentView() を使用して、MainView() ではなくロックの上で実行されているアプリのセカンダリ ビューにアクセスします。

using Windows.ApplicationModel.Core;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    button.IsEnabled = false;

    // start a background task and update UI periodically (every 1 second)
    // using MainView dispatcher in below code will end up with app crash
    // in assigned access mode, use GetCurrentView().Dispatcher instead
    await CoreApplication.GetCurrentView().Dispatcher.RunAsync(
        CoreDispatcherPriority.Normal,
        async () =>
        {
            for (int i = 0; i < 60; ++i)
            {
                // do some background work, here we use Task.Delay to sleep
                await Task.Delay(1000);
                // update UI
                textBlock1.Text = "   " + i.ToString();
            }
            button.IsEnabled = true;
        });
}

アプリに windows.aboveLockScreen があり、キオスク エクスペリエンスとして実行されている場合、新しいビューを作成すると、アプリ内で例外が発生します。

Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception

このため、複数のビューを作成したり、複数のモニターで実行したりすることはできません。 アプリでいずれかのサポートが必要な場合は、windows.aboveLockScreen 拡張機能をアプリから削除する必要があります。

割り当てられたアクセスから抜け出す方法を追加する

状況によっては、電源ボタン、エスケープ ボタン、またはアプリケーションの停止に使用されるその他のボタンがキーボードで有効になっていないか、使用できない場合があります。 このような状況では、割り当てられたアクセスを停止する方法 (ソフトウェア キーなど) を提供します。 次のイベント ハンドラーは、ソフトウェア キーによってトリガーされる可能性があるボタン選択イベントに応答して、割り当てられたアクセス モードを停止する方法を示しています。

LockApplicationHost^ lockHost = LockApplicationHost::GetForCurrentView();
    if (lockHost != nullptr)
    {
        lockHost->RequestUnlock();
    }

ライフサイクル管理

キオスク アプリのライフサイクルは、割り当てられたアクセス フレームワークによって処理されます。 アプリが予期せず終了した場合、フレームワークはアプリの再起動を試みます。 ただし、ユーザーが Ctrl + Alt + Del キーを押してログイン画面を表示すると、ロック解除イベントがトリガーされます。 割り当てられたアクセス フレームワークはイベントをリッスンし、アプリの終了を試みます。

キオスク アプリでは、このイベントのハンドラーを登録し、終了する前にアクションを実行することもできます。 この例では、データを保存します。 ハンドラーの登録例については、次のコードを参照してください。

using Windows.ApplicationModel.LockScreen;

public AssignedAccessPage()
{
    this.InitializeComponent();

    LockApplicationHost lockHost = LockApplicationHost.GetForCurrentView();
    if (lockHost != null)
    {
        lockHost.Unlocking += LockHost_Unlocking;
}
}

private void LockHost_Unlocking(LockApplicationHost sender, LockScreenUnlockingEventArgs args)
{
    // save any unsaved work and gracefully exit the app
    App.Current.Exit();
}

ユーザーが Ctrl + Alt + Del キーを押し、ログイン画面が表示されると、次の 2 つのことが発生する可能性があります。

  1. ユーザーは、割り当てられたアクセス アカウントのパスワードを認識し、デスクトップのロックを解除します。 割り当てられたアクセス フレームワークが起動し、デスクトップがロックされ、ロック画面アプリが起動し、キオスク アプリが起動します。

  2. ユーザーはパスワードを知らないか、それ以上のアクションを実行しません。 ログイン画面のタイムアウトとデスクトップの再ロック。ロック画面アプリが起動し、キオスク アプリが起動します。

割り当てられたアクセス モードで新しいウィンドウまたはビューを作成しない

次の関数呼び出しは、割り当てられたアクセス モードで呼び出された場合、ランタイム例外になります。 同じアプリがロックの下で使用されている場合、関数を呼び出しても、ランタイム例外は発生しません。 LockApplicationHost を使用してアプリの割り当てられたアクセス モードを決定し、アプリが割り当てられたアクセス モードの場合は新しいビューを作成しないなど、それに応じてアプリをコーディングすると便利です。

Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception

付録 1: UWP 拡張機能

次のサンプル アプリケーション マニフェストでは、 windows.aboveLockScreenUWP 拡張機能を使用します。

Windows 10 バージョン 1607 以降では、ユニバーサル Windows プラットフォーム (UWP) 拡張機能に制限がなくなりました。そのため、ユーザーが割り当てられたアクセスを構成するときに、ほとんどのアプリを設定表示できます。

<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
  <Identity Name="bd4df68b-dc18-4748-a14e-bc21dac13736" Publisher="Contoso" Version="1.0.0.0" />
  <mp:PhoneIdentity PhoneProductId="bd4df68b-dc18-4748-a14e-bc21dac13736" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
  <Properties>
    <DisplayName>AboveLock</DisplayName>
    <PublisherDisplayName>Contoso</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="AboveLock.App">
      <uap:VisualElements DisplayName="AboveLock" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="AboveLock" BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
        </uap:DefaultTile>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
      <Extensions>
        <uap:Extension Category="windows.lockScreenCall" />
        <uap:Extension Category="windows.aboveLockScreen" />
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
  </Capabilities>
</Package>

付録 2: トラブルシューティング

通常、キオスク アプリがロック画面アプリの上でアクティブ化に失敗した場合は、ロックダウン画面でアクティブ化エラー コードを見つけることができます。 エラー コードを使用して、Windows システム エラー コードを調べることで問題を検出します。 また、イベント ビューアーには、アクティブ化エラーに関する詳細情報も含まれています。 そのためには次のようにします。

  1. イベント ビューアーを開きます。 アクティブ化エラーが見つかる可能性が高い場所は 2 つあります。

  2. [イベント ビューアー (ローカル) ウィンドウで、Windows ログを展開し、[アプリケーション] を選択します。

  3. また、イベント ビューアー (ローカル) で、[アプリケーションとサービス ログ] を展開し、[Windows] を展開し、[アプリ] を展開して、[Microsoft-Windows-TWinUI/Operational] を選択します。

アクセス権が割り当てられたキオスク アプリは全画面表示モードでは実行されないため、 ApplicationView.GetForCurrentView()。IsFullScreenMode は false を返します。

割り当てられたアクセス

アプリの複数のビューの表示