할당된 액세스에 대한 키오스크 앱: 모범 사례
Windows 10에서는 할당된 액세스를 사용하여 사용자가 단일 유니버설 Windows 앱과 상호 작용할 수 있는 키오스크 디바이스를 만들 수 있습니다. 이 문서에서는 키오스크 앱을 구현하는 방법과 모범 사례를 설명합니다.
할당된 액세스가 제공하는 두 가지 환경이 있습니다.
단일 앱 키오스크 환경
계정에 하나의 앱을 할당합니다. 사용자가 로그인하면 이 앱에만 액세스할 수 있고 시스템에서 다른 것은 액세스할 수 없습니다. 이 시간 동안 키오스크 디바이스가 잠기고 키오스크 앱이 잠금 화면 위에서 실행됩니다. 이 환경은 공용 키오스크 머신에 자주 사용됩니다. 자세한 내용은 Windows 10 Pro, Enterprise 또는 Education 에서 키오스크 설정을 참조하세요.
다중 앱 키오스크 환경(Windows 10 버전 1709 이상에서 사용 가능)
계정에 하나 이상의 앱을 할당할 수 있습니다. 사용자가 로그인하면 선택한 앱에만 액세스할 수 있는 제한된 셸 환경에서 디바이스가 시작됩니다. 자세한 내용은 여러 앱을 실행하는 Windows 10 키오스크 만들기를 참조하세요.
이 문서에서는 단일 앱 키오스크 환경만 설명합니다. 다중 앱 환경에서 선택한 앱은 일반 데스크톱 컨텍스트에서 실행되며 특별한 처리 또는 수정이 필요하지 않습니다.
사용 약관
용어 | 설명 |
---|---|
할당된 액세스 권한 | 시스템 관리자가 디바이스 사용자에게 노출되는 애플리케이션 진입점을 제한하여 사용자 환경을 관리할 수 있는 기능입니다. 예를 들어 비즈니스의 고객이 하나의 앱을 사용하도록 제한하여 PC가 키오스크처럼 작동하도록 할 수 있습니다. 누군가가 지정된 계정으로 로그인할 때마다 해당 앱 하나만 사용할 수 있습니다. 터치 제스처, 마우스, 키보드 또는 하드웨어 단추를 사용하여 앱을 전환하거나 앱을 닫을 수 없습니다. 앱 알림도 표시되지 않습니다. |
잠금 화면 앱(또는 잠금 앱) | 동적 배경 화면을 설정하는 기능을 활용하거나 새 잠금 확장성 프레임워크를 활용하는 애플리케이션입니다. |
잠금 화면 앱 위(또는 잠금 앱 이상) | 잠금 화면 앱이 실행되는 동안(예: 바탕 화면이 잠긴 경우) 잠금 화면 위에서 실행되는 애플리케이션입니다. |
잠금 앱에서 | 잠금 해제된 Windows 컨텍스트에서 정상적으로 실행되는 애플리케이션입니다. |
LockApplicationHost | 위의 잠금 화면 앱이 디바이스의 잠금을 해제하도록 요청하고 디바이스가 잠금 해제를 시작할 때 앱에 알림을 받을 수 있도록 하는 WinRT 클래스입니다. |
보기 또는 애플리케이션 보기 | 각 보기는 앱에 대한 별도의 창입니다. 앱은 기본 보기를 가질 수 있으며 요청 시 여러 및 보조 보기를 만들 수 있습니다. 자세한 내용은 ApplicationView를 참조하세요. |
windows.aboveLockScreen 확장
Windows 10에서 할당된 액세스는 잠금 프레임워크를 사용합니다. 할당된 액세스 사용자가 로그인하면 백그라운드 작업이 데스크톱을 잠그고 잠금 위에 키오스크 앱을 시작합니다. 앱의 동작은 windows.aboveLockScreen 확장을 사용하는지 여부에 따라 다를 수 있습니다.
windows.aboveLockScreen을 사용하면 키오스크 앱이 LockApplicationHost 런타임 클래스에 액세스할 수 있습니다. 이를 통해 앱이 잠금 위에서 실행되는 시기를 알 수 있습니다(따라서 키오스크 환경으로 실행됨). 인스턴스를 반환할 수 없는 경우 앱은 일반 데스크톱 컨텍스트에서 실행됩니다.
잠금 프레임워크가 잠금 위에 키오스크 앱을 시작하고 앱에 windows.aboveLockScreen 확장이 있는 경우 잠금 프레임워크는 잠금 위에 새 보조 보기를 자동으로 만듭니다. 기본 보기는 잠금 아래에 있습니다. 이 보조 보기에는 앱의 콘텐츠가 포함되며 사용자가 보는 내용이 포함됩니다. 이 추가 보기를 확장과 함께 사용하여 키오스크 환경을 조정할 수 있습니다. 이렇게 시작할 수 있는 작업의 예는 다음과 같습니다.
앱에서 LockApplicationHost.RequestUnlock() 메서드를 호출하여 할당된 액세스 모드 에서 벗어나는 방법을 추가하고 로그인 화면으로 돌아갑니다.
사용자가 Ctrl+Alt+Del을 눌러 키오스크 환경을 종료할 때 발생하는 *LockApplicationHost.Unlocking 이벤트에 이벤트 처리기를 추가합니다. 처리기를 사용하여 종료하기 전에 데이터를 저장할 수도 있습니다.
앱에 windows.aboveLockScreen 확장이 없으면 보조 보기가 만들어지지 않고 앱이 정상적으로 실행되는 것처럼 시작됩니다. 또한 앱은 LockApplicationHost 인스턴스에 액세스할 수 없으므로 일반 컨텍스트에서 실행되는지 또는 키오스크 환경에서 실행되는지 확인할 수 없습니다. 확장을 포함하지 않으면 여러 모니터를 지원할 수 있는 등의 이점이 있습니다.
앱에서 확장을 사용하는지 여부에 관계없이 데이터를 보호해야 합니다. 자세한 내용은 할당된 액세스 앱에 대한 지침을 참조하세요.
Windows 10 버전 1607부터는 UWP(유니버설 Windows 플랫폼) 확장에 대한 제한이 더 이상 없으므로 사용자가 할당된 액세스를 구성할 때 대부분의 앱을 설정 표시할 수 있습니다.
모범 사례
이 섹션은 windows.aboveLockScreen 확장을 사용하는 키오스크 애플리케이션에 적용됩니다.
정보 보호
키오스크 앱이 할당된 액세스 및 잠금 해제된 Windows 컨텍스트에서 위의 잠금을 모두 실행하도록 의도된 경우 잠금 위에 렌더링할 다른 페이지와 잠금 아래에 대한 다른 페이지를 만들 수 있습니다. 키오스크 모드는 일반적으로 익명 액세스를 의미하므로 키오스크 모드에서 중요한 정보를 표시하지 않도록 할 수 있습니다. 다음은 두 개의 서로 다른 페이지를 사용하기 위해 수행되는 단계입니다. 하나는 잠금 아래에, 다른 하나는 잠금 위에 사용됩니다.
App.xaml.cs OnLaunched 함수의 재정의 내에서 루트 프레임 탐색 전에 LockApplicationHost 클래스의 인스턴스를 가져오려고 합니다.
호출이 실패하면 키오스크 앱이 잠금 상태에서 정상적으로 시작되어야 합니다.
호출이 성공하면 키오스크 앱이 할당된 액세스 모드에서 실행되는 잠금 위로 시작되어야 합니다. 이 버전의 키오스크 앱에서 중요한 정보를 숨기도록 다른 기본 페이지를 포함할 수 있습니다.
다음 샘플에서는 이 작업을 수행하는 방법을 보여 줍니다. 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()를 사용하여 앱에서 새 보기를 만든 경우 두 번째 모니터에서 렌더링됩니다. 앱이 다른 보기를 만드는 경우 세 번째 모니터로 이동합니다.
Important
키오스크 디바이스는 모니터당 하나의 보기만 표시할 수 있습니다. 예를 들어 키오스크 디바이스에 모니터가 하나만 있는 경우 키오스크 앱의 기본 보기가 항상 표시됩니다. 앱에서 만든 새 보기는 표시되지 않습니다.
키오스크 앱에 windows.aboveLockScreen 확장이 있고 잠금 위에서 실행 중인 경우 다르게 초기화됩니다. 기본 보기는 잠금 아래에 있으며 그 위에 보조 보기가 있습니다. 이 보조 보기는 사용자가 보는 보기입니다. 새 보기를 명시적으로 만들지 않더라도 앱 인스턴스에는 두 개의 보기가 있습니다.
앱의 기본 창(할당된 액세스 모드)에서 다음 코드를 실행하여 보기 수와 현재 화면이 기본 보기인지 여부를 확인할 수 있습니다.
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을 누르고 로그인 화면이 표시되면 다음 두 가지 작업이 발생할 수 있습니다.
사용자는 할당된 액세스 계정 암호를 알고 데스크톱의 잠금을 해제합니다. 할당된 액세스 프레임워크가 시작되고, 바탕 화면이 잠기고, 잠금 화면 앱이 시작되고, 그러면 키오스크 앱이 시작됩니다.
사용자가 암호를 모르거나 추가 작업을 수행하지 않습니다. 로그인 화면 시간 제한 및 바탕 화면이 다시 차단됩니다. 잠금 화면 앱이 시작되어 키오스크 앱이 시작됩니다.
할당된 액세스 모드에서 새 창 또는 보기를 만들지 마세요.
다음 함수 호출은 할당된 액세스 모드에서 호출되는 경우 런타임 예외로 끝납니다. 동일한 앱이 잠금 상태에서 사용되는 경우 함수를 호출하면 런타임 예외가 발생하지 않습니다. LockApplicationHost를 사용하여 앱의 할당된 액세스 모드를 확인하고, 앱이 할당된 액세스 모드에 있는 경우 새 보기를 만들지 않는 등 앱을 그에 따라 코딩하는 것이 유용합니다.
Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception
부록 1: UWP 확장
다음 샘플 애플리케이션 매니페스트는 windows.aboveLockScreenUWP 확장을 사용합니다.
Windows 10 버전 1607부터는 UWP(유니버설 Windows 플랫폼) 확장에 대한 제한이 더 이상 없으므로 사용자가 할당된 액세스를 구성할 때 대부분의 앱을 설정 표시할 수 있습니다.
<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 시스템 오류 코드를 조회하여 문제를 검색합니다. 또한 이벤트 뷰어 활성화 실패에 대한 자세한 정보가 포함되어 있습니다. 수행할 작업:
이벤트 뷰어를 엽니다. 활성화 오류를 찾을 수 있는 두 가지 가능성이 있는 위치가 있습니다.
이벤트 뷰어(로컬) 창에서 Windows 로그를 확장한 다음 애플리케이션을 선택합니다.
또한 이벤트 뷰어(로컬)에서 애플리케이션 및 서비스 로그를 확장하고, Windows를 확장하고, 앱을 확장한 다음, Microsoft-Windows-TWinUI/Operational을 선택합니다.
할당된 액세스 권한이 있는 키오스크 앱은 전체 화면 모드 에서 실행되지 않으므로 ApplicationView.GetForCurrentView(). IsFullScreenMode 는 false를 반환합니다.