데이터 공유

이 문서에서는 데스크톱 또는 UWP(유니버설 Windows 플랫폼) 앱에서 공유 계약을 지원하는 방법을 설명합니다. 공유 계약은 앱 간에 텍스트, 링크, 사진 및 비디오와 같은 데이터를 빠르게 공유할 수 있는 쉬운 방법입니다. 예를 들어, 사용자는 소셜 네트워킹 앱을 사용하여 친구들과 웹 페이지를 공유하거나 나중에 참조할 수 있도록 노트 앱에 링크를 저장하려고 할 수 있습니다.

참고 항목

이 문서의 코드 예제는 UWP 앱에서 가져온 것입니다. 데스크톱 앱은 IDataTransferManagerInterop을 사용해야 합니다. 더 많은 정보 및 코드 예제는 CoreWindow에 의존하는 WinRT UI 개체 표시를 참조하세요. WPF 공유 콘텐츠 원본 앱 샘플도 참조하세요.

이벤트 처리기 설정

사용자가 공유를 호출할 때마다 호출할 DataRequested 이벤트 처리기를 추가합니다. 이는 사용자가 앱의 컨트롤(예: 단추 또는 앱 바 명령)을 탭하거나 특정 시나리오에서 자동으로 발생할 수 있습니다(예를 들어 사용자가 수준을 완료하고 높은 점수를 얻는 경우).

DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;

DataRequested 이벤트가 발생하면 앱은 DataRequest 개체를 받습니다. 여기에는 사용자가 공유하려는 콘텐츠를 제공하는 데 사용할 수 있는 DataPackage가 포함되어 있습니다. 공유할 제목과 데이터를 제공해야 합니다. 설명은 선택 사항이지만 권장됩니다.

DataRequest request = args.Request;

데이터 선택

다음을 비롯한 다양한 유형의 데이터를 공유할 수 있습니다.

  • 일반 텍스트
  • URI(Uniform Resource Identifier)
  • HTML
  • 서식 있는 텍스트
  • 비트맵
  • Files
  • 사용자 지정 개발자 정의 데이터

DataPackage 개체는 이러한 형식 중 하나 이상을 조합하여 포함할 수 있습니다. 다음 예제는 텍스트 공유에 대한 설명입니다.

request.Data.SetText("Hello world!");

속성 설정

공유를 위해 데이터를 패키지할 때 공유되는 콘텐츠에 대한 추가 정보를 제공하는 다양한 속성을 제공할 수 있습니다. 이러한 속성은 대상 앱이 사용자 환경을 개선하는 데 도움이 됩니다. 예를 들어 설명은 사용자가 둘 이상의 앱과 콘텐츠를 공유할 때 도움이 됩니다. 이미지를 공유할 때 썸네일을 추가하거나 웹 페이지에 대한 링크를 추가하면 사용자에게 시각적 참조가 제공됩니다. 자세한 내용은 DataPackagePropertySet을 참조하세요.

Warning

제목을 제외한 모든 속성은 선택 사항입니다. title 속성은 필수이며 설정해야 합니다.

request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";

공유 UI 시작

공유를 위한 UI는 시스템에서 제공합니다. 시작하려면 ShowShareUI 메서드를 호출합니다.

DataTransferManager.ShowShareUI();

오류 처리

대부분의 경우 콘텐츠를 공유하는 것은 간단한 프로세스입니다. 그러나 예기치 않은 일이 발생할 가능성이 항상 있습니다. 예를 들어 앱은 사용자가 공유할 콘텐츠를 선택하도록 요구할 수 있지만 사용자는 아무 콘텐츠도 선택하지 않았습니다. 이러한 상황을 처리하려면 오류가 발생할 경우 사용자에게 메시지를 표시하는 FailWithDisplayText 메서드를 사용합니다.

대리자를 사용하여 공유 지연

경우에 따라 사용자가 즉시 공유하려는 데이터를 준비하는 것이 타당하지 않을 수 있습니다. 예를 들어 앱에서 여러 가지 가능한 형식으로 큰 이미지 파일 보내기를 지원하는 경우 사용자가 선택하기 전에 이러한 모든 이미지를 만드는 것은 비효율적입니다.

이 문제를 해결하기 위해 DataPackage에는 수신 앱이 데이터를 요청할 때 호출되는 함수인 대리자가 포함될 수 있습니다. 사용자가 공유하려는 데이터가 리소스를 많이 사용하는 경우 언제든지 대리자를 사용하는 것이 좋습니다.

async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
    // Provide updated bitmap data using delayed rendering
    if (this.imageStream != null)
    {
        DataProviderDeferral deferral = request.GetDeferral();
        InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();

        // Decode the image.
        BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);

        // Re-encode the image at 50% width and height.
        BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
        imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
        imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
        await imageEncoder.FlushAsync();

        request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
        deferral.Complete();
    }
}

참고 항목