2015-11-02 98 views
1

試圖找出如何從FireMonkey OSX應用程序處理自定義URL方案。到目前爲止,我已經設法將URL模式的細節添加到info.plist文件中,所以當點擊鏈接時,應用程序被調用。問題在於註冊事件處理程序,以便將請求的實際內容傳遞到應用程序中。OSX上的Firemonkey自定義url方案

有很多使用IFMXApplicationEventService在iOS中執行此操作的示例,但此接口似乎無法在OSX上使用。

有人知道如何處理這個問題嗎?

+0

您是否設法解決這個問題?我處於同樣的情況 –

回答

0

有了這個code從維克多Fedorenkov的幫助下,我設法以獲得請求的實際內容寫可可URL處理程序:

unit W3DConnectParamManagerImpl; 

interface 

uses 
    Macapi.Foundation 
    , Macapi.ObjCRuntime 
    , Macapi.ObjectiveC 
    ; 

type 
    TOpenURLEvent = procedure(const AURL: string) of object; 

    IURLEventHandler = interface(IObjectiveC) 
    ['{1AB197A9-FF38-442F-A942-48E2528CAC1E}'] 
    procedure HandleGURLEvent(Event, ReplyEvent: NSAppleEventDescriptor); cdecl; 
    end; 

    TURLEventHandler = class(TOCLocal, IURLEventHandler) 
    FOpenURLEvent: TOpenURLEvent; 
    public 
    constructor Create(AOpenURLEvent: TOpenURLEvent); 
    procedure HandleGURLEvent(Event, ReplyEvent: NSAppleEventDescriptor); cdecl; 
    end; 

    TW3DConnectParamManager = class(TInterfacedObject) 
    private 

    FURLEventHandler: IURLEventHandler; 
    procedure OpenURLHandler(const AURL: string); 

    public 
    constructor Create; reintroduce; 
    end; 


implementation 

uses 
    // Delphi 
    Macapi.Helpers 
    , SysUtils 
    ; 

{ TW3DConnectParamManager } 

// Create 
// 
constructor TW3DConnectParamManager.Create; 
const 
    kAEGetURL: Integer = 
    Ord('G') shl 24 + Ord('U') shl 16 + Ord('R') shl 8 + Ord('L'); //'GURL' 
    kInternetEventClass: Integer = 
    Ord('G') shl 24 + Ord('U') shl 16 + Ord('R') shl 8 + Ord('L'); //'GURL' 
var 
    LAppleEventManager: NSAppleEventManager; 
    selector: SEL; 
begin 
    inherited Create; 
    FURLEventHandler := TURLEventHandler.Create(OpenURLHandler); 

    LAppleEventManager := TNSAppleEventManager.Wrap(
     TNSAppleEventManager.OCClass.sharedAppleEventManager); 
    selector := sel_registerName(PAnsiChar('HandleGURLEvent:ReplyEvent:')); 

    LAppleEventManager.setEventHandler((FURLEventHandler as ILocalObject).GetObjectID, selector, 
    kInternetEventClass, 
    kAEGetURL); 
end; 

// OpenURLHandler 
// 
procedure TW3DConnectParamManager.OpenURLHandler(const AURL: string); 
begin 
    // ... use the url 
end; 


{ TURLEventHandler } 

// Create 
// 
constructor TURLEventHandler.Create(AOpenURLEvent: TOpenURLEvent); 
begin 
    inherited Create; 

    FOpenURLEvent := AOpenURLEvent; 
end; 

// HandleGURLEvent 
// 
procedure TURLEventHandler.HandleGURLEvent(Event, ReplyEvent: NSAppleEventDescriptor); 
const 
    keyDirectObject: Integer = Ord('-') shl 24 + Ord('-') shl 16 + Ord('-') shl 8 + Ord('-'); //'----' 
var 
    LURL: string; 
begin 
    LURL := NSStrToStr(Event.paramDescriptorForKeyword(keyDirectObject).stringValue); 
    FOpenURLEvent(LURL); 
end; 


end. 

有關的信息,自定義URL方案,西港島線啓動你通過在Info.plist文件中添加這些行來應用:

<key>CFBundleURLTypes</key> 
<array> 
    <dict> 
     <key>CFBundleURLName</key> 
     <string>dontknowforwhatitisused</string> 
     <key>CFBundleURLSchemes</key> 
     <array> 
      <string>thecustomscheme</string> 
     </array> 
    </dict> 
</array>