我想在我的 .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);
}
}
该方法每次都会被调用。所以这不是问题。问题是,当应用程序应该切换一侧并以错误结束时。
我想在我的 .net Maui 应用程序中实现深层链接。我在物理 Android 设备上进行测试。当应用程序关闭时,一切正常,但如果应用程序仍在后台打开并且我打开链接,则会收到错误“窗口已创建”。
这是 MAUI 的一个已知问题。您可以检查此问题:当应用程序从后台重新打开时,MAUI Android 构建崩溃。它抛出异常:“窗口已创建。” #18692。尝试设置
LaunchMode = LaunchMode.SingleTop
或报告您的情况。
希望这个问题可以帮助到你!