2013-10-18 71 views
3

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

添加以下到我的Info.plist

Info.plist

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

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

回答

4

它并不直接解决您的问题,但是对此question的答案是否可以帮助您?

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

打开“工程选项”,到了“运行>自定义命令”部分,对“执行”

添加自定义命令

它还提到了Debugger.Break行为:

如果您的应用单声道软调试器内部运行使用Mono 2.11或更高版本[...],它将设置软断点软调试器和作为工作预计


编辑:

你可以叫上一个正在运行的Mac应用程序的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 
    } 
+0

我启动应用程序运行'open/Applications/MyApp.app',所以我尝试传递'--debug',但没有运气附加调试器。我认为这里的复杂性在于它是一个Mac应用程序,我敢打赌一个控制台应用程序可以正常工作。自定义命令的好处,如果我觉得我需要调试,我会使用它 - 我只需要让自定义URL方案首先工作,我猜。 – jonathanpeppers

+0

@jonathanpeppers编辑... – TheNextman

+0

谢谢,现在应用程序已经打开时它会触发断点,但是如果应用程序尚未打开,它不会执行任何操作。有关于此的任何想法?无法从网址启动应用程序? – jonathanpeppers

3

由@TheNextman发布的解决方案确实有效,但这是一个更完整的解决方案。我从this Xamarin论坛主题获得以下信息。随着用户(以及Xamarin员工)塞巴斯蒂安包利华(@poupou)指出,

我从来没有使用特定的API,但在枚举四个大字值 苹果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; 
}