Aracılığıyla paylaş


Launcher

Browse sample. Örneğe göz atın

Bu makalede .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) ILauncher arabirimini nasıl kullanabileceğiniz açıklanmaktadır. Bu arabirim, bir uygulamanın sistem tarafından bir URI açmasına olanak tanır. Bir uygulamayı açmanın bu yolu genellikle başka bir uygulamanın özel URI düzenlerine ayrıntılı bir şekilde bağlanırken kullanılır.

Arabirimin ILauncher varsayılan uygulaması özelliği aracılığıyla Launcher.Default kullanılabilir. ILauncher Hem arabirim hem Launcher de sınıf ad alanında Microsoft.Maui.ApplicationModel yer alır.

Önemli

Tarayıcıyı bir web sitesine açmak için bunun yerine Tarayıcı API'sini kullanın.

Başlarken

Başlatıcı işlevine erişmek için aşağıdaki platforma özgü kurulum gereklidir.

Diğer Android uygulamalarını açmak için ayrıntılı bağlantılar kullanmak istiyorsanız, uygulamanızda bir amaç filtresi tanımlamanız gerekir. Bu, Platforms/Android/AndroidManifest.xml dosyasına aşağıdaki XML eklenerek elde edilebilir:

<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> Öğeler, uygulamanızla önceden kaydedilmiş URI düzenleridir. Amaç filtresinde tanımlanmayan düzenleri kullanamazsınız.

Uygulamanızı diğer uygulamalardan göz atılabilir hale getirmek için özniteliğine android:scheme sahip bir <data> öğe bildirin:

<data android:scheme="appName"/>

Başka bir uygulama açma

Launcher işlevini kullanmak için yöntemini çağırın ILauncher.OpenAsync ve açmak için bir veya Uri uygulamasını temsil eden bir String geçirin. İsteğe bağlı olarak, URI düzeninin ILauncher.CanOpenAsync(Uri) cihazdaki bir uygulama tarafından işlenip işlenmediğini denetlemek için yöntemi kullanılabilir. Aşağıdaki kod, bir URI düzeninin desteklenip desteklenmediğini denetlemeyi gösterir ve ardından URI'yi açar:

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

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

Önceki kod örneği, açmadan önce URI düzeninin TryOpenAsync(Uri)açılıp açılamadığını denetleyen kullanılarak basitleştirilebilir:

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

if (launcherOpened)
{
    // Do something fun
}

Dosya aracılığıyla başka bir uygulama açma

Başlatıcı, seçili bir dosyayla bir uygulamayı açmak için de kullanılabilir. .NET MAUI, dosya türünü (MIME) otomatik olarak algılar ve bu dosya türü için varsayılan uygulamayı açar. Dosya türüne birden fazla uygulama kaydedildiyse, kullanıcıya bir uygulama seçimi açılır penceresi gösterilir.

Aşağıdaki kod örneği bir dosyaya metin yazar ve başlatıcı ile metin dosyasını açar:

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)));

Başlatıcı konumunu ayarlama

Önemli

Bu bölüm yalnızca iPadOS için geçerlidir.

iPadOS'ta paylaşım isteğinde bulunurken veya başlatıcıyı açarken, bunu bir açılır pencerede sunabilirsiniz. Bu, popover'ın nerede görüneceğini belirtir ve bir oku doğrudan işaret eder. Bu konum genellikle eylemi başlatan denetimdir. Özelliğini kullanarak PresentationSourceBounds konumu belirtebilirsiniz:

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
    });

Burada açıklanan her şey ve Launcheriçin Share eşit şekilde çalışır.

Bir görünümün sınırlarını hesaplamaya yardımcı olan bir uzantı yöntemi aşağıdadır:

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);
    }
}

Bu daha sonra çağrılırken RequestAsynckullanılabilir:

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
    }
}

tetiklendiğinde Command çağıran öğesini geçirebilirsiniz:

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

Sınıfının bir örneği ViewHelpers için bkz. GitHub'da barındırılan .NET MAUI Örneği.

Platform farklılıkları

Bu bölümde, başlatıcı API'siyle platforma özgü farklar açıklanmaktadır.

' Task den CanOpenAsync döndürülen hemen tamamlar.