2013-04-15 13 views
11

Ich muss Tastenanschläge an die meisten App aus meiner Koca App senden.Senden Sie Tastenanschläge an vorderste App von Sandboxed Kakao App

Ich habe bereits funktionierenden Code dafür mit CGEventCreateKeyboardEvent() und AXUIElementPostKeyboardEvent(), aber es funktioniert nur, wenn App nicht Sandboxed ist.

Ich habe Google nach dem gleichen gesucht, aber keine funktionierende Lösung gefunden.

Ich sah, dass eine Text-App und einige andere die gleiche Sache in Sandbox-Umgebung tun, also frage ich mich, ob jemand mir helfen, herauszufinden, wie aText.app und andere in der Lage sind, Tastenanschläge in Sandbox-Umgebung zu senden.

Danke,

+0

Könnten Sie genügend Informationen darüber geben, welche Apps dies tun und wann ich es neu erstellen soll? Ich habe es noch nie in einer Sandbox-App gesehen. –

+0

Bitte überprüfen Sie aText.app, schreiben Sie einfach einen Text in Google und überprüfen Sie den allerersten Link.Es scheint, dass ihre Site-Version keine Sand-Box ist, aber die App-Store-Version hat und in der Sandbox-Umgebung funktioniert, ohne eine temporäre Ausnahme zu verwenden. Bitte lassen Sie mich wissen, wenn ich falsch liege. Danke – AmitSri

Antwort

2

Dies ist tatsächlich möglich. Ich habe ein Beispiel-App verfügbar hier gemacht - SendKey at GitHub

Ich nahm den einfachen Weg und begann mit einem einfachen Apple:

delay 5 

tell application "System Events" 
    repeat 10 times 
     keystroke "#" 
    end repeat 
end tell 

Die ‚Verspätung‘ im Skript einfach gibt mir genug Zeit, um einen Texteditor zu machen die vorderste Anwendung. Ich würde vorschlagen, mit dem Ausführen dieses Skripts zu beginnen, um zu sehen, was es tut.

Dann Ich habe ein Xcode-Projekt die Standard-Anwendungsvorlage mit und schrieb:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSString*  scriptPath = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"]; 
    NSURL*   scriptURL = [NSURL fileURLWithPath:scriptPath]; 
    NSDictionary* errors; 
    NSAppleScript* script  = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors]; 

    NSLog(@"%@", errors); 

    [script executeAndReturnError:&errors]; 

    NSLog(@"%@", errors); 
} 

ich dies ohne Einschalten Sandbox getestet es funktioniert prüft und es tat. Dann habe ich Sandboxing angemacht und es ist natürlich kaputt gegangen. Aber glücklicherweise gibt es einen Weg dahin. Vorläufig bietet Apple eine temporäre Berechtigung namens com.apple.security.temporary-exception.apple-events an. Und Sie können beantragen, dass die Ausnahme für "com.apple.systemevents" gewährt wird. Dies ist, was meine Ansprüche Datei wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>com.apple.security.temporary-exception.apple-events</key> 
    <array> 
     <string>com.apple.systemevents</string> 
    </array> 
    <key>com.apple.security.app-sandbox</key> 
    <true /> 
    </dict> 
</plist> 

Sobald ich diesen Anspruch auf meine Sandkasten App und unterzeichnet sie, es wieder wie erwartet gearbeitet.

Jetzt, wenn Sie andere Schlüssel senden möchten, wird diese Frage & Antwort zeigen, wie Sie Ihr Skript im laufenden Betrieb - Passing variables to an applescript.

Natürlich, sobald Sie alle diese arbeiten, können Sie wahrscheinlich zu NSAppleEventDescriptor und verwandten Klassen wenden, um das Ereignis im Code zu erstellen, aber ich habe nicht mit dieser Technik gespielt.

Bitte beachten Sie, dass Apple Sie doch nahe, tun nach dem, wenn eine temporäre Berechtigung mit:

Wenn Sie nicht Ihre App jetzt Sandbox oder eine temporäre Ausnahme Berechtigung zu verwenden, benutzen Sie Apples Bug-Reporting-System Lassen Sie sich über das Problem, das Ihnen begegnet, von Apple unter informieren. Apple berücksichtigt Feature Anforderungen, wie es die OS X-Plattform entwickelt. Vergewissern Sie sich außerdem, dass Sie in iTunes Connect das Feld Überprüfungshinweise verwenden, um zu erklären, warum die Ausnahme erforderlich ist.

+0

Hallo, vielen Dank für Ihre Bemühungen. Aber ich habe etwas, was ich nicht bekomme. Wie Sie erklären, über Apple-Skript, das ist ein großes Dankeschön, aber die eigentliche Frage ist, das ohne Apple-Skript oder temporäre Ausnahme zu tun. – AmitSri

+0

Ich habe die aText.app-Berechtigungen über das Codesign-Tool geprüft und keine temporäre Ausnahme gefunden. Wenn ich eine temporäre Ausnahme in meine Test-App einfüge, kann ich feststellen, dass aText.app in den Berechtigungen über das Codesign nicht verwendet wird temporäre Ausnahme – AmitSri

+0

Es könnte etwas sehr einfaches sein, aber es hat mich noch nicht getroffen. Ich versuche immer noch, einen eleganten Weg dafür zu finden. Und wenn die Lösung gefunden wird, wie es scheint, eine ziemlich populäre Nachfrage zu sein. :) danke – AmitSri