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
相关产品推荐
相关产品推荐

