5부 - 실제 코드 공유 전략Part 5 - Practical Code Sharing Strategies

이 섹션에서는 일반적인 응용 프로그램 시나리오에 대 한 코드를 공유 하는 방법의 예를 제공 합니다.This section gives examples of how to share code for common application scenarios.

데이터 계층Data Layer

데이터 계층은 정보를 읽고 쓰기 위한 저장소 엔진과 메서드로 구성 됩니다.The data layer consists of a storage engine and methods to read and write information. 성능, 유연성 및 플랫폼 간 호환성을 위해 SQLite 데이터베이스 엔진은 Xamarin 플랫폼 간 응용 프로그램에 권장 됩니다.For performance, flexibility and cross-platform compatibility the SQLite database engine is recommended for Xamarin cross-platform applications. Windows, Android, iOS 및 Mac을 비롯 한 다양 한 플랫폼에서 실행 됩니다.It runs on a wide variety of platforms including Windows, Android, iOS and Mac.

SQLiteSQLite

SQLite는 오픈 소스 데이터베이스 구현입니다.SQLite is an open-source database implementation. 원본 및 설명서는 SQLite.org에서 찾을 수 있습니다. SQLite 지원은 각 모바일 플랫폼에서 사용할 수 있습니다.The source and documentation can be found at SQLite.org. SQLite support is available on each mobile platform:

모든 플랫폼에서 데이터베이스 엔진을 사용할 수 있는 경우에도 데이터베이스에 액세스 하는 네이티브 메서드는 다릅니다.Even with the database engine available on all platforms, the native methods to access the database are different. IOS와 Android는 모두 Xamarin.ios 또는 Xamarin.ios에서 사용할 수 있는 SQLite에 액세스 하는 기본 제공 Api를 제공 하지만, 네이티브 SDK 메서드를 사용 하 여 코드를 공유 하는 기능을 제공 하지 않습니다. 단, SQL 쿼리 자체가 문자열로 저장 되었다고 가정 합니다. .Both iOS and Android offer built-in APIs to access SQLite that could be used from Xamarin.iOS or Xamarin.Android, however using the native SDK methods offers no ability to share code (other than perhaps the SQL queries themselves, assuming they’re stored as strings). 네이티브 데이터베이스 기능에 대 한 자세한 내용은 iOS 또는 Android의 SQLiteOpenHelper 클래스에서 CoreData를 검색 합니다. 이러한 옵션은 플랫폼 간이 아니기 때문에이 문서에서는 다루지 않습니다.For details about native database functionality search for CoreData in iOS or Android’s SQLiteOpenHelper class; because these options are not cross-platform they are beyond the scope of this document.

ADO.NETADO.NET

Xamarin.ios 및 Xamarin.ios는 모두 System.DataMono.Data.Sqlite를 지원 합니다 (자세한 내용은 Xamarin.ios 설명서 참조).Both Xamarin.iOS and Xamarin.Android support System.Data and Mono.Data.Sqlite (see the Xamarin.iOS documentation for more info). 이러한 네임 스페이스를 사용 하 여 두 플랫폼 모두에서 작동 하는 ADO.NET 코드를 작성할 수 있습니다.Using these namespaces allows you to write ADO.NET code that works on both platforms. System.Data.dllMono.Data.Sqlite.dll를 포함 하도록 프로젝트의 참조를 편집 하 고 다음 using 문을 코드에 추가 합니다.Edit the project’s references to include System.Data.dll and Mono.Data.Sqlite.dll and add these using statements to your code:

using System.Data;
using Mono.Data.Sqlite;

그러면 다음 샘플 코드가 작동 합니다.Then the following sample code will work:

string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "items.db3");
bool exists = File.Exists (dbPath);
if (!exists)
    SqliteConnection.CreateFile (dbPath);
var connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open ();
if (!exists) {
    // This is the first time the app has run and/or that we need the DB.
    // Copy a "template" DB from your assets, or programmatically create one like this:
    var commands = new[]{
        "CREATE TABLE [Items] (Key ntext, Value ntext);",
        "INSERT INTO [Items] ([Key], [Value]) VALUES ('sample', 'text')"
    };
    foreach (var command in commands) {
        using (var c = connection.CreateCommand ()) {
            c.CommandText = command;
            c.ExecuteNonQuery ();
        }
    }
}
// use `connection`... here, we'll just append the contents to a TextView
using (var contents = connection.CreateCommand ()) {
    contents.CommandText = "SELECT [Key], [Value] from [Items]";
    var r = contents.ExecuteReader ();
    while (r.Read ())
        Console.Write("\n\tKey={0}; Value={1}",
                r ["Key"].ToString (),
                r ["Value"].ToString ());
}
connection.Close ();

ADO.NET의 실제 구현은 다양 한 메서드와 클래스에 걸쳐 분리 됩니다 (이 예제는 데모용 으로만 사용 됨).Real-world implementations of ADO.NET would obviously be split across different methods and classes (this example is for demonstration purposes only).

SQLite-NET – 플랫폼 간 ORMSQLite-NET – Cross-Platform ORM

ORM (또는 개체 관계형 매퍼)은 클래스에서 모델링 된 데이터의 저장소를 단순화 하려고 합니다.An ORM (or Object-Relational Mapper) attempts to simplify storage of data modeled in classes. 테이블을 만들거나 클래스 필드 및 속성에서 수동으로 추출 된 데이터를 선택, 삽입 및 삭제 하는 SQL 쿼리를 수동으로 작성 하는 대신 ORM은이를 수행 하는 코드 계층을 추가 합니다.Rather than manually writing SQL queries that CREATE TABLEs or SELECT, INSERT and DELETE data that is manually extracted from class fields and properties, an ORM adds a layer of code that does that for you. ORM을 사용 하 여 클래스의 구조를 검사 하면 ORM에서 클래스와 일치 하는 테이블과 열을 자동으로 만들고 쿼리를 생성 하 여 데이터를 읽고 쓸 수 있습니다.Using reflection to examine the structure of your classes, an ORM can automatically create tables and columns that match a class and generate queries to read and write the data. 이를 통해 응용 프로그램 코드는 단지 ORM으로 개체 인스턴스를 보내고 검색할 수 있으며,이는 내부적으로 모든 SQL 작업을 처리 합니다.This allows application code to simply send and retrieve object instances to the ORM, which takes care of all the SQL operations under the hood.

SQLite-NET은 SQLite에 클래스를 저장 하 고 검색할 수 있는 간단한 ORM 역할을 합니다.SQLite-NET acts as a simple ORM that will allow you to save and retrieve your classes in SQLite. 컴파일러 지시문 및 기타 트릭의 조합을 사용 하 여 플랫폼 간 SQLite 액세스의 복잡성을 숨깁니다.It hides the complexity of cross platform SQLite access with a combination of compiler directives and other tricks.

SQLite의 기능:Features of SQLite-NET:

  • 테이블은 모델 클래스에 특성을 추가 하 여 정의 됩니다.Tables are defined by adding attributes to Model classes.
  • 데이터베이스 인스턴스는 SQLite 라이브러리의 기본 클래스인 SQLiteConnection의 서브 클래스로 표현 됩니다.A database instance is represented by a subclass of SQLiteConnection , the main class in the SQLite-Net library.
  • 개체를 사용 하 여 데이터를 삽입, 쿼리 및 삭제할 수 있습니다.Data can be inserted, queried and deleted using objects. 필요한 경우 sql 문을 작성할 수 있지만 SQL 문은 필요 하지 않습니다.No SQL statements are required (although you can write SQL statements if required).
  • SQLite-NET에서 반환 된 컬렉션에 대해 기본 Linq 쿼리를 수행할 수 있습니다.Basic Linq queries can be performed on the collections returned by SQLite-NET.

SQLite의 소스 코드 및 설명서는 github의 sqlite 에서 사용할 수 있으며 사례 연구에서 구현 되었습니다.The source code and documentation for SQLite-NET is available at SQLite-Net on github and has been implemented in both case-studies. 예를 들어 Tasky Pro 사례 연구에서 SQLITE-NET 코드의 간단한 예를 볼 수 있습니다.A simple example of SQLite-NET code (from the Tasky Pro case study) is shown below.

먼저 TodoItem 클래스는 특성을 사용 하 여 필드를 데이터베이스 기본 키로 정의 합니다.First, the TodoItem class uses attributes to define a field to be a database primary key:

public class TodoItem : IBusinessEntity
{
    public TodoItem () {}
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public bool Done { get; set; }
}

이를 통해 SQLiteConnection 인스턴스에서 다음 코드 줄 (및 SQL 문 없음)을 사용 하 여 TodoItem 테이블을 만들 수 있습니다.This allows a TodoItem table to be created with the following line of code (and no SQL statements) on an SQLiteConnection instance:

CreateTable<TodoItem> ();

테이블의 데이터는 SQL 문을 요구 하지 않고 SQLiteConnection의 다른 메서드를 사용 하 여 조작할 수도 있습니다.Data in the table can also be manipulated with other methods on the SQLiteConnection (again, without requiring SQL statements):

Insert (TodoItem); // 'task' is an instance with data populated in its properties
Update (TodoItem); // Primary Key field must be populated for Update to work
Table<TodoItem>.ToList(); // returns all rows in a collection

전체 예제는 사례 연구 소스 코드를 참조 하세요.See the case study source code for complete examples.

파일 액세스File Access

파일 액세스는 모든 응용 프로그램의 주요 부분입니다.File access is certain to be a key part of any application. 응용 프로그램에 포함 될 수 있는 파일의 일반적인 예는 다음과 같습니다.Common examples of files that might be part of an application include:

  • SQLite 데이터베이스 파일.SQLite database files.
  • 사용자가 생성 한 데이터 (텍스트, 이미지, 소리, 비디오)User-generated data (text, images, sound, video).
  • 캐싱에 대 한 데이터 (이미지, html 또는 PDF 파일)를 다운로드 합니다.Downloaded data for caching (images, html or PDF files).

System.IO 직접 액세스System.IO Direct Access

Xamarin.ios 및 Xamarin.ios는 모두 System.IO 네임 스페이스의 클래스를 사용 하 여 파일 시스템에 액세스할 수 있습니다.Both Xamarin.iOS and Xamarin.Android allow file system access using classes in the System.IO namespace.

각 플랫폼에는 고려해 야 할 다른 액세스 제한이 있습니다.Each platform does have different access restrictions that must be taken into consideration:

  • iOS 응용 프로그램은 파일 시스템 액세스가 매우 제한 된 샌드박스에서 실행 됩니다.iOS applications run in a sandbox with very restricted file-system access. Apple은 백업 된 특정 위치 (및 기타 다른 위치)를 지정 하 여 파일 시스템을 사용 하는 방법을 추가로 지정 합니다.Apple further dictates how you should use the file system by specifying certain locations that are backed-up (and others that are not). 자세한 내용은 xamarin.ios에서 파일 시스템 사용 가이드를 참조 하세요.Refer to the Working with the File System in Xamarin.iOS guide for more details.
  • 또한 Android는 응용 프로그램과 관련 된 특정 디렉터리에 대 한 액세스를 제한 하지만 외부 미디어도 지원 합니다 (예:Android also restricts access to certain directories related to the application, but it also supports external media (eg. SD 카드)를 만들고 공유 데이터에 액세스 합니다.SD cards) and accessing shared data.
  • Windows Phone 8 (Silverlight)는 직접 파일 액세스를 허용 하지 않습니다. 파일은 IsolatedStorage를 사용 해야만 조작할 수 있습니다.Windows Phone 8 (Silverlight) do not allow direct file access – files can only be manipulated using IsolatedStorage.
  • Windows 8.1 WinRT 및 Windows 10 UWP 프로젝트는 다른 플랫폼과 다른 Windows.Storage Api를 통해서만 비동기 파일 작업을 제공 합니다.Windows 8.1 WinRT and Windows 10 UWP projects only offer asynchronous file operations via Windows.Storage APIs, which are different from the other platforms.

IOS 및 Android에 대 한 예제Example for iOS and Android

텍스트 파일을 쓰고 읽는 간단한 예제는 다음과 같습니다.A trivial example that writes and reads a text file is shown below. Environment.GetFolderPath를 사용 하면 동일한 코드를 iOS 및 Android에서 실행할 수 있으며, 각각은 파일 시스템 규칙에 따라 올바른 디렉터리를 반환 합니다.Using Environment.GetFolderPath allows the same code to run on iOS and Android, which each return a valid directory based on their filesystem conventions.

string filePath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "MyFile.txt");
System.IO.File.WriteAllText (filePath, "Contents of text file");
Console.WriteLine (System.IO.ReadAllText (filePath));

IOS 관련 파일 시스템 기능에 대 한 자세한 내용은 파일 시스템 문서를 참조 하세요.Refer to the Xamarin.iOS Working with the File System document for more information on iOS-specific filesystem functionality. 플랫폼 간 파일 액세스 코드를 작성할 때 일부 파일 시스템은 대/소문자를 구분 하 고 다른 디렉터리 구분 기호를 사용 한다는 점에 주의 해야 합니다.When writing cross-platform file access code, remember that some file-systems are case-sensitive and have different directory separators. 파일 또는 디렉터리 경로를 생성할 때 파일 이름에 대해 항상 동일한 대/소문자를 사용 하 고 Path.Combine() 방법을 사용 하는 것이 좋습니다.It is good practice to always use the same casing for filenames and the Path.Combine() method when constructing file or directory paths.

Windows 8 및 Windows 10 용 windows 저장소Windows.Storage for Windows 8 and Windows 10

Xamarin.ios를 사용 하 여 Mobile Apps 만들기 문서20 장 . Async 및 File i/o 에는 Windows 8.1 및 Windows 10에 대 한 샘플이포함 되어 있습니다.The Creating Mobile Apps with Xamarin.Forms book Chapter 20. Async and File I/O includes samples for Windows 8.1 and Windows 10.

DependencyService 사용 하면 지원 되는 api를 사용 하 여 이러한 플랫폼에서 파일을 읽고 파일을 읽을 수 있습니다.Using a DependencyService it's possible to read and file files on these platforms using the supported APIs:

StorageFolder localFolder = ApplicationData.Current.LocalFolder;
IStorageFile storageFile = await localFolder.CreateFileAsync("MyFile.txt",
                                        CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(storageFile, "Contents of text file");

자세한 내용은 책 장 을 참조 하세요.Refer to the book chapter for more details.

Windows Phone 7 & 8 (Silverlight)의 격리 된 저장소Isolated Storage on Windows Phone 7 & 8 (Silverlight)

격리 된 저장소는 모든 iOS, Android 및 이전 Windows Phone 플랫폼에서 파일을 저장 하 고 로드 하는 일반적인 API입니다.Isolated Storage is a common API for saving and loading files across all iOS, Android, and older Windows Phone platforms.

공용 파일 액세스 코드를 작성할 수 있도록 Xamarin.ios 및 Xamarin.ios에서 구현 된 Windows Phone (Silverlight)의 파일 액세스에 대 한 기본 메커니즘입니다.It is the default mechanism for file access in Windows Phone (Silverlight) that has been implemented in Xamarin.iOS and Xamarin.Android to allow common file-access code to be written. System.IO.IsolatedStorage 클래스는 공유 프로젝트의 세 플랫폼에서 모두 참조할 수 있습니다.The System.IO.IsolatedStorage class can be referenced across all three platforms in a Shared Project.

자세한 내용은 격리 된 저장소 Windows Phone 개요 를 참조 하세요.Refer to the Isolated Storage Overview for Windows Phone for more information.

격리 된 저장소 Api는 이식 가능한 클래스 라이브러리에서 사용할 수 없습니다.The Isolated Storage APIs are not available in Portable Class Libraries. PCL의 한 가지 대안은 Pclstorage NuGet 입니다.One alternative for PCL is the PCLStorage NuGet

PCLs에서 플랫폼 간 파일 액세스Cross-platform file access in PCLs

또한 Xamarin 지원 플랫폼 및 최신 Windows Api에 대 한 플랫폼 간 파일 액세스 기능을 지 원하는 PCL 호환 Nuget – Pclstorage 가 있습니다.There is also a PCL-compatible Nuget – PCLStorage – that facilities cross-platform file access for Xamarin-supported platforms and the latest Windows APIs.

네트워크 작업Network Operations

대부분의 모바일 응용 프로그램에는 다음과 같은 네트워킹 구성 요소가 있습니다.Most mobile applications will have networking component, for example:

  • 이미지, 비디오 및 오디오를 다운로드 합니다 (예:Downloading images, video and audio (eg. 축소판 그림, 사진, 음악).thumbnails, photos, music).
  • 문서 다운로드 (예:Downloading documents (eg. HTML, PDF).HTML, PDF).
  • 사용자 데이터 (예: 사진 또는 텍스트)를 업로드 합니다.Uploading user data (such as photos or text).
  • 웹 서비스 또는 타사 Api (SOAP, XML 또는 JSON 포함)에 액세스 합니다.Accessing web services or 3rd party APIs (including SOAP, XML or JSON).

.NET Framework는 네트워크 리소스에 액세스 하기 위한 몇 가지 클래스 HttpClient, WebClientHttpWebRequest를 제공 합니다.The .NET Framework provides a few different classes for accessing network resources: HttpClient, WebClient, and HttpWebRequest.

HttpClientHttpClient

System.Net.Http 네임 스페이스의 HttpClient 클래스는 Xamarin.ios, Xamarin Android 및 대부분의 Windows 플랫폼에서 사용할 수 있습니다.The HttpClient class in the System.Net.Http namespace is available in Xamarin.iOS, Xamarin.Android, and most Windows platforms. 이 API를 이식 가능한 클래스 라이브러리 (및 Windows Phone 8 Silverlight)로 가져오는 데 사용할 수 있는 MICROSOFT HTTP 클라이언트 라이브러리 Nuget 이 있습니다.There is a Microsoft HTTP Client Library Nuget that can be used to bring this API into Portable Class Libraries (and Windows Phone 8 Silverlight).

var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://xamarin.com");
var response = await myClient.SendAsync(request);

WebClientWebClient

WebClient 클래스는 원격 서버에서 원격 데이터를 검색 하는 간단한 API를 제공 합니다.The WebClient class provides a simple API to retrieve remote data from remote servers.

Xamarin.ios 및 Xamarin이 동기 작업 (백그라운드 스레드에서 수행할 수 있음)을 지원 하더라도 유니버설 Windows 플랫폼 작업은 비동기적 이어야 합니다 .Universal Windows Platform operations must be async, even though Xamarin.iOS and Xamarin.Android support synchronous operations (which can be done on background threads).

간단한 보조적 WebClient 작업에 대 한 코드는 다음과 같습니다.The code for a simple asychronous WebClient operation is:

var webClient = new WebClient ();
webClient.DownloadStringCompleted += (sender, e) =>
{
    var resultString = e.Result;
    // do something with downloaded string, do UI interaction on main thread
};
webClient.Encoding = System.Text.Encoding.UTF8;
webClient.DownloadStringAsync (new Uri ("http://some-server.com/file.xml"));

WebClient에는 이진 데이터를 검색 하는 DownloadFileCompletedDownloadFileAsync 있습니다.WebClient also has DownloadFileCompleted and DownloadFileAsync for retrieving binary data.

HttpWebRequestHttpWebRequest

HttpWebRequestWebClient 보다 더 많은 사용자 지정 기능을 제공 하므로 더 많은 코드를 사용 해야 합니다.HttpWebRequest offers more customization than WebClient and as a result requires more code to use.

간단한 동기 HttpWebRequest 작업에 대 한 코드는 다음과 같습니다.The code for a simple synchronous HttpWebRequest operation is:

var request = HttpWebRequest.Create(@"http://some-server.com/file.xml ");
request.ContentType = "text/xml";
request.Method = "GET";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    if (response.StatusCode != HttpStatusCode.OK)
        Console.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        var content = reader.ReadToEnd();
        // do something with downloaded string, do UI interaction on main thread
    }
}

웹 서비스 설명서에는 예제가 있습니다.There is an example in our Web Services documentation.

연결 가능성Reachability

모바일 장치는 fast wi-fi 또는 4G 연결에서 잘못 된 수신 영역 및 느린 데이터 연결에 이르는 다양 한 네트워크 조건으로 작동 합니다.Mobile devices operate under a variety of network conditions from fast Wi-Fi or 4G connections to poor reception areas and slow EDGE data links. 따라서 원격 서버에 연결을 시도 하기 전에 네트워크를 사용할 수 있는지 여부와 사용 가능한 네트워크 유형을 검색 하는 것이 좋습니다.Because of this, it is good practice to detect whether the network is available and if so, what type of network is available, before attempting to connect to remote servers.

모바일 앱에서 수행할 수 있는 작업은 다음과 같습니다.Actions a mobile app might take in these situations include:

  • 네트워크를 사용할 수 없는 경우 사용자에 게 알려 주십시오.If the network is unavailable, advise the user. 수동으로 비활성화 한 경우 (예:If they have manually disabled it (eg. 비행기 모드를 설정 하거나 Wi-fi를 끌 때 문제를 해결할 수 있습니다.Airplane mode or turning off Wi-Fi) then they can resolve the issue.
  • 연결이 3G 인 경우 응용 프로그램은 다르게 동작할 수 있습니다. 예를 들어 Apple에서는 20Mb 보다 큰 앱을 3G를 통해 다운로드할 수 없습니다.If the connection is 3G, applications may behave differently (for example, Apple does not allow apps larger than 20Mb to be downloaded over 3G). 응용 프로그램은이 정보를 사용 하 여 많은 파일을 검색할 때 과도 한 다운로드 시간을 사용자에 게 경고할 수 있습니다.Applications could use this information to warn the user about excessive download times when retrieving large files.
  • 네트워크를 사용할 수 있는 경우에도 다른 요청을 시작 하기 전에 대상 서버와의 연결을 확인 하는 것이 좋습니다.Even if the network is available, it is good practice to verify connectivity with the target server before initiating other requests. 이렇게 하면 앱의 네트워크 작업이 반복적으로 시간 초과 되는 것을 방지 하 고 더 많은 정보를 제공 하는 오류 메시지가 사용자에 게 표시 될 수 있습니다.This will prevent the app’s network operations from timing out repeatedly and also allow a more informative error message to be displayed to the user.

네트워크 가용성을 검색 하는 데 도움이 되는 xamarin.ios 샘플 (Apple의 연결 가능 샘플 코드 를 기반으로 하는)이 있습니다.There is a Xamarin.iOS sample available (which is based on Apple’s Reachability sample code ) to help detect network availability.

WebServicesWebServices

Xamarin.ios를 사용 하 여 REST, SOAP 및 WCF 끝점에 액세스 하는 웹 서비스 작업에 대 한 설명서를 참조 하세요.See our documentation on Working with Web Services, which covers accessing REST, SOAP and WCF endpoints using Xamarin.iOS. 웹 서비스 요청을 직접 작성 하 고 응답을 구문 분석할 수는 있지만 Azure, RestSharp 및 ServiceStack를 비롯 하 여 훨씬 간단한 라이브러리를 사용할 수 있습니다.It is possible to hand-craft web service requests and parse the responses, however there are libraries available to make this much simpler, including Azure, RestSharp, and ServiceStack. Xamarin 앱에서 기본 WCF 작업에도 액세스할 수 있습니다.Even basic WCF operations can be accessed in Xamarin apps.

AzureAzure

Microsoft Azure는 데이터 저장 및 동기화, 푸시 알림 등 모바일 앱에 대 한 다양 한 서비스를 제공 하는 클라우드 플랫폼입니다.Microsoft Azure is a cloud platform that provides a wide variety of services for mobile apps, including data storage and sync, and push notifications.

Azure.microsoft.com 을 방문 하 여 무료로 사용해 보세요.Visit azure.microsoft.com to try it for free.

RestSharpRestSharp

RestSharp은 웹 서비스에 대 한 액세스를 간소화 하는 REST 클라이언트를 제공 하기 위해 모바일 응용 프로그램에 포함 될 수 있는 .NET 라이브러리입니다.RestSharp is a .NET library that can be included in mobile applications to provide a REST client that simplifies access to web services. 이를 통해 데이터를 요청 하 고 REST 응답을 구문 분석 하는 간단한 API를 제공할 수 있습니다.It helps by providing a simple API to request data and parse the REST response. RestSharp은 유용할 수 있습니다.RestSharp can be useful

RestSharp 웹 사이트 는 RestSharp를 사용 하 여 REST 클라이언트를 구현 하는 방법에 대 한 설명서 를 포함 합니다.The RestSharp website contains documentation on how to implement a REST client using RestSharp. RestSharp는 github에서 Xamarin.ios 및 xamarin Android 예제를 제공 합니다.RestSharp provides Xamarin.iOS and Xamarin.Android examples on github.

웹 서비스 설명서에는 xamarin.ios 코드 조각도 있습니다.There is also a Xamarin.iOS code snippet in our Web Services documentation.

ServiceStackServiceStack

RestSharp와 달리 ServiceStack는 웹 서비스를 호스트 하는 서버 쪽 솔루션 뿐 아니라 모바일 응용 프로그램에서 해당 서비스에 액세스 하기 위해 구현할 수 있는 클라이언트 라이브러리입니다.Unlike RestSharp, ServiceStack is both a server-side solution to host a web service as well as a client library that can be implemented in mobile applications to access those services.

Servicestack 웹 사이트 는 프로젝트의 목적과 문서 및 코드 샘플에 대 한 링크를 설명 합니다.The ServiceStack website explains the purpose of the project and links to document and code samples. 이 예에는 웹 서비스의 전체 서버 쪽 구현과이를 액세스할 수 있는 다양 한 클라이언트 쪽 응용 프로그램이 포함 됩니다.The examples include a complete server-side implementation of a web service as well as various client-side applications that can access it.

ServiceStack 웹 사이트에는 xamarin.ios 예제웹 서비스 설명서의 코드 조각이 있습니다.There is a Xamarin.iOS example on the ServiceStack website, and a code snippet in our Web Services documentation.

WCFWCF

Xamarin 도구는 WCF (일부 Windows Communication Foundation) 서비스를 사용 하는 데 도움이 될 수 있습니다.Xamarin tools can help you consume some Windows Communication Foundation (WCF) services. 일반적으로 Xamarin은 Silverlight 런타임과 함께 제공 되는 동일한 클라이언트 쪽 WCF의 하위 집합을 지원 합니다.In general, Xamarin supports the same client-side subset of WCF that ships with the Silverlight runtime. 여기에는 BasicHttpBinding를 사용 하 여 HTTP 전송 프로토콜을 통해 텍스트 인코딩된 SOAP 메시지의 가장 일반적인 인코딩 및 프로토콜 구현이 포함 됩니다.This includes the most common encoding and protocol implementations of WCF: text-encoded SOAP messages over the HTTP transport protocol using the BasicHttpBinding.

WCF 프레임 워크의 크기와 복잡성 때문에 Xamarin의 클라이언트 하위 집합 도메인에서 지원 되는 범위를 벗어나는 현재 및 향후 서비스 구현이 있을 수 있습니다.Due to the size and complexity of the WCF framework, there may be current and future service implementations that will fall outside of the scope supported by Xamarin’s client-subset domain. 또한 WCF 지원에는 프록시를 생성 하는 Windows 환경 에서만 사용할 수 있는 도구를 사용 해야 합니다.In addition, WCF support requires the use of tools only available in a Windows environment to generate the proxy.

스레딩Threading

응용 프로그램 응답성은 모바일 응용 프로그램에 중요 합니다. 즉, 사용자가 응용 프로그램을 로드 하 고 빠르게 수행할 수 있습니다.Application responsiveness is important for mobile applications – users expect applications to load and perform quickly. 사용자 입력 수신을 중지 하는 ' 고정 ' 화면은 응용 프로그램이 충돌 했음을 나타내는 것 처럼 보이지만, 네트워크 요청 또는 저속 로컬 작업 (예: 파일 압축 풀기)과 같은 장기 실행 차단 호출에 UI 스레드를 연결 하지 않는 것이 중요 합니다.A ‘frozen’ screen that stops accepting user-input will appear to indicate the application has crashed, so it is important not to tie up the UI thread with long-running blocking calls such as network requests or slow local operations (such as unzipping a file). 특히 시작 프로세스는 장기 실행 작업을 포함 해서는 안 됩니다. 모든 모바일 플랫폼은 로드 하는 데 너무 오래 걸리는 앱을 중지 합니다.In particular the startup process should not contain long-running tasks – all mobile platforms will kill an app that takes too long to load.

즉, 사용자 인터페이스에서 ' 진행률 표시기 '를 구현 하거나, 작업을 빠르게 수행할 수 있는 ' 사용 가능한 ' UI를 구현 하 고 백그라운드 작업을 수행할 비동기 작업을 구현 해야 합니다.This means your user interface should implement a ‘progress indicator’ or otherwise ‘useable’ UI that is quick to display, and asynchronous tasks to perform background operations. 백그라운드 작업을 실행 하려면 스레드를 사용 해야 합니다. 즉, 백그라운드 작업에서 주 스레드를 다시 통신 하 여 진행 상태를 표시 하거나 완료 된 시간을 나타내는 방법이 필요 합니다.Executing background tasks requires the use of threads, which means the background tasks needs a way to communicate back to the main thread to indicate progress or when they have completed.

병렬 작업 라이브러리Parallel Task Library

병렬 작업 라이브러리를 사용 하 여 만든 작업을 비동기적으로 실행 하 고 호출 스레드에서 반환할 수 있으므로 사용자 인터페이스를 차단 하지 않고 장기 실행 작업을 트리거하는 데 매우 유용 합니다.Tasks created with the Parallel Task Library can run asynchronously and return on their calling thread, making them very useful for triggering long-running operations without blocking the user interface.

간단한 병렬 작업 작업은 다음과 같습니다.A simple parallel task operation might look like this:

using System.Threading.Tasks;
void MainThreadMethod ()
{
    Task.Factory.StartNew (() => wc.DownloadString ("http://...")).ContinueWith (
        t => label.Text = t.Result, TaskScheduler.FromCurrentSynchronizationContext()
    );
}

키는 TaskScheduler.FromCurrentSynchronizationContext() (여기서는 MainThreadMethod를 실행 하는 주 스레드) 메서드를 호출 하는 스레드의 SynchronizationContext를 다시 사용 하 여 해당 스레드에 대 한 호출을 다시 마샬링하는 방법으로 사용 됩니다.The key is TaskScheduler.FromCurrentSynchronizationContext() which will reuse the SynchronizationContext.Current of the thread calling the method (here the main thread that is running MainThreadMethod) as a way to marshal back calls to that thread. 즉, UI 스레드에서 메서드가 호출 되 면 UI 스레드에서 ContinueWith 작업을 다시 실행 합니다.This means if the method is called on the UI thread, it will run the ContinueWith operation back on the UI thread.

코드가 다른 스레드에서 작업을 시작 하는 경우 다음 패턴을 사용 하 여 UI 스레드에 대 한 참조를 만들고 작업에서이를 다시 호출할 수 있습니다.If the code is starting tasks from other threads, use the following pattern to create a reference to the UI thread and the task can still call back to it:

static Context uiContext = TaskScheduler.FromCurrentSynchronizationContext();

UI 스레드에서 호출Invoking on the UI Thread

병렬 작업 라이브러리를 사용 하지 않는 코드의 경우 각 플랫폼에는 UI 스레드로 다시 마샬링 작업을 위한 자체 구문이 있습니다.For code that doesn’t utilize the Parallel Task Library, each platform has its own syntax for marshaling operations back to the UI thread:

  • iOSowner.BeginInvokeOnMainThread(new NSAction(action))iOSowner.BeginInvokeOnMainThread(new NSAction(action))
  • Androidowner.RunOnUiThread(action)Androidowner.RunOnUiThread(action)
  • Xamarin.iosDevice.BeginInvokeOnMainThread(action)Xamarin.FormsDevice.BeginInvokeOnMainThread(action)
  • WindowsDeployment.Current.Dispatcher.BeginInvoke(action)WindowsDeployment.Current.Dispatcher.BeginInvoke(action)

IOS와 Android 구문을 모두 사용 하려면 ' context ' 클래스를 사용 해야 합니다 .이는 코드에서이 개체를 UI 스레드에서 콜백이 필요한 메서드에 전달 해야 함을 의미 합니다.Both the iOS and Android syntax requires a ‘context’ class to be available which means the code needs to pass this object into any methods that require a callback on the UI thread.

공유 코드에서 UI 스레드를 호출 하려면 IDispatchOnUIThread 예제 ( @follesoe)를 따르세요.To make UI thread calls in shared code, follow the IDispatchOnUIThread example (courtesy of @follesoe). 및 프로그램을 공유 코드의 IDispatchOnUIThread 인터페이스로 선언 하 고 다음과 같이 플랫폼별 클래스를 구현 합니다.Declare and program to an IDispatchOnUIThread interface in the shared code and then implement the platform-specific classes as shown here:

// program to the interface in shared code
public interface IDispatchOnUIThread {
    void Invoke (Action action);
}
// iOS
public class DispatchAdapter : IDispatchOnUIThread {
    public readonly NSObject owner;
    public DispatchAdapter (NSObject owner) {
        this.owner = owner;
    }
    public void Invoke (Action action) {
        owner.BeginInvokeOnMainThread(new NSAction(action));
    }
}
// Android
public class DispatchAdapter : IDispatchOnUIThread {
    public readonly Activity owner;
    public DispatchAdapter (Activity owner) {
        this.owner = owner;
    }
    public void Invoke (Action action) {
        owner.RunOnUiThread(action);
    }
}
// WP7
public class DispatchAdapter : IDispatchOnUIThread {
    public void Invoke (Action action) {
        Deployment.Current.Dispatcher.BeginInvoke(action);
    }
}

Xamarin Forms 개발자는 공용 코드 (공유 프로젝트 또는 PCL)에서 Device.BeginInvokeOnMainThread 를 사용 해야 합니다.Xamarin.Forms developers should use Device.BeginInvokeOnMainThread in common code (Shared Projects or PCL).

플랫폼 및 장치 기능 및 성능 저하Platform and Device Capabilities and Degradation

다양 한 기능을 다루는 구체적인 예제는 플랫폼 기능 설명서에 제공 됩니다.Further specific examples of dealing with different capabilities are given in the Platform Capabilities documentation. 응용 프로그램의 잠재력을 최대한 활용할 수 없는 경우에도 다양 한 기능을 검색 하 고 응용 프로그램을 정상적으로 저하 하 여 적절 한 사용자 환경을 제공 하는 방법을 다룹니다.It deals with detecting different capabilities and how to gracefully degrade an application to provide a good user experience, even when the app can’t operate to its full potential.