개요
이 자습서에서는 Xamarin.Forms용 Azure Mobile Apps의 오프라인 동기화 기능을 소개합니다. 오프라인 동기화를 사용하면 최종 사용자가 네트워크 연결이 없는 경우에도 데이터를 보거나 추가하거나 수정하는 모바일 앱과 상호 작용할 수 있습니다. 변경 내용은 로컬 데이터베이스에 저장됩니다. 디바이스가 다시 온라인 상태가 되면 이러한 변경 내용이 원격 서비스와 동기화됩니다.
이 자습서는 [Xamarin iOS 앱 만들기] 자습서를 완료할 때 만드는 Mobile Apps용 Xamarin.Forms 빠른 시작 솔루션을 기반으로 합니다. Xamarin.Forms에 대한 빠른 시작 솔루션에는 오프라인 동기화를 지원하는 코드가 포함되어 있습니다. 이 코드는 사용하도록 설정하기만 하면 됩니다. 이 자습서에서는 Azure Mobile Apps의 오프라인 기능을 사용하도록 빠른 시작 솔루션을 업데이트합니다. 또한 앱에서 오프라인 관련 코드를 강조 표시합니다. 다운로드한 빠른 시작 솔루션을 사용하지 않는 경우 프로젝트에 데이터 액세스 확장 패키지를 추가해야 합니다. 서버 확장 패키지에 대한 자세한 내용은 Azure Mobile Apps용 .NET 백 엔드 서버 SDK작업을 참조하세요.
오프라인 동기화 기능에 대한 자세한 내용은 Azure Mobile Apps 오프라인 데이터 동기화항목을 참조하세요.
빠른 시작 솔루션에서 오프라인 동기화 기능 사용
오프라인 동기화 코드는 C# 전처리기 지시문을 사용하여 프로젝트에 포함됩니다. OFFLINE_SYNC_ENABLED 기호가 정의되면 이러한 코드 경로가 빌드에 포함됩니다. Windows 앱의 경우 SQLite 플랫폼도 설치해야 합니다.
Visual Studio에서 솔루션 >솔루션 관리...솔루션을 마우스 오른쪽 단추로 클릭한 다음 솔루션의 모든 프로젝트에 대해 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 패키지를 검색하고 설치합니다.
솔루션 탐색기에서 이름에 Portable이 포함된 이식 가능한 클래스 라이브러리 프로젝트에서 TodoItemManager.cs 파일을 열고, 다음 전처리기 지시문의 주석 처리를 제거합니다.
#define OFFLINE_SYNC_ENABLED(선택 사항) Windows 디바이스를 지원하려면 다음 SQLite 런타임 패키지 중 하나를 설치합니다.
Windows 8.1 런타임: Windows 8.1용 SQLite를 설치합니다.
Windows Phone 8.1: Windows Phone 8.1용 SQLite를설치합니다.
유니버설 Windows 플랫폼용 SQLite를 설치합니다.
빠른 시작에는 유니버설 Windows 프로젝트가 포함되지 않지만 유니버설 Windows 플랫폼은 Xamarin Forms에서 지원됩니다.
(선택 사항) 각 Windows 앱 프로젝트에서 참조>참조 추가...를 마우스 오른쪽 버튼으로 클릭하고, Windows 폴더의>확장을 클릭합니다. Windows SDK용 Visual C++ 2013 런타임과 함께 Windows SDK에 적합한 SQLite를 사용하도록 설정합니다. SQLite SDK 이름은 각 Windows 플랫폼에 따라 약간 다릅니다.
클라이언트 동기화 코드 검토
다음은 #if OFFLINE_SYNC_ENABLED 지시문 내의 자습서 코드에 이미 포함된 내용에 대한 간략한 개요입니다. 오프라인 동기화 기능은 이식 가능한 클래스 라이브러리 프로젝트의 TodoItemManager.cs 프로젝트 파일에 있습니다. 이 기능에 대한 개념적 개요는 Azure Mobile Apps 오프라인 데이터 동기화참조하세요.
테이블 작업을 수행하려면 먼저 로컬 저장소를 초기화해야 합니다. 로컬 저장소 데이터베이스는 다음 코드를 사용하여 TodoItemManager 클래스 생성자에서 초기화됩니다.
var store = new MobileServiceSQLiteStore(OfflineDbPath); store.DefineTable<TodoItem>(); //Initializes the SyncContext using the default IMobileServiceSyncHandler. this.client.SyncContext.InitializeAsync(store); this.todoTable = client.GetSyncTable<TodoItem>();이 코드는 MobileServiceSQLiteStore 클래스를 사용하여 새 로컬 SQLite 데이터베이스를 만듭니다.
DefineTable 메서드는 제공된 형식의 필드와 일치하는 테이블을 로컬 저장소에 만듭니다. 형식에 원격 데이터베이스에 있는 모든 열을 포함할 필요는 없습니다. 열의 하위 집합을 저장할 수 있습니다.
TodoItemManagertodoTable 필드는 IMobileServiceTable대신 IMobileServiceSyncTable 형식입니다. 이 클래스는 모든 CRUD(만들기, 읽기, 업데이트 및 삭제) 테이블 작업에 로컬 데이터베이스를 사용합니다. IMobileServiceSyncContextPushAsync 호출하여 이러한 변경 내용을 모바일 앱 백 엔드로 푸시하는 시기를 결정합니다. 동기화 컨텍스트는 PushAsync 호출될 때 클라이언트 앱이 수정한 모든 테이블의 변경 내용을 추적하고 푸시하여 테이블 관계를 유지하는 데 도움이 됩니다.
다음 SyncAsync 메서드는 모바일 앱 백 엔드와 동기화하기 위해 호출됩니다.
public async Task SyncAsync() { ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null; try { await this.client.SyncContext.PushAsync(); await this.todoTable.PullAsync( "allTodoItems", this.todoTable.CreateQuery()); } catch (MobileServicePushFailedException exc) { if (exc.PushResult != null) { syncErrors = exc.PushResult.Errors; } } // Simple error/conflict handling. if (syncErrors != null) { foreach (var error in syncErrors) { if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null) { //Update failed, reverting to server's copy. await error.CancelAndUpdateItemAsync(error.Result); } else { // Discard local change. await error.CancelAndDiscardItemAsync(); } Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]); } } }이 샘플에서는 기본 동기화 처리기와 함께 간단한 오류 처리를 사용합니다. 실제 애플리케이션은 사용자 지정 IMobileServiceSyncHandler 구현을 사용하여 네트워크 조건 및 서버 충돌과 같은 다양한 오류를 처리합니다.
오프라인 동기화 고려 사항
샘플에서 SyncAsync 메서드는 시작 시와 동기화가 요청된 경우에만 호출됩니다. Android 또는 iOS 앱에서 동기화를 시작하려면 항목 목록을 아래로 당깁니다. Windows의 경우 동기화 단추를 사용합니다. 실제 애플리케이션에서는 네트워크 상태가 변경되면 동기화 트리거를 만들 수도 있습니다.
컨텍스트에서 추적되는 보류 중인 로컬 업데이트가 있는 테이블에 대해 끌어오기를 실행하면 해당 끌어오기 작업이 이전 컨텍스트 푸시를 자동으로 트리거합니다. 이 샘플에서 항목을 새로 고치거나 추가하고 완료하는 경우 명시적 PushAsync 호출을 생략할 수 있습니다.
제공된 코드에서 원격 TodoItem 테이블의 모든 레코드가 쿼리되지만, 쿼리 ID와 쿼리를 전달하여 레코드를 필터링할 수 있으며, 이는 PushAsync을 통해 가능합니다. 자세한 내용은 Azure Mobile Apps의 오프라인 데이터 동기화에서 증분 동기화 섹션을 참조하세요.
클라이언트 앱 실행
이제 오프라인 동기화를 사용하도록 설정하면 각 플랫폼에서 클라이언트 애플리케이션을 한 번 이상 실행하여 로컬 저장소 데이터베이스를 채웁니다. 나중에 오프라인 시나리오를 시뮬레이션하고 앱이 오프라인 상태일 때 로컬 저장소의 데이터를 수정합니다.
클라이언트 앱의 동기화 동작 업데이트
이 섹션에서는 백 엔드에 잘못된 애플리케이션 URL을 사용하여 오프라인 시나리오를 시뮬레이션하도록 클라이언트 프로젝트를 수정합니다. 또는 디바이스를 "비행기 모드"로 이동하여 네트워크 연결을 끌 수 있습니다. 데이터 항목을 추가하거나 변경할 때 이러한 변경 내용은 로컬 저장소에 저장되지만 연결이 다시 설정될 때까지 백 엔드 데이터 저장소와 동기화되지 않습니다.
솔루션 탐색기에서 이식 가능한 프로젝트에서 Constants.cs 프로젝트 파일을 열고 잘못된 URL을 가리키도록
ApplicationURL값을 변경합니다.public static string ApplicationURL = @"https://your-service.azurewebsites.net/";이식 가능한 프로젝트에서 TodoItemManager.cs 파일을 연 다음 Exception 기본 클래스에 대해서 SyncAsync메서드의 try...catch 블록에 catch를 추가합니다. 이 catch 블록은 다음과 같이 예외 메시지를 콘솔에 씁니다.
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }클라이언트 앱을 빌드하고 실행합니다. 몇 가지 새 항목을 추가합니다. 백 엔드와 동기화하려는 각 시도에 대해 콘솔에 예외가 기록됩니다. 이러한 새 항목은 모바일 백 엔드로 푸시할 수 있을 때까지 로컬 저장소에만 존재합니다. 클라이언트 앱은 백 엔드에 연결된 것처럼 동작하여 모든 CRUD(만들기, 읽기, 업데이트, 삭제) 작업을 지원합니다.
앱을 닫고 다시 시작하여 만든 새 항목이 로컬 저장소에 유지되는지 확인합니다.
(선택 사항) Visual Studio를 사용하여 Azure SQL Database 테이블을 확인하여 백 엔드 데이터베이스의 데이터가 변경되지 않은지 확인합니다.
Visual Studio에서 서버 탐색기엽니다. Azure ->내의데이터베이스로 이동합니다. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 SQL Server 개체 탐색기 열기를 선택합니다. 이제 SQL 데이터베이스 테이블 및 해당 내용을 찾아볼 수 있습니다.
모바일 백 엔드를 다시 연결하도록 클라이언트 앱 업데이트
이 섹션에서는 온라인 상태로 돌아오는 앱을 시뮬레이션하는 모바일 백 엔드에 앱을 다시 연결합니다. 새로 고침 제스처를 수행하면 데이터가 모바일 백 엔드에 동기화됩니다.
Constants.cs 다시 엽니다. 올바른 URL을 가리키도록
applicationURL수정합니다.클라이언트 앱을 다시 빌드하고 실행합니다. 앱은 실행 후 모바일 앱 백 엔드와 동기화를 시도합니다. 디버그 콘솔에 예외가 기록되지 않는지 확인합니다.
(선택 사항) SQL Server 개체 탐색기 또는 Fiddler 또는 Postman같은 REST 도구를 사용하여 업데이트된 데이터를 봅니다. 백 엔드 데이터베이스와 로컬 저장소 간에 데이터가 동기화되었습니다.
데이터가 데이터베이스와 로컬 저장소 간에 동기화되었으며 앱 연결이 끊긴 동안 추가한 항목이 포함되어 있습니다.
추가 리소스
- Azure Mobile Apps에서의 오프라인 데이터 동기화
- Azure 모바일 앱 .NET SDK 사용 방법