4부 - 다중 플랫폼 처리Part 4 - Dealing with Multiple Platforms

플랫폼 차이 처리 & 기능Handling Platform Divergence & Features

확산 되지 ' 플랫폼 ' 문제만. '같은' 플랫폼에는 장치에는 다양 한 기능 (특히 다양 한 사용할 수 있는 Android 장치)에 있습니다.Divergence isn’t just a ‘cross-platform’ problem; devices on the ‘same’ platform have different capabilities (especially the wide variety of Android devices that are available). 가장 분명 하 고 기본 화면 크기, 이지만 다른 장치 특성이 다르며 특정 기능을 확인 하 고 해당 (유무)에 따라 다르게 동작 하도록 응용 프로그램이 필요한 수 있습니다.The most obvious and basic is screen size, but other device attributes can vary and require an application to check for certain capabilities and behave differently based on their presence (or absence).

즉, 모든 응용 프로그램 보기 좋지 않은, 가장 낮은 공통 분모 기능 집합을 제공 하는 것이 또는 기능의 정상적인 저하를 사용 하 여 처리 해야 합니다.This means all applications need to deal with graceful degradation of functionality, or else present an unattractive, lowest-common-denominator feature set. Xamarin의 긴밀 한 통합 네이티브 Sdk 사용 하 여 각 플랫폼의 이러한 기능을 사용 하는 앱을 디자인 하는 데 적합 하므로 플랫폼 특정 기능을 활용 하려면 응용 프로그램을 허용 합니다.Xamarin’s deep integration with the native SDKs of each platform allow applications to take advantage of platform-specific functionality, so it makes sense to design apps to use those features.

플랫폼 기능에 어떻게 다른 지에 대 한 개요 플랫폼 기능 설명서를 참조 합니다.See the Platform Capabilities documentation for an overview of how the platforms differ in functionality.

플랫폼 차이의 예Examples of Platform Divergence

플랫폼 간에 존재 하는 기본적인 요소Fundamental elements that exist across platforms

일부의 특성 유니버설 된 모바일 응용 프로그램입니다.There are some characteristics of mobile applications that are universal. 다음은 모든 장치에 일반적으로 응용 프로그램 디자인의 기초를 형성 하므로 수를 더 높은 수준의 개념입니다.These are higher-level concepts that are generally true of all devices and can therefore form the basis of your application’s design:

  • 탭 또는 메뉴를 통해 기능 선택Feature selection via tabs or menus
  • 목록 데이터 및 스크롤Lists of data and scrolling
  • 데이터의 단일 보기Single views of data
  • 데이터의 단일 뷰를 편집합니다.Editing single views of data
  • 뒤로 탐색Navigating back

고급 화면 흐름을 디자인할 때 이러한 개념에 공통 된 사용자 경험을 만들 수 있습니다.When designing your high-level screen flow you can base a common user experience on these concepts.

플랫폼별 특성Platform-specific attributes

모든 플랫폼에 존재 하는 기본 요소를 외에도 디자인의 주요 플랫폼 차이 해결 해야 합니다.In addition to the basic elements that exist on all platforms, you will need to address key platform differences in your design. 이러한 차이점을는 것이 좋습니다 (및 처리 하기 위해 코드를 작성) 해야 할 수 있습니다.You may need to consider (and write code specifically to handle) these differences:

  • 화면 크기 – 일부 플랫폼 (예: iOS 및 Windows Phone 버전)가 대상으로 비교적 간단한 화면 크기를 표준화 합니다.Screen sizes – Some platforms (like iOS and earlier Windows Phone versions) have standardized screen sizes that are relatively simple to target. Android 장치에 다양 한 화면 크기, 응용 프로그램에서 지 원하는 데 많은 노력이 필요 합니다.Android devices have a large variety of screen dimensions, which require more effort to support in your application.
  • 탐색 메타포 -(예: 플랫폼의 차이점Navigation metaphors – Differ across platforms (eg. 하드웨어 '뒤로' button, Panorama UI 컨트롤) 및 플랫폼 (Android 2 및 4, iPhone 및 iPad) 내에서.hardware ‘back’ button, Panorama UI control) and within platforms (Android 2 and 4, iPhone vs iPad).
  • 키보드 – 일부 Android 장치의 경우에 소프트웨어 키보드 중 실제 키보드.Keyboards – Some Android devices have physical keyboards while others only have a software keyboard. 소프트 키보드가 화면의 가리는 경우를 검색 하는 코드는 이러한 차이 있어야 합니다.Code that detects when a soft-keyboard is obscuring part of the screen needs to be sensitive to these differences.
  • 터치 및 제스처 – 특히 이전 버전의 각 운영 체제에서에서 제스처 인식에 대 한 운영 체제 지원 달라 집니다.Touch and gestures – Operating system support for gesture recognition varies, especially in older versions of each operating system. 이전 버전의 Android가 매우 제한적으로 지원 touch 작업의 경우 이전 버전의 장치를 지 원하는 별도 코드를 필요할 수 있음을 의미 합니다.Earlier versions of Android have very limited support for touch operations, meaning that supporting older devices may require separate code
  • 푸시 알림 – 각 플랫폼 (예:에 다양 한 기능/구현Push notifications – There are different capabilities/implementations on each platform (eg. 라이브 타일에 Windows).Live Tiles on Windows).

장치 관련 기능Device-specific features

확인할 응용 프로그램에 필요한 최소 기능 해야 합니다. 또는 경우 활용 하기 위해 각 플랫폼에서 추가 기능을 결정 합니다.Determine what the minimum features required for the application must be; or when decide what additional features to take advantage of on each platform. 코드 검색 기능 및 기능을 사용 하지 않도록 설정 하거나 (예:에 대 한 대안을 제공 해야Code will be required to detect features and disable functionality or offer alternatives (eg. 지리적 위치 하는 대신 사용자가 위치를 입력 하거나 맵에서 선택 수 있음):an alternative to geo-location could be to let the user type a location or choose from a map):

  • 카메라 – 장치에서 기능 다릅니다: 일부 장치에 카메라가 없는, 다른 사용자가 모두 전면 및 후면 카메라입니다.Camera – Functionality differs across devices: some devices don’t have a camera, others have both front- and rear-facing cameras. 일부 카메라 비디오 기록을 수 있습니다.Some cameras are capable of video recording.
  • 지리적 위치 및 맵 – 모든 장치에서 Wi-fi 또는 GPS 위치에 대 한 지원이 없는 합니다.Geo-location & maps – Support for GPS or Wi-Fi location is not present on all devices. 앱은 또한 다양 한 수준의 각 메서드에서 지원 되는 정확도 제공 해야 합니다.Apps also need to cater for the varying levels of accuracy that’s supported by each method.
  • 가 속도계, 자이로스코프가 및 compass – 앱 거의 항상 제공 해야는 대체 (fallback) 하드웨어 지원 되지 않습니다 있도록 선택한 각 플랫폼에서 장치에 이러한 기능은 흔히 발견 됩니다.Accelerometer, gyroscope and compass – These features are often found in only a selection of devices on each platform, so apps almost always need to provide a fallback when the hardware isn’t supported.
  • Twitter 및 Facebook iOS5 iOS6에만 '기본' – 각각.Twitter and Facebook – only ‘built-in’ on iOS5 and iOS6 respectively. 사용자 고유의 인증 기능을 제공 하 고 각와 직접 인터페이스 하 해야 이전 버전 및 기타 플랫폼에서 서비스의 API입니다.On earlier versions and other platforms you will need to provide your own authentication functions and interface directly with each services’ API.
  • 필드 통신 (NFC) 거의 – (일부)에 대해서만 Android 휴대폰 (작성 시).Near Field Communications (NFC) – Only on (some) Android phones (at time of writing).

플랫폼 차이 사용 하 여 처리Dealing with Platform Divergence

동일한 코드 베이스를 각각 장점과 단점 자체 집합에서 여러 플랫폼을 지원 하기 위해 두 가지 방법이 있습니다.There are two different approaches to supporting multiple platforms from the same code-base, each with its own set of benefits and disadvantages.

  • 플랫폼 추상화 – 비즈니스 외관 패턴 플랫폼에서 통합 된 액세스를 제공 하 고 통합 된 단일 API로 플랫폼 특정 구현을 추상화 합니다.Platform Abstraction – Business Façade pattern, provides a unified access across platforms and abstracts the particular platform implementations into a single, unified API.
  • 분기 구현 – 인터페이스 및 상속 또는 조건부 컴파일 등 아키텍처 도구를 통해 분기 구현을 통해 기능을 특정 플랫폼을 호출 합니다.Divergent Implementation – Invocation of specific platform features via divergent implementations via architectural tools such as interfaces and inheritance or conditional compilation.

플랫폼 추상화Platform Abstraction

클래스 추상화Class Abstraction

인터페이스 또는 기본 클래스를 사용 하 여 공유 코드에 정의 되 고 구현 또는 플랫폼별 프로젝트에 확장.Using either interfaces or base classes defined in the shared code and implemented or extended in platform-specific projects. 작성 하 고 확장 클래스 추상화를 사용 하 여 공유 코드는 프레임 워크를 사용할 수의 제한 된 하위 집합을가지고 있으며 플랫폼별 코드 분기를 지원 하기 위해 컴파일러 지시문을 포함할 수 없습니다 때문에 이식 가능한 클래스 라이브러리에 특히 적합 합니다.Writing and extending shared code with class abstractions is particularly suited to Portable Class Libraries because they have a limited subset of the framework available to them and cannot contain compiler directives to support platform-specific code branches.


인터페이스를 사용 하 여 공통 코드를 활용 하 여 공유 라이브러리를 계속 전달할 수 있는 플랫폼 특정 클래스를 구현할 수 있습니다.Using interfaces allows you to implement platform-specific classes that can still be passed into your shared libraries to take advantage of common code.

인터페이스는 공유 코드에서 정의 되 고 매개 변수 또는 속성으로 공유 라이브러리로 전달 합니다.The interface is defined in the shared code, and passed into the shared library as a parameter or property.

플랫폼 관련 응용 프로그램은 다음 인터페이스를 구현 하 고 '처리' 하는 공유 코드 활용 하기 위해 여전히 수 있습니다.The platform-specific applications can then implement the interface and still take advantage of shared code to ‘process’ it.


구현은은 플랫폼별 코드를 포함 하 고도 플랫폼별 외부 라이브러리를 참조할 수 있습니다.The implementation can contain platform-specific code and even reference platform-specific external libraries.


만들고 구현을 공유 코드에 전달할 필요 합니다.Having to create and pass implementations into the shared code. 공유 코드 내에서 심층 인터페이스를 사용 하는 경우 다음 종료 되 여러 메서드 매개 변수를 통해 전달 되거나 그렇지 않으면 호출 체인을 통해 푸시 다운 합니다.If the interface is used deep within the shared code then it ends up being passed through multiple method parameters or otherwise pushed down through the call chain. 공유 코드에는 다른 인터페이스를 많이 사용 하는 경우 다음 이러한 모든를 만든 다음 공유 코드 위치에서 설정 합니다.If the shared code uses lots of different interfaces then they must all be created and set in the shared code somewhere.


공유 코드를 하나 이상의 플랫폼 특정 프로젝트에서 확장 될 수 있습니다. 있는 추상 또는 가상 클래스를 구현할 수 있습니다.The shared code could implement abstract or virtual classes that could be extended in one or more platform-specific projects. 이 비슷한 인터페이스를 사용 하 여 하지만 이미 구현 하는 몇 가지 동작.This is similar to using interfaces but with some behavior already implemented. 에 다양 한 뷰포인트 인터페이스 또는 상속 되는지 더 나은 디자인을 선택 합니다: 특히 C#에서는 단일 상속 하기 때문에 수 지정 서 앞으로 Api를 디자인할 수 있습니다.There are different viewpoints on whether interfaces or inheritance are a better design choice: in particular because C# only allows single inheritance it can dictate the way your APIs can be designed going forward. 주의 해 서 상속을 사용 합니다.Use inheritance with caution.

장점 및 단점 인터페이스의 기본 클래스 구현 코드가 (아마도 전체 플랫폼 독립적인 구현 필요에 따라 확장할 수 있는)를 포함할 수 있는 추가적인 이점도 사용 하 여 상속에 동일 하 게 적용 됩니다.The advantages and disadvantages of interfaces apply equally to inheritance, with the additional advantage that the base class can contain some implementation code (perhaps an entire platform agnostic implementation that can be optionally extended).


참조 된 Xamarin.Forms 설명서.See the Xamarin.Forms documentation.

다른 플랫폼 간 라이브러리Other Cross-Platform Libraries

이러한 라이브러리는 또한에 대 한 플랫폼 간 기능을 제공 C# 개발자:These libraries also offer cross-platform functionality for C# developers:

조건부 컴파일Conditional Compilation

공유 코드는 클래스 또는 다르게 작동 하는 기능에 액세스할 수 있는 각 플랫폼에서 다르게 작동 하도록 해야 하는 경우가 있습니다.There are some situations where your shared code will still need to work differently on each platform, possibly accessing classes or features that behave differently. 조건부 컴파일 같은 소스 파일에 정의 된 다른 기호를 포함 하는 여러 프로젝트 참조 하 고 있는 공유 자산 프로젝트를 사용 하 여 가장 적합 합니다.Conditional compilation works best with Shared Asset Projects, where the same source file is being referenced in multiple projects that have different symbols defined.

Xamarin 프로젝트를 정의 하는 __MOBILE__ 는 iOS 및 Android 응용 프로그램 프로젝트 (사전 및 사후 수정 이러한 기호에 두 개의 밑줄 참고) 모두에 마찬가지입니다.Xamarin projects always define __MOBILE__ which is true for both iOS and Android application projects (note the double-underscore pre- and post-fix on these symbols).

#if __MOBILE__
// Xamarin iOS or Android-specific code


Xamarin.iOS 정의 __IOS__ iOS 장치를 검색 하는 데 사용할 수 있는 합니다.Xamarin.iOS defines __IOS__ which you can use to detect iOS devices.

#if __IOS__
// iOS-specific code

조사식 및 TV 별 기호는:There are also Watch- and TV-specific symbols:

#if __TVOS__
// tv-specific stuff

#if __WATCHOS__
// watch-specific stuff


Xamarin.Android 응용 프로그램에 컴파일만 해야 하는 코드를 다음 사용할 수 있습니다.Code that should only be compiled into Xamarin.Android applications can use the following

#if __ANDROID__
// Android-specific code

각 API 버전도 새 컴파일러 지시문을 정의 새 Api를 대상으로 하는 경우 기능을 추가 하 다음과 같은 코드 수 있도록 합니다.Each API version also defines a new compiler directive, so code like this will let you add features if newer APIs are targeted. 각 API 수준은 '아래쪽' 모든 수준을 기호를 포함합니다.Each API level includes all the ‘lower’ level symbols. 이 기능은 여러 플랫폼; 지원에 실제로 유용 하지 않습니다. 일반적으로 __ANDROID__ 기호 만으로도 충분 합니다.This feature is not really useful for supporting multiple platforms; typically the __ANDROID__ symbol will be sufficient.

#if __ANDROID_11__
// code that should only run on Android 3.0 Honeycomb or newer


없는 현재 Xamarin.Mac에 대 한 기본 제공 기호 있지만 Mac에서 직접 앱 프로젝트를 추가할 수 있습니다 옵션 > 빌드 > 컴파일러기호를 정의할 하거나 편집 합니다 .csproj 파일을 추가할 수 있습니다 (예를 들어 __MAC__)There is not currently a built-in symbol for Xamarin.Mac, but you can add your own in the Mac app project Options > Build > Compiler in the Define symbols box, or edit the .csproj file and add there (for example __MAC__)


UWP(유니버설 Windows 플랫폼)Universal Windows Platform (UWP)

WINDOWS_UWP을 사용하세요.Use WINDOWS_UWP. Xamarin 플랫폼 기호 문자열이 주변에 밑줄이 있습니다.There are no underscores surrounding the string like the Xamarin platform symbols.

// UWP-specific code

조건부 컴파일을 사용Using Conditional Compilation

조건부 컴파일 예제 사례 연구는 SQLite 데이터베이스 파일의 파일 위치를 설정 합니다.A simple case-study example of conditional compilation is setting the file location for the SQLite database file. 세 가지 플랫폼에는 파일 위치를 지정 하는 데 약간 다른 요구 사항이 있습니다.The three platforms have slightly different requirements for specifying the file location:

  • iOS – Apple에서 사용자가 아닌 데이터를 특정 위치 (라이브러리 디렉터리)에 저장할 수 있지만이 디렉터리에 대 한 시스템 상수가 없는 합니다.iOS – Apple prefers non-user data to be placed in a specific location (the Library directory), but there is no system constant for this directory. 플랫폼 특정 코드는 올바른 경로 작성 해야 합니다.Platform-specific code is required to build the correct path.
  • Android – 반환 되는 시스템 경로의 Environment.SpecialFolder.Personal 데이터베이스 파일을 저장할 허용 되는 위치입니다.Android – The system path returned by Environment.SpecialFolder.Personal is an acceptable location to store the database file.
  • Windows Phone – 격리 된 저장소 메커니즘의 전체 경로를 지정할 수 없도록만 상대 경로 및 파일 이름입니다.Windows Phone – The isolated storage mechanism does not allow a full path to be specified, just a relative path and filename.
  • 유니버설 Windows 플랫폼 – 사용 Windows.Storage Api.Universal Windows Platform – Uses Windows.Storage APIs.

다음 코드는 조건부 컴파일을 사용 하 여 되도록는 DatabaseFilePath 각 플랫폼에 대 한 올바른:The following code uses conditional compilation to ensure the DatabaseFilePath is correct for each platform:

public static string DatabaseFilePath {
        get {
    var filename = "TodoDatabase.db3";
    // Windows Phone 8
    var path = filename;

#if __ANDROID__
    string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#if __IOS__
        // we need to put in /Library/ on iOS5.1 to meet Apple's iCloud terms
        // (they don't want non-user-generated data in Documents)
        string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
        string libraryPath = Path.Combine (documentsPath, "..", "Library");
        // UWP
        string libraryPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
        var path = Path.Combine (libraryPath, filename);
        return path;

결과 작성 하 고 각 플랫폼에서 다른 위치에 SQLite 데이터베이스 파일을 배치 하는 모든 플랫폼에서 사용할 수 있는 클래스가 생성 됩니다.The result is a class that can be built and used on all platforms, placing the SQLite database file in a different location on each platform.