확장 SDK를 사용한 프로그래밍
Windows 10 UWP(유니버설 Windows 플랫폼) 앱이 다양한 디바이스 클래스를 가장 효과적으로 대상으로 지정하는 방법을 이해하기 위해 이 항목에서는 다음 개념을 설명합니다.
- 디바이스 패밀리
- 확장 SDK
- API 계약
프로그래밍에서 사용하는 방법도 보여 드립니다.
비디오 - UWP 및 디바이스 패밀리 소개
디바이스 패밀리 및 앱의 대상 디바이스 패밀리
디바이스 패밀리는 여러 디바이스 클래스에서 기대할 수 있는 API, 시스템 특성 및 동작을 식별합니다.
디바이스 패밀리는 OS(운영 체제)의 기초입니다. 예를 들어 PC와 태블릿은 데스크톱 버전의 OS를 실행하며 데스크톱 디바이스 패밀리를 기반으로 합니다. IoT 디바이스는 IoT 디바이스 패밀리를 기반으로 하는 OS의 IoT 버전을 실행합니다.
각 자식 디바이스 패밀리는 유니버설 디바이스 패밀리에서 상속하는 API에 자체 API를 추가합니다. 자식 디바이스 패밀리의 결과 API 조합은 해당 디바이스 패밀리를 기반으로 하는 OS에 존재하므로 해당 OS를 실행하는 모든 디바이스에 존재하도록 보장됩니다.
앱이 대상으로 지정할 디바이스 패밀리(또는 가족)에 대한 결정은 사용자의 결정입니다. 그리고 이러한 결정은 이러한 중요한 방법으로 앱에 영향을 줍니다. 결정
- Microsoft Store에서 설치하기 위해 앱이 제공하는 디바이스 제품군(따라서 앱의 UI를 디자인할 때 고려해야 하는 폼 팩터) 및
- 앱(호스트 디바이스)을 실행하는 디바이스에 존재할 수 있는 특정 API 집합입니다.
존재에 의존하면 먼저 테스트할 필요 없이 해당 API를 호출하여 호스트 디바이스에 있는지 여부를 확인할 수 있습니다. 대상으로 하는 디바이스 패밀리는 해당 보장을 제공합니다(다른 디바이스 패밀리에 대해 서로 다른 보장).
대상 디바이스 패밀리 구성
앱 패키지 매니페스트 원본 파일( Package.appxmanifest
파일)에서 TargetDeviceFamily 요소에는 Name 특성이 있습니다. 해당 특성의 값은 앱이 대상으로 하는 디바이스 패밀리의 이름입니다. 다음 값이 유효합니다.
- Windows.Desktop
- Windows.Holographic
- Windows.IoT
- Windows.Mobile
- Windows.Team
- Windows.Universal
- Windows.Xbox
기본적으로 UWP 앱은 유니버설 디바이스 패밀리를 대상으로 합니다(즉, Microsoft Visual Studio가 TargetDeviceFamily에 대해 지정Windows.Universal
). 즉, 모든 Windows 10 디바이스에 앱을 설치할 수 있으며 호스트 디바이스에 있는 큰 코어 API 집합에 의존할 수 있습니다. 이러한 앱은 다양한 디바이스에서 실행할 수 있으므로 고도로 적응성이 뛰어난 UI와 포괄적인 입력 기능이 있어야 합니다. 이 항목의 뒷부분에 있는 다양한 화면 크기로 UI 미리 보기를 참조하세요 .
앱이 Microsoft Store에서 설치하도록 제공되는 디바이스 패밀리를 제한하려는 경우 데스크톱 디바이스 패밀리() 또는 IoT 디바이스 패밀리(Windows.Desktop
Windows.IoT
)와 같은 다른 디바이스 패밀리를 대상으로 지정할 수 있습니다. 물론 앱을 호스트할 수 있는 디바이스는 적지만 해당 디바이스에 있는 더 큰 API 집합(유니버설 디바이스 패밀리의 집합과 대상 디바이스 패밀리의 집합)을 사용할 수 있습니다. 이러한 앱은 일반적으로 적당히 적응해야 합니다. 특정 종류의 디바이스에서만 실행할 수 있으므로 UI 및 입력 기능을 다소 특수화할 수 있습니다.
팁
그러나 당신은 또한 두 세계의 최고를 가질 수 있습니다. 모든 Windows 10 디바이스에서 실행되도록 앱을 구성하고, 디바이스에서 실행 중임을 알게 되면 특정 디바이스 제품군의 특수 기능에 액세스할 수도 있습니다. 이 최상의 시나리오에는 약간의 추가 작업이 필요하며, 이 항목의 뒷부분에 있는 세부 사항에 대해 살펴보겠습니다.
대상 디바이스 패밀리 버전 구성
API는 시간이 지남에 따라 Windows에 추가되므로 디바이스 패밀리를 선택하는 또 다른 차원은 대상으로 지정할 버전(또는 버전)을 결정하는 것입니다. Visual Studio의 일부 프로젝트 유형에는 대상 플랫폼 버전을 구성할 수 있는 속성 페이지가 있습니다. 그러나 모든 프로젝트 형식의 경우 프로젝트 파일에서 바로 대상 플랫폼 버전을 구성할 수 있습니다.
다음은 프로젝트 파일의 관련 속성을 보여 주는 예제입니다.
<!-- MyProject.Xxxproj -->
<PropertyGroup Label="Globals">
...
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
...
</PropertyGroup>
빌드 시 이러한 값(의 TargetDeviceFamily@NamePackage.appxmanifest
값과 함께)은 프로젝트의 출력 폴더에 생성된 파일에 복사 AppxManifest.xml
됩니다. 예제는 다음과 같습니다.
<!-- AppxManifest.xml -->
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal"
MaxVersionTested="10.0.19041.0"
MinVersion="10.0.17134.0" />
...
</Dependencies>
MaxVersionTested는 앱이 테스트한 대상 디바이스 패밀리의 최대 버전을 지정합니다. MinVersion은 앱이 대상으로 하는 디바이스 패밀리의 최소 버전을 지정합니다. 자세한 내용은 TargetDeviceFamily를 참조하세요.
중요
Visual Studio 프로젝트의 속성 페이지 또는 프로젝트 파일에서 WindowsTargetPlatformVersion 및 WindowsTargetPlatformMinVersion 값을 사용하여 이러한 버전 번호를 구성해야 합니다. 빌드가 해당 파일을 덮어쓰므로 을 편집 AppxManifest.xml
하지 마세요. 또한 해당 값이 무시되므로 앱 패키지 매니페스트 원본 파일(Package.appxmanifest
파일)에서 TargetDeviceFamily 요소의 MinVersion 및 MaxVersionTested 특성을 편집하지 마세요.
확장 SDK 및 해당 SDK를 참조하는 방법
Visual Studio 프로젝트에서 대상을 유니버설 디바이스 패밀리에서 다른 디바이스 패밀리로 변경하는 경우 해당 디바이스 패밀리에 해당하는 확장 SDK에 대한 참조를 추가해야 합니다. 이렇게 하면 해당 디바이스 패밀리의 API를 프로젝트에서 사용할 수 있습니다.
예를 들어 IoT 디바이스 패밀리를 대상으로 지정하는 경우(프로젝트 노드가 솔루션 탐색기 선택된 상태에서) 프로젝트>참조 추가...를 클릭합니다.>유니버설 Windows>확장을 선택하고 UWP에 적합한 버전의 Windows IoT 확장을 선택합니다. 예를 들어 호출하려는 최신 IoT API가 버전 10.0.17134.0에 도입된 경우 해당 버전을 선택합니다.
프로젝트 파일에서 해당 참조가 표시되는 방식입니다.
<ItemGroup>
<SDKReference Include="WindowsIoT, Version=10.0.17134.0" />
</ItemGroup>
이름 및 버전 번호는 SDK 설치 위치의 폴더와 일치합니다. 예를 들어 위의 정보는 라는 폴더와 일치합니다.
\Program Files (x86)\Windows Kits\10\Extension SDKs\WindowsIoT\10.0.17134.0
다른 확장 SDK에는 UWP용 Windows 데스크톱 확장, UWP용 Windows 모바일 확장 및 UWP용 Windows 팀 확장이 포함됩니다.
유니버설 디바이스 패밀리를 대상으로 하는 앱을 종료하는 경우에도 하나 이상의 확장 SDK에 대한 참조를 추가할 수 있습니다. 호출하려는 추가 API를 포함하는 확장 SDK를 참조합니다. 유니버설 디바이스 패밀리를 대상으로 하므로 존재하는 것에 의존 할 수 있는 유일한 API입니다. 참조한 확장 SDK의 API의 경우 호출하기 전에 런타임에 호스트 디바이스에 있는지 테스트해야 합니다(이 항목의 뒷부분에 있는 코드 작성 섹션의 자세한 내용). 물론 유니버설 디바이스 패밀리에서 API에 대해 해당 테스트를 수행할 필요가 없습니다. 이는 이전 섹션에서 언급한 세계 최고의 시나리오입니다.
확장 SDK를 사용하면 특정 디바이스 제품군의 고유 API를 대상으로 지정하여 특수한 기능에 액세스할 수 있습니다. 해당 디바이스 패밀리를 대상으로 하는지 여부에 관계없이 이 작업을 수행할 수 있습니다.
API 계약 및 조회 방법
디바이스 패밀리의 API는 API 계약이라는 그룹으로 세분화됩니다. 새 버전의 디바이스 패밀리가 릴리스되면 해당 새 버전은 기본적으로 해당 디바이스 패밀리에 속하는 모든 API 계약의 새 버전 컬렉션을 나타냅니다.
예를 들어 라는 Windows.Foundation.UniversalApiContract
API 계약은 유니버설 디바이스 제품군의 버전 10.0.17134.0과 함께 제공될 때 버전 6.0에 있었습니다. 그러나 동일한 계약 버전은 동일한 디바이스 제품군의 버전 10.0.19041.0과 함께 제공되었을 때 버전 10.0이었습니다.
WinRT API에 대한 API 계약 조회
지정된 Windows 런타임 API에 대한 API 계약 이름 및 버전 번호를 조회하는 방법을 살펴보겠습니다. 이 항목의 뒷부분에 있는 코드 작성 섹션에서 해당 정보를 사용하는 이유와 방법을 확인할 수 있습니다.
첫 번째 예제로 StorageFolder.TryGetChangeTracker 메서드를 사용합니다. 해당 항목의 Windows 10 요구 사항 섹션에서 StorageFolder.TryGetChangeTracker가 의 버전 6.0Windows.Foundation.UniversalApiContract
과 함께 처음 도입된 것을 볼 수 있습니다.
다음으로 StorageFolder.TryGetItemAsync 메서드에 대한 항목을 살펴보겠습니다. 해당 항목에는 Windows 10 요구 사항 섹션이 없습니다. 대신 StorageFolder 클래스 자체에 대한 항목을 살펴봅니다. Windows 10 요구 사항 섹션에는 답이 있습니다. StorageFolder.TryGetItemAsync 토픽은 다른 말을 하지 않으므로 해당 요구 사항을 부모 클래스와 공유한다는 결론을 내릴 수 있습니다. 따라서 StorageFolder.TryGetItemAsync 는 의 버전 1.0 Windows.Foundation.UniversalApiContract
을 사용하여 처음 도입되었습니다.
대상으로 지정할 디바이스 패밀리를 선택하는 방법
대상 디바이스 패밀리를 결정하는 데 도움이 되는 몇 가지 고려 사항은 다음과 같습니다. 자세한 내용은 TargetDeviceFamily를 참조하세요.
앱의 도달 범위 최대화
앱에서 최대 종류의 디바이스에 도달하여 가능한 한 많은 디바이스에서 실행되도록 하려면 앱이 유니버설 디바이스 패밀리를 대상으로 해야 합니다. 특히 지금까지 살펴보았듯이 다양한 버전의 유니버설 디바이스 패밀리를 대상으로 지정합니다.
앱을 한 종류의 디바이스로 제한
다양한 디바이스 폼 팩터에서 앱을 실행하지 않을 수 있습니다. 데스크톱 PC 또는 Xbox 콘솔용으로 특수화되어 있습니다. 이 경우 자식 디바이스 패밀리 중 하나를 대상으로 지정할 수 있습니다.
가능한 모든 디바이스의 하위 집합으로 앱 제한
유니버설 디바이스 패밀리를 대상으로 하거나 자식 디바이스 패밀리 중 하나를 대상으로 하는 대신 두 개 이상의 자식 디바이스 패밀리를 대상으로 지정할 수 있습니다. 데스크톱 및 모바일을 대상으로 지정하면 앱에 적합할 수 있습니다. 또는 데스크톱 및 팀. 또는 데스크톱, 모바일 및 팀 등.
디바이스 패밀리의 특정 버전에 대한 지원 제외
드문 경우지만 특정 버전의 특정 디바이스 패밀리가 있는 디바이스를 제외한 모든 곳에서 앱을 실행하려고 할 수 있습니다. 예를 들어 앱이 유니버설 디바이스 패밀리의 버전 10.0.x.0을 대상으로 하는 경우를 가정해 보겠습니다. 나중에 운영 체제 버전(예: 10.0.x.2)이 변경되면 앱을 유니버설 10.0.x.0 및 Xbox의 10.0.x.2로 대상으로 지정하여 Xbox 버전 10.0.x.1을 제외한 모든 곳에서 앱이 실행되도록 지정할 수 있습니다. 그러면 Xbox 10.0.x.1(포함) 이하의 장치 패밀리 버전 집합에서 앱을 사용할 수 없습니다.
코드 작성
코드의 대부분은 모든 디바이스에서 동일한 방식으로 실행된다는 점에서 보편적입니다. 그러나 특정 디바이스 패밀리에 맞게 조정된 코드의 경우 적응 코드를 사용할 수 있는 옵션이 있습니다. 이러한 다양한 경우를 살펴보겠습니다.
대상 디바이스 패밀리에서 구현하는 API 호출
UWP 앱에서 API를 호출할 때마다 앱이 대상으로 하는 디바이스 패밀리에서 API가 구현되는지 여부를 알고 싶을 것입니다. Visual Studio IntelliSense는 유니버설 디바이스 패밀리의 API 와 참조한 모든 확장 SDK에 사용할 수 있는 API를 보여 줍니다.
Windows 런타임 API 참조 설명서에서는 API가 속한 디바이스 패밀리를 알려줍니다. Windows 런타임 API에 대한 API 참조 항목을 조회하고 Windows 10 요구 사항 섹션을 찾는 경우 구현 디바이스 패밀리가 무엇이며 API가 처음 표시되는 해당 디바이스 패밀리의 버전을 확인할 수 있습니다. Windows 10 요구 사항 섹션이 없는 경우 멤버의 소유 클래스를 살펴보고 해당 Windows 10 요구 사항 섹션의 정보를 확인합니다. 해당 정보는 멤버에게도 적용됩니다.
대상 디바이스 패밀리에서 구현되지 않는 API 호출
참조한 확장 SDK에서 API를 호출하려고 하지만 API가 대상으로 하는 디바이스 패밀리의 일부가 아닌 경우가 있습니다.
예를 들어 유니버설 디바이스 패밀리를 대상으로 지정할 수 있지만 데스크톱 디바이스에서 앱이 실행될 때마다 호출하려는 데스크톱 API가 있습니다.
또는 앱이 디바이스 패밀리의 초기 버전을 지원할 수 있지만, 동일한 디바이스 패밀리의 최신 버전에서만 사용할 수 있는 호출하려는 API가 있습니다.
이러한 경우 해당 API를 안전하게 호출할 수 있도록 적응 코드를 작성하도록 선택할 수 있습니다. 다음 섹션에서는 방법을 보여줍니다.
ApiInformation을 사용하여 적응 코드 작성
적응 코드를 사용하여 API를 조건부로 호출하는 방법에는 두 단계가 있습니다. 첫 번째 단계는 프로젝트에서 API를 사용할 수 있도록 하는 것입니다. 이렇게 하려면 API를 소유하는 디바이스 패밀리를 나타내는 확장 SDK에 대한 참조를 추가합니다.
두 번째 단계는 코드의 조건에서 ApiInformation 클래스를 사용하여 호출하려는 API가 있는지 테스트하는 것입니다. 이 조건은 앱이 실행되는 위치와 때마다 평가됩니다. 그러나 API가 있으므로 호출할 true
수 있는 디바이스에서만 로 평가됩니다.
소수의 API만 호출하려는 경우 다음과 같이 ApiInformation.IsTypePresent 메서드를 사용할 수 있습니다.
// Cache the value, instead of querying it multiple times.
bool isHardwareButtonsAPIPresent =
Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");
if (isHardwareButtonsAPIPresent)
{
Windows.Phone.UI.Input.HardwareButtons.CameraPressed += HardwareButtons_CameraPressed;
}
이 경우 클래스와 멤버의 요구 사항 정보가 동일하기 때문에 HardwareButtons 클래스의 존재가 CameraPressed 이벤트의 존재를 의미한다는 확신이 있습니다. 그러나 시간이 지나면 새 멤버가 이미 도입된 클래스에 추가되고, 해당 멤버는 나중에 버전 번호 에 도입 됩니다. 이러한 경우 IsTypePresent를 사용하는 대신 IsEventPresent, IsMethodPresent, IsPropertyPresent 및 유사한 메서드를 사용하여 개별 멤버가 있는지 테스트할 수 있습니다. 예제는 다음과 같습니다.
bool isHardwareButtons_CameraPressedAPIPresent =
Windows.Foundation.Metadata.ApiInformation.IsEventPresent
("Windows.Phone.UI.Input.HardwareButtons", "CameraPressed");
아시다시피 디바이스 패밀리 내의 API 집합은 API 계약이라고 하는 세분화로 더 세분화됩니다. ApiInformation.IsApiContractPresent 메서드를 사용하여 API 계약의 존재 여부를 테스트할 수 있습니다. 이는 모든 API 계약의 동일한 버전에 속하는 많은 수의 API가 있는지 파악하기 위해 단일 조건을 실행하는 효율적인 방법입니다.
관심 있는 API를 처음 도입한 API 계약을 확인하는 방법에 대한 자세한 내용은 이 항목의 앞부분에 있는 WinRT API에 대한 API 계약 조회 섹션을 참조하세요.
해당 정보가 있으면 적응 코드에 연결할 수 있습니다. 예를 들어 API 계약의 이름이 이 Windows.Devices.Scanners.ScannerDeviceContract
고 주 버전 및 부 버전 번호가 각각 1과 0인 경우 조건은 아래 예제와 같습니다.
bool isWindows_Devices_Scanners_ScannerDeviceContract_1_0Present =
Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
("Windows.Devices.Scanners.ScannerDeviceContract", 1, 0);
다양한 화면 크기로 UI 미리 보기
앱의 도달 범위를 최대화하는 것이 좋습니다. 그러나 하나의 종류의 디바이스 폼 팩터만 대상으로 지정하더라도 앱이 표시될 수 있는 화면 크기가 다를 수 있습니다.
앱이 특정 크기의 화면에서 어떻게 보이고 배치되는지 확인할 준비가 되면 Visual Studio의 디바이스 미리 보기 도구 모음을 사용하여 중소형 모바일 디바이스, PC 또는 대형 TV 화면에서 UI를 미리 봅니다. 이렇게 하면 XAML의 적응형 레이아웃 기능을 사용한 경우( 시각적 상태 및 상태 트리거가 있는 적응형 레이아웃 참조) 테스트할 수도 있습니다.
지원할 모든 디바이스 유형에 대해 미리 결정할 필요는 없습니다. 언제든지 프로젝트에 추가 디바이스 크기를 추가할 수 있습니다.