.net Maui 中的深度链接“窗口已创建”

问题描述 投票:0回答:1

我想在我的 .net Maui 应用程序中实现深层链接。我在物理 Android 设备上进行测试。当应用程序关闭时,一切正常,但如果应用程序仍然在后台打开并且我打开链接,则会收到错误“窗口已创建”。我遵循 Microsoft 的标准指南 (https://learn.microsoft.com/en-us/dotnet/maui/android/app-links?view=net-maui-8.0)

这是我的 Mauiprogram.cs:

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .UseMauiCommunityToolkit()
            .UseViewServices()
            .UseMicrocharts()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            })
            .ConfigureLifecycleEvents(lifecycle =>
            {
#if IOS || MACCATALYST
#elif ANDROID
                lifecycle.AddAndroid(android => {
                    android.OnCreate((activity, bundle) =>
                    {
                        var action = activity.Intent?.Action;
                        var data = activity.Intent?.Data?.ToString();

                        if (action == Intent.ActionView && data is not null)
                        {
                            HandleAppLink(data);
                        }
                    });
                });
#endif
            });

//...

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }

    static void HandleAppLink(string url)
    {
        if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out var uri))
            App.Current?.SendOnAppLinkRequestReceived(uri);
    }
}

这是我的 OnAppLinkRequestReceived:

protected override async void OnAppLinkRequestReceived(Uri uri)
{
    base.OnAppLinkRequestReceived(uri);

    // Überprüft, ob die Anforderung von der Passwort-App stammt
    if (uri.Host == "engelberth-developing" && uri.Segments != null)
    {
        // Behandelt den App-Link für das Teilen von Elementen
        if (uri.Segments.Length == 5 && uri.Segments[2] == "share/")
        {
            Global.Transfer = uri.Segments[3].Replace("/", "|") + uri.Segments[4].Replace("/", "").Replace('*', '/');

            // Setzt die nächste Seite auf die Seite zum Freigeben von Elementen
            await AssignService.SetNextPage<ISharedItemPage>();
        }
        // Behandelt den App-Link für die Synchronisierung von Geräten
        else if (uri.Segments.Length == 4 && uri.Segments[2] == "sync/")
        {
            Global.Transfer = uri.Segments[3].Replace("/", "").Replace('*', '/');

            // Setzt die nächste Seite auf die Seite für die Gerätesynchronisierung
            await AssignService.SetNextPage<IDeviceSyncPage>();
        }
    }
}

这是我的服务功能。对于所有其他操作,它都 100% 工作:

public static async Task SetNextPage<TService>(string paramValue = null)
{
    var implementationType = services
                             .Where(service => service.ServiceType == typeof(TService))
                             .Select(service => service.ImplementationType)
                             .FirstOrDefault();

    if (implementationType != null)
    {
        var route = paramValue != null ? $"/{implementationType.Name}?{paramValue}" : $"/{implementationType.Name}";
        await Shell.Current.GoToAsync(route);
    }
}

该方法每次都会被调用。所以这不是问题。问题是,当应用程序应该切换一侧并以错误结束时。

c# android xaml maui deep-linking
1个回答
0
投票

我想在我的 .net Maui 应用程序中实现深层链接。我在物理 Android 设备上进行测试。当应用程序关闭时,一切正常,但如果应用程序仍在后台打开并且我打开链接,则会收到错误“窗口已创建”。

这是 MAUI 的一个已知问题。您可以检查此问题:当应用程序从后台重新打开时,MAUI Android 构建崩溃。它抛出异常:“窗口已创建。” #18692。尝试设置

LaunchMode = LaunchMode.SingleTop
或报告您的情况。

希望这个问题可以帮助到你!

© www.soinside.com 2019 - 2024. All rights reserved.