Pregunta

Quiero construir URI (o esquema URL) de apoyo en mi aplicación.

Me hacen un LSSetDefaultHandlerForURLScheme() en mi + (void)initialize y yo setted los esquemas de URL específico también en mi info.plist. Así que tengo esquemas de URL sin Apple Script o Apple Events.

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

El problema es cómo manejar los esquemas cuando se les llama. O mejor dicho: ¿Cómo puedo definir lo que mi aplicación debe hacer, cuando myScheme: se llama

.

¿Hay un método especial que tengo que poner en práctica o tengo que registrar uno en alguna parte?

¿Fue útil?

Solución

Como se está mencionando AppleScript, supongo que está trabajando en Mac OS X.

Una forma sencilla de registrar y utilizar un esquema de URL personalizada 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 su inicialización de AppDelegate:

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

Cada vez que su aplicación se activa a través de esquema de URL, el selector definida se llama.

Un talón para el método de control de eventos, que muestra cómo obtener la cadena URL:

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

documentación de Apple: Instalación de un Obtener URL Handler

Actualizar Me he dado cuenta de un problema para aplicaciones de espacio aislado que se instalan en el controlador de eventos applicationDidFinishLaunching:. Con caja de arena está activado, el método de control no quede llama cuando la aplicación se inicia haciendo clic en una URL que utiliza el esquema personalizado. Al instalar el controlador de un poco antes, en applicationWillFinishLaunching:, el método se llama como se espera:

- (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 mango de activación URL esquema está, para implementar application:handleOpenURL: de UIApplicationDelegate - Documentación

Otros consejos

Todos los créditos debe ir a Weichsel y kch

Sólo estoy añadiendo rápida (2.2 / 3.0) código de 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)")
    }
}
  

El problema es cómo manejar los esquemas cuando se les llama.

Ahí es donde los eventos de Apple vienen. Cuando Launch Services quiere su aplicación para abrir una URL, envía su aplicación para un evento kInternetEventClass / kAEGetURL.

La Guía de Scripting Cocoa usos esta misma tarea como un ejemplo de la instalación de un controlador de eventos .

Se puede definir el comando “get URL” en un SDEF terminología secuencias de comandos y poner en práctica el método correspondiente. Por ejemplo, SDEF de Terminal contiene la siguiente definición de comandos para el manejo de 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 TTApplication (una subclase de NSApplication) define el método:

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

Sólo estoy añadiendo un poco diferente versión Swift 4/5 del código:

func applicationWillFinishLaunching(_ notification: Notification) {
    NSAppleEventManager
        .shared()
        .setEventHandler(
            self,
            andSelector: #selector(handleURL(event:reply:)),
            forEventClass: AEEventClass(kInternetEventClass),
            andEventID: AEEventID(kAEGetURL)
        )

}

@objc func handleURL(event: NSAppleEventDescriptor, reply: NSAppleEventDescriptor) {
    if let path = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue?.removingPercentEncoding {
        NSLog("Opened URL: \(path)")
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top