공유

Browse sample. 샘플 찾아보기

이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) IShare 인터페이스를 사용하는 방법을 설명합니다. 이 인터페이스는 텍스트 또는 웹 링크와 같은 데이터를 디바이스 공유 함수에 보내는 API를 제공합니다.

인터페이스의 IShare 기본 구현은 속성을 통해 Share.Default 사용할 수 있습니다. IShare 인터페이스와 Share 클래스는 모두 네임스페이스에 Microsoft.Maui.ApplicationModel.DataTransfer 포함됩니다.

공유 요청이 수행되면 디바이스에 공유 창이 표시되어 사용자에게 공유할 앱을 선택하라는 메시지가 표시됩니다.

Share from your app to a different app

시작하기

공유 기능에 액세스하려면 다음 플랫폼별 설정이 필요합니다.

설치가 필요하지 않습니다.

공유 기능은 다른 애플리케이션에 공유할 정보를 포함하는 데이터 페이로드를 사용하여 메서드를 호출 RequestAsync 하여 작동합니다. ShareTextRequest.Text 혼합할 수 있으며 ShareTextRequest.Uri 각 플랫폼은 콘텐츠에 따라 필터링을 처리합니다.

public async Task ShareText(string text)
{
    await Share.Default.RequestAsync(new ShareTextRequest
    {
        Text = text,
        Title = "Share Text"
    });
}

public async Task ShareUri(string uri, IShare share)
{
    await share.RequestAsync(new ShareTextRequest
    {
        Uri = uri,
        Title = "Share Web Link"
    });
}

파일 공유

디바이스의 다른 애플리케이션에 파일을 공유할 수도 있습니다. .NET MAUI는 MIME(파일 형식)를 자동으로 검색하고 공유를 요청합니다. 그러나 운영 체제는 공유할 수 있는 파일 형식을 제한할 수 있습니다. 단일 파일을 공유하려면 형식을 ShareFileRequest 사용합니다.

다음 코드 예제에서는 디바이스에 텍스트 파일을 쓴 다음 공유를 요청합니다.

public async Task ShareFile()
{
    string fn = "Attachment.txt";
    string file = Path.Combine(FileSystem.CacheDirectory, fn);

    File.WriteAllText(file, "Hello World");

    await Share.Default.RequestAsync(new ShareFileRequest
    {
        Title = "Share text file",
        File = new ShareFile(file)
    });
}

여러 파일 공유

여러 파일을 공유하는 것은 단일 파일 공유와 약간 다릅니다. 단일 파일을 공유하려면 형식을 ShareMultipleFilesRequest 사용합니다.

다음 코드 예제에서는 디바이스에 두 개의 텍스트 파일을 쓴 다음 공유를 요청합니다.

public async Task ShareMultipleFiles()
{
    string file1 = Path.Combine(FileSystem.CacheDirectory, "Attachment1.txt");
    string file2 = Path.Combine(FileSystem.CacheDirectory, "Attachment2.txt");

    File.WriteAllText(file1, "Content 1");
    File.WriteAllText(file2, "Content 2");

    await Share.Default.RequestAsync(new ShareMultipleFilesRequest
    {
        Title = "Share multiple files",
        Files = new List<ShareFile> { new ShareFile(file1), new ShareFile(file2) }
    });
}

프레젠테이션 위치

Important

이 섹션은 iPadOS에만 적용됩니다.

iPadOS에서 공유를 요청하거나 시작 관리자를 열 때 팝오버에 표시할 수 있습니다. 팝오버가 표시되는 위치를 지정하고 화살표를 직접 가리킵니다. 이 위치는 보통 작업을 시작한 컨트롤입니다. PresentationSourceBounds 속성을 사용하여 위치를 지정할 수 있습니다.

await Share.RequestAsync(new ShareFileRequest
    {
        Title = Title,
        File = new ShareFile(file),
        PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                                ? new Rect(0, 20, 0, 0)
                                : Rect.Zero
    });
await Launcher.OpenAsync(new OpenFileRequest
    {
        File = new ReadOnlyFile(file),
        PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                                ? new Rect(0, 20, 0, 0)
                                : Rect.Zero
    });

여기에 설명된 모든 내용은 ShareLauncher에 대해 동일하게 작동합니다.

보기의 범위를 계산하는 데 도움이 되는 확장 메서드는 다음과 같습니다.

public static class ViewHelpers
{
    public static Rect GetAbsoluteBounds(this Microsoft.Maui.Controls.View element)
    {
        Element looper = element;

        var absoluteX = element.X + element.Margin.Top;
        var absoluteY = element.Y + element.Margin.Left;

        // Add logic to handle titles, headers, or other non-view bars

        while (looper.Parent != null)
        {
            looper = looper.Parent;
            if (looper is Microsoft.Maui.Controls.View v)
            {
                absoluteX += v.X + v.Margin.Top;
                absoluteY += v.Y + v.Margin.Left;
            }
        }

        return new Rect(absoluteX, absoluteY, element.Width, element.Height);
    }
}

RequestAsync 호출 시 이를 활용할 수 있습니다.

public Command<Microsoft.Maui.Controls.View> ShareCommand { get; } = new Command<Microsoft.Maui.Controls.View>(Share);

async void Share(Microsoft.Maui.Controls.View element)
{
    try
    {
        await Share.Default.RequestAsync(new ShareTextRequest
        {
            PresentationSourceBounds = element.GetAbsoluteBounds(),
            Title = "Title",
            Text = "Text"
        });
    }
    catch (Exception)
    {
        // Handle exception that share failed
    }
}

Command 트리거 시 호출하는 요소를 전달할 수 있습니다.

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

클래스의 예제는 ViewHelpers GitHub에서 호스트되는 .NET MAUI 샘플을 참조하세요.

플랫폼 간 차이점

이 섹션에서는 공유 API와의 플랫폼별 차이점에 대해 설명합니다.