OSX上的Firemonkey自定义URL方案

时间:2015-11-02 11:27:46

标签: macos delphi firemonkey

试图弄清楚如何从FireMonkey OSX应用程序处理自定义URL方案。到目前为止,我已经设法将这个URL方案的细节添加到info.plist文件中,因此当点击链接时,应用程序就会被调用。问题是注册事件处理程序,以便将请求的实际内容传递到应用程序。

有许多使用IFMXApplicationEventService在iOS上执行此操作的示例,但此接口似乎在OSX上不可用。

有人知道如何处理吗?

1 个答案:

答案 0 :(得分:0)

在Victor Fedorenkov的code的帮助下,我设法编写了一个COCOA 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>