You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Mac应用未启动时无法触发handleGetURLEvent处理传入URL

解决冷启动时自定义URL Scheme不触发事件的问题

问题原因

当应用处于冷启动状态(未运行时被URL唤起)时,系统传递的URL事件会在WillFinishLaunching方法执行前就已经存在,此时才设置NSAppleEventManager的事件处理器,会错过这个启动触发的URL事件。

解决方案

1. 先处理冷启动的URL参数

在启动流程早期先检查启动选项中的URL,直接处理冷启动场景,再设置事件处理器应对后续已启动状态的唤起:

public override bool WillFinishLaunching(NSNotification notification)
{
    // 优先处理冷启动时传入的URL
    if (notification.UserInfo != null)
    {
        var urlKey = NSApplication.LaunchUserInfoURLKey;
        if (notification.UserInfo.ContainsKey(urlKey))
        {
            var url = notification.UserInfo[urlKey] as NSUrl;
            if (url != null)
            {
                Logger.Info($"冷启动唤起URL: {url.AbsoluteString}");
                ProcessIncomingUrl(url);
            }
        }
    }

    // 设置事件处理器,处理应用已启动时的URL唤起
    NSAppleEventManager.SharedAppleEventManager.SetEventHandler(
        this, 
        new ObjCRuntime.Selector("handleGetURLEvent:withReplyEvent:"), 
        AEEventClass.Internet, 
        AEEventID.GetUrl);

    return base.WillFinishLaunching(notification);
}

[Export("handleGetURLEvent:withReplyEvent:")]
private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
{
    var urlString = descriptor.ParamDescriptorForKeyword(AEKeyword.DirectObject).StringValue;
    var url = new NSUrl(urlString);
    Logger.Info($"已启动状态唤起URL: {url.AbsoluteString}");
    ProcessIncomingUrl(url);
}

// 提取通用的URL处理逻辑,统一复用
private void ProcessIncomingUrl(NSUrl url)
{
    // 在这里编写URL解析、页面跳转等具体业务逻辑
}

2. 确认Info.plist配置正确性

检查Info.plist中URL Scheme的配置是否完整,确保自定义Scheme已正确添加:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>你的自定义Scheme名称</string>
        </array>
    </dict>
</array>

内容的提问来源于stack exchange,提问作者MaxDestiny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:45:20