2013-04-25 5 views
12

Dies ist die Cocoa-Version dieser Frage:Cocoa-Protokollhandler mit NSAppleEventManager und kInternetEventClass/kAEGetURL

AEInstallEventHandler handler not being called on startup

Hier ist mein Info.plist Protokoll Anmeldung:

... 
    <key>CFBundleURLTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleURLName</key> 
      <string>My Protocol</string> 
      <key>CFBundleURLIconFile</key> 
      <string>myicon</string> 
      <key>CFBundleTypeRole</key> 
      <string>Viewer</string> 
      <key>CFBundleURLSchemes</key> 
      <array> 
       <string>myapp</string> 
      </array> 
     </dict> 
    </array> 

Hier ist, wo ich die eingestellte Methode, die auf das Ereignis kInternetEventClass/kAEGetURL wartet, wenn auf eine Browserverknüpfung mit dem Link "myapp: // unused /? a = 123 & b = 456" geklickt wird:

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{ 
    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getURL:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 
    ... 
} 

Hier ist die Handler-Methode:

- (void)getURL:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply 
{ 
    [[[event paramDescriptorForKeyword:keyDirectObject] stringValue] writeToFile:@"/testbed/complete_url.txt" atomically:YES]; 
} 

Hier ist der Test Web-Link:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html lang="en"> 
<head> 
</head> 
<body> 
    <a href="myapp://open/?a=123&b=456">Open My App</a> 
</body> 
</html> 

Das alles funktioniert gut, wenn die Anwendung bereits ausgeführt wird.

Die Handler-Methode wird aufgerufen und die vollständige URL wird erfasst.

Wenn die App jedoch noch nicht ausgeführt wird, wird durch den gleichen Link die App gestartet, aber der Handler wird nicht aufgerufen - was sinnvoll ist, da der Handler noch nicht an das Ereignis gebunden war.

Diese Argumente in der URL sind wichtig für unsere Anwendung, um mit der Webapp zu koordinieren. Obwohl die meiste Zeit unserer Anwendung bereits ausgeführt wird, wenn dieser Klick auftritt, ist es vernünftig zu erwarten, dass dies in einigen Fällen nicht der Fall ist.

Ich habe versucht, die Umgebung zu untersuchen und Aufrufargumente zu verarbeiten, und ich sehe die URL in keiner von ihnen.

Wer weiß, wie wir diese URL zuverlässig erfassen können, selbst wenn unsere Anwendung nicht bereits ausgeführt wird, wenn der Browser klickt?

+0

Haben Sie das jemals herausgefunden? – canhazbits

+0

@canhazbits: Das Registrieren des Handlers in '-applicationWillFinishLaunching:' funktioniert in meinem Test. Gibt es etwas Ungewöhnliches an der Einrichtung oder Konfiguration dieser App? Könnte es beispielsweise sein, dass der App-Delegat nicht festgelegt ist oder nicht die Klasse, von der Sie denken, dass sie das ist? Oder könnte es eingestellt werden, nachdem die App gestartet wurde? Versuchen Sie, eine NIB-lose App zu erstellen? Wenn Sie log-Anweisungen in '-applicationWillFinishLaunching:' und '-applicationDidFinishLaunching:' setzen, werden beide ausgeführt? –

+0

Ja, sie werden beide ausgeführt.Aber nein, die Registrierung in "applicationWillFinishLaunching" funktioniert nicht für mich. – canhazbits

Antwort

1

Ich konfrontiert gerade dieses genaue Problem. Ich weiß nicht, ob es die richtige Lösung ist, aber Sie können den Event-Handler stattdessen in der App-Delegierten init -Methode registrieren.

// in AppDelegate.m 

- (id)init 
{ 
    self = [super init]; 

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

    return self; 
} 

Eine Sache, obwohl zu beachten ist, dass handleURLEvent:withReplyEvent get die gerufenen vorapplicationDidFinishLaunching: wenn die App von einem URL-Schema gestartet wird.

+0

Ich habe versucht in applicationWillFinishLaunching, applicationDidFinishLaunching und init-Methode, aber nichts hat geklappt. Gibt es eine andere Lösung? Es wird sehr hilfreich für mich sein. Danke im Voraus. – boopathy

3

SimpleScriptingPlugin Probe Apple registriert die Handler in applicationWillFinishLaunching:, die als die Verwendung von init wahrscheinlich sauberer ist. (Und wie Mikker sagte, der Handler wird vor applicationDidFinishLaunching: aufgerufen.)

+0

Ich habe es in applicationWillFinishLaunching, applicationDidFinishLaunching und init-Methode versucht, aber nichts hat geklappt. Gibt es eine andere Lösung? Es wird sehr hilfreich für mich sein. Danke im Voraus. – boopathy