uniforme una sirve significado recursos qué que partes para identificador funciona ejemplos definicion como caracteristicas macos cocoa url-scheme appkit

macos - una - url significado



Cómo manejar con un esquema de URL predeterminado (4)

El problema es cómo manejar los esquemas cuando son llamados.

Ahí es donde entran los eventos de Apple. Cuando los servicios de lanzamiento quieren que su aplicación abra una URL, envía a su aplicación un evento kInternetEventClass / kAEGetURL .

La Guía de secuencias de comandos de Cocoa utiliza esta misma tarea como un ejemplo de instalación de un controlador de eventos .

Quiero crear compatibilidad con URI (o esquema de URL) en mi aplicación.

Hago un LSSetDefaultHandlerForURLScheme() en my + (void)initialize y establecí los esquemas de URL específicos también en my info.plist . Así que tengo esquemas de URL sin Apple Script o Apple Events .

Cuando llamo a myScheme: en mi navegador favorito, el sistema activa mi aplicación.

El problema es cómo manejar los esquemas cuando son llamados. O mejor dicho: ¿cómo puedo definir lo que mi aplicación debería hacer cuando se llama myScheme: ?

¿Hay algún método especial que deba implementar o tengo que registrar uno en alguna parte?


Como mencionas AppleScript, supongo que estás trabajando en Mac OS X.

Una forma simple de registrar y usar un esquema de URL personalizado es definir el esquema en su .plist:

<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>URLHandlerTestApp</string> <key>CFBundleURLSchemes</key> <array> <string>urlHandlerTestApp</string> </array> </dict> </array>

Para registrar el esquema, ponga esto en la inicialización de su AppDelegate:

[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];

Siempre que su aplicación se active a través del esquema de URL, se llama al selector definido.

Un apéndice para el método de manejo de eventos, que muestra cómo obtener la cadena de URL:

- (void)handleURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent { NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSLog(@"%@", url); }

Documentación de Apple: instalación de un gestor de obtención de URL

Actualización Acabo de notar un problema para las aplicaciones de espacio aislado que instalan el controlador de eventos en applicationDidFinishLaunching: Con el sandboxing habilitado, el método del controlador no se llama cuando se inicia la aplicación al hacer clic en una URL que utiliza el esquema personalizado. Al instalar el controlador un poco antes, en applicationWillFinishLaunching: el método se llama como se esperaba:

- (void)applicationWillFinishLaunching:(NSNotification *)aNotification { [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; } - (void)handleURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent { NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSLog(@"%@", url); }

En el iPhone, la forma más fácil de manejar la activación del esquema de URL es implementar la application:handleOpenURL: - Documentation


Puede definir el comando "obtener URL" en una terminología scripting SDEF e implementar el método correspondiente. Por ejemplo, SDEF de Terminal contiene la siguiente definición de comando para manejar URL

<command name="get URL" code="GURLGURL" description="Open a command an ssh, telnet, or x-man-page URL." hidden="yes"> <direct-parameter type="text" description="The URL to open." /> </command>

y declara que la aplicación responde a ella:

<class name="application" code="capp" description="The application''s top-level scripting object."> <cocoa class="TTApplication"/> <responds-to command="get URL"> <cocoa method="handleGetURLScriptCommand:" /> </responds-to> </class>

La clase de aplicación TTA (una subclase de NSApplication) define el método:

- (void)handleGetURLScriptCommand:(NSScriptCommand *)command { … }


Todos los créditos deben ir a weichsel y kch

Solo estoy agregando código rápido (2.2 / 3.0) para su conveniencia

func applicationWillFinishLaunching(_ notification: Notification) { NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(self.handleGetURL(event:reply:)), forEventClass: UInt32(kInternetEventClass), andEventID: UInt32(kAEGetURL) ) } func handleGetURL(event: NSAppleEventDescriptor, reply:NSAppleEventDescriptor) { if let urlString = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue { print("got urlString /(urlString)") } }