【问题标题】:Xamarin.Mac URL SchemeXamarin.Mac URL 方案
【发布时间】:2013-10-18 20:48:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# macos xamarin monomac xamarin.mac


    【解决方案1】:

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

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

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

    它还提到了 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
        }
    

    【讨论】:

    • 我通过运行open /Applications/MyApp.app 启动应用程序,所以我尝试传递--debug,但没有运气附加调试器。我认为这里的复杂之处在于它是一个 Mac 应用程序,我敢打赌控制台应用程序可以正常工作。自定义命令很好,如果我觉得我需要调试,我会使用它——我想我只需要先让自定义 URL 方案工作。
    • 谢谢,当应用程序已经打开时,它现在会遇到断点,但如果应用程序尚未打开,它不会执行任何操作。有什么想法吗?不能从 URL 启动应用程序吗?
    • 如果它到达断点,听起来它设置正确。可能是 LaunchServices 的问题。你读过这个帖子吗:cocoabuilder.com/archive/cocoa/…?它有一些很好的信息可能会有所帮助......
    • 我终于让它工作了,我相信 url 方案正在启动另一个无法启动的应用程序构建(立即崩溃)。在弄清楚这一点后,它按预期工作。
    【解决方案2】:

    正如@TheNextman 所发布的,该解决方案确实有效,但这是一个更完整的解决方案。我从this 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2014-04-09
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2016-05-17
      相关资源
      最近更新 更多