Launcher

Browse sample. 샘플 찾아보기

이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) ILauncher 인터페이스를 사용하는 방법을 설명합니다. 이 인터페이스를 사용하면 애플리케이션이 시스템에서 URI를 열 수 있습니다. 애플리케이션을 여는 이러한 방법은 다른 애플리케이션의 사용자 지정 URI 스키마에 딥 링크할 때 자주 사용됩니다.

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

Important

브라우저를 웹 사이트로 열려면 브라우저 API를 대신 사용합니다.

시작하기

시작 관리자 기능에 액세스하려면 다음 플랫폼별 설정이 필요합니다.

딥 링크를 사용하여 다른 Android 앱을 열려면 앱에서 의도 필터를 정의해야 합니다. 이 작업은 Platforms/Android/AndroidManifest.xml 파일에 다음 XML을 추가하여 수행할 수 있습니다.

<activity android:name="appName" android:exported="true">
    <intent-filter>
       <action android:name="android.intent.action.VIEW" />
       <category android:name="android.intent.category.DEFAULT" />
       <category android:name="android.intent.category.BROWSABLE" />
       <data android:scheme="lyft"/>
       <data android:scheme="fb"/>
       </intent-filter>
</activity>

요소는 <data> 앱에 미리 등록된 URI 스키마입니다. 의도 필터에 정의되지 않은 체계는 사용할 수 없습니다.

다른 앱에서 앱을 검색할 수 있도록 하려면 특성이 있는 <data> 요소를 android:scheme 선언합니다.

<data android:scheme="appName"/>

다른 앱 열기

시작 관리자 기능을 사용하려면 메서드를 ILauncher.OpenAsync 호출하고 열려는 앱을 전달 String 하거나 Uri 나타냅니다. 필요에 따라 디바이스의 ILauncher.CanOpenAsync(Uri) 앱에서 URI 체계를 처리할 수 있는 경우 이 메서드를 사용하여 검사 수 있습니다. 다음 코드에서는 URI 구성표가 지원되는지 여부를 검사 다음 URI를 여는 방법을 보여 줍니다.

bool supportsUri = await Launcher.Default.CanOpenAsync("lyft://");

if (supportsUri)
    await Launcher.Default.OpenAsync("lyft://ridetype?id=lyft_line");

이전 코드 예제는 URI 구성표를 열기 전에 검사 사용하여 간소화TryOpenAsync(Uri)할 수 있습니다.

bool launcherOpened = await Launcher.Default.TryOpenAsync("lyft://ridetype?id=lyft_line");

if (launcherOpened)
{
    // Do something fun
}

파일을 통해 다른 앱 열기

시작 관리자를 사용하여 선택한 파일이 있는 앱을 열 수도 있습니다. .NET MAUI는 MIME(파일 형식)를 자동으로 검색하고 해당 파일 형식에 대한 기본 앱을 엽니다. 둘 이상의 앱이 파일 형식으로 등록된 경우 앱 선택 팝오버가 사용자에게 표시됩니다.

다음 코드 예제에서는 파일에 텍스트를 쓰고 시작 관리자를 사용하여 텍스트 파일을 엽니다.

string popoverTitle = "Read text file";
string name = "File.txt";
string file = System.IO.Path.Combine(FileSystem.CacheDirectory, name);

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

await Launcher.Default.OpenAsync(new OpenFileRequest(popoverTitle, new ReadOnlyFile(file)));

시작 관리자 위치 설정

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와의 플랫폼별 차이점에 대해 설명합니다.

반환된 TaskCanOpenAsync 작업은 즉시 완료됩니다.