试图弄清楚如何从FireMonkey OSX应用程序处理自定义URL方案。到目前为止,我已经设法将这个URL方案的细节添加到info.plist文件中,因此当点击链接时,应用程序就会被调用。问题是注册事件处理程序,以便将请求的实际内容传递到应用程序。
有许多使用IFMXApplicationEventService在iOS上执行此操作的示例,但此接口似乎在OSX上不可用。
有人知道如何处理吗?
答案 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>