5

如何使用 Xamarin.Mac 设置和调试 URL 方案?

我将以下内容添加到我的Info.plist

信息列表

然后我构建了一个安装程序包并安装了该应用程序。但是,如果我mytest://在浏览器中打开或运行open mytest://命令行,都不会启动我的应用程序。

此外,有没有办法在运行后在 Xamarin Studio 中附加调试器mytest://?在 Windows 上我会使用Debugger.BreakDebugger.Attach但这些方法似乎没有在 Mono 中实现。

4

2 回答 2

5

它没有直接解决您的问题,但是这个问题的答案对您有帮助吗?

具体来说,它解决了在您的项目中使用自定义执行命令选项的问题。您可以定义一个自定义命令来在调试器中执行您的应用程序:

打开“项目选项”,进入“运行>自定义命令”部分,为“执行”添加自定义命令

它还提到了 Debugger.Break 行为:

如果您的应用在 Mono 2.11 或更高版本的 Mono 软调试器中运行 [...],它将为软调试器设置一个软断点并按预期工作


编辑:

您可以在已经运行的 Mac 应用程序上调用 URL……您可以设置一个处理程序来捕获事件,在内部设置断点并检查您的 URL 是否正确调用了已经运行的应用程序?它可能会为您提供有关行为的线索或进一步调试的方法。像这样的东西:

    public override void FinishedLaunching(NSObject notification)
    {
        NSAppleEventManager appleEventManager = NSAppleEventManager.SharedAppleEventManager;

        appleEventManager.SetEventHandler(this, new Selector("handleGetURLEvent:withReplyEvent:"), AEEventClass.Internet, AEEventID.GetUrl);
    }

    [Export("handleGetURLEvent:withReplyEvent:")]
    private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
    {
        // Breakpoint here, debug normally and *then* call your URL
    }
于 2013-10-19T22:38:39.197 回答
5

正如@TheNextman 所发布的,该解决方案确实有效,但这是一个更完整的解决方案。我从这个Xamarin 论坛主题中获得了以下信息。正如用户(和 Xamarin 员工)Sebastien Pouliot (@poupou) 所说,

我从未使用过那个特定的 API,但枚举值中的四个字符在 Apple API 中很常见。

四个字符(4 个字节)被编译成一个整数。如果没有可用的 C# 枚举,那么您可以将字符串转换为以下代码的整数:

public static int FourCC (string s) {
    return (((int)s [0]) << 24 |
        ((int)s [1]) << 16 |
        ((int)s [2]) << 8 |
        ((int)s [3]));
}

所以完整的样本如下,

public override void FinishedLaunching(NSObject notification)
{
    NSAppleEventManager.SharedAppleEventManager.SetEventHandler(this, new Selector("handleGetURLEvent:withReplyEvent:"), AEEventClass.Internet, AEEventID.GetUrl);
}

[Export("handleGetURLEvent:withReplyEvent:")]
private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
{
    string keyDirectObject = "----";
    uint keyword = (((uint)keyDirectObject[0]) << 24 |
                   ((uint)keyDirectObject[1]) << 16 |
                   ((uint)keyDirectObject[2]) << 8 |
                   ((uint)keyDirectObject[3]));
    string urlString = descriptor.ParamDescriptorForKeyword(keyword).StringValue;
}
于 2015-07-15T09:07:56.317 回答