2013-10-18 140 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; 
}