Macos OSX上的Firemonkey自定义url方案

Macos OSX上的Firemonkey自定义url方案,macos,delphi,firemonkey,Macos,Delphi,Firemonkey,试图找出如何从FireMonkey OSX应用程序处理自定义URL方案。到目前为止,我已经设法将URL方案的详细信息添加到info.plist文件中,以便在单击链接时调用应用程序。问题在于注册事件处理程序,以便将请求的实际内容传递到应用程序中 有很多使用IFMXApplicationEventService在iOS上实现这一点的例子,但是OSX上似乎没有这个接口 有人知道如何处理这个问题吗?在Victor Fedorenkov的帮助下,我编写了一个COCOA URL处理程序,以获取请求的实际内容

试图找出如何从FireMonkey OSX应用程序处理自定义URL方案。到目前为止,我已经设法将URL方案的详细信息添加到info.plist文件中,以便在单击链接时调用应用程序。问题在于注册事件处理程序,以便将请求的实际内容传递到应用程序中

有很多使用IFMXApplicationEventService在iOS上实现这一点的例子,但是OSX上似乎没有这个接口

有人知道如何处理这个问题吗?

在Victor Fedorenkov的帮助下,我编写了一个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>
CbundleUrlTypes
CFBundleURLName
不知道你用了什么
循环流化床锅炉方案
客户模式

你找到答案了吗?我的处境也一样