공유
이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) IShare 인터페이스를 사용하는 방법을 설명합니다. 이 인터페이스는 텍스트 또는 웹 링크와 같은 데이터를 디바이스 공유 함수에 보내는 API를 제공합니다.
인터페이스의 IShare
기본 구현은 속성을 통해 Share.Default 사용할 수 있습니다. IShare
인터페이스와 Share
클래스는 모두 네임스페이스에 Microsoft.Maui.ApplicationModel.DataTransfer
포함됩니다.
공유 요청이 수행되면 디바이스에 공유 창이 표시되어 사용자에게 공유할 앱을 선택하라는 메시지가 표시됩니다.
시작하기
공유 기능에 액세스하려면 다음 플랫폼별 설정이 필요합니다.
설치가 필요하지 않습니다.
텍스트 및 링크 공유
공유 기능은 다른 애플리케이션에 공유할 정보를 포함하는 데이터 페이로드를 사용하여 메서드를 호출 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
});
여기에 설명된 모든 내용은 Share 및 Launcher에 대해 동일하게 작동합니다.
보기의 범위를 계산하는 데 도움이 되는 확장 메서드는 다음과 같습니다.
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와의 플랫폼별 차이점에 대해 설명합니다.
- 이 ShareTextRequest.Subject 속성은 메시지의 원하는 제목에 사용됩니다.
.NET MAUI