2015-11-02 77 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>