2013-04-15 6 views
11

私のcoocaアプリから最前面のアプリにキーストロークを送信する必要があります。サンドボックス型のココアアプリから最前面のアプリにキーストロークを送信

私はすでにCGEventCreateKeyboardEvent()AXUIElementPostKeyboardEvent()を使用して作業コードを用意していますが、アプリがサンドボックス化されていない場合にのみ機能します。

私は同じものをgoogleで検索しましたが、実際の解決策は見つかりませんでした。

私は、Textアプリケーションとそれ以外のサンドボックス環境で同じことをしている人はほとんどいないことを知っています。誰かが私に理解してもらえれば、aText.appなどがサンドボックス環境でキーストロークを送ることができます。

ありがとう、

+0

あなたはどの上でこれを行うAppsとするとき、私はそれを再作成するための十分な情報を提供してもらえますか?私はそれがサンドボックスアプリから起こるのを見たことがない。 –

+0

aText.appにチェックを入れ、GoogleにaTextを書き、最初のリンクを確認してください。サイトバージョンはサンドボックス化されていないようですが、アプリストアバージョンはサンドボックス環境で一時的な例外を使用することなく動作しています。もし私が間違っているなら教えてください。ありがとう – AmitSri

答えて

2

これは実際に可能です。スクリプトの「遅れ」は単に私のテキストエディタを行うのに十分な時間を与える

delay 5 

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

:私は簡単に道を取り、簡単なAppleScriptの使用を開始SendKey at GitHub

- 私はここで入手可能なアプリを作りました最前面のアプリケーション。私は、このスクリプトを実行して、それが何をしているかを見ることから始めておくことを提案します。

はその後、私は、デフォルトのアプリケーションテンプレートを使用してXcodeプロジェクトを作成したと書きました:

- (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); 
} 

を、私はそれが動作し、それがなかった検証するためにサンドボックスをオンにすることなく、これをテストしました。それから私はSandboxingをオンにし、もちろん、それは壊れました。しかし、幸いにも、その周りに道があります。今のところAppleはcom.apple.security.temporary-exception.apple-eventsという一時的な権利を提供しています。また、 'com.apple.systemevents'に対して例外を許可するように要求できます。これは私の資格ファイルは次のようになります。

<?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> 

私はサンドボックスのアプリにこの権利を追加し、それに署名し、再度、期待通りに働いたら。

他のキーを送信したい場合、この質問&の回答は、あなたのスクリプトを即座に構築する方法を示すでしょう - Passing variables to an applescript。もちろん

あなたはこれらの作業のすべてを持っていたら、あなたはおそらく、コードでイベントを構築するためにNSAppleEventDescriptorおよび関連クラスに向けることができますが、私はその技術でプレイしていません。

Appleは、一時的な権利使用しているときに、以下のか示唆していることに注意してください:あなたが今、あなたのアプリをサンドボックスにまたは一時的 例外資格を使用するために、にAppleのバグ報告システムを使用しないことを選択した場合は

をあなたが遭遇している問題について、Apple に知らせてください。 Appleは、OS Xプラットフォームを開発するにあたり、機能 の要求を考慮しています。また、iTunes Connectの Review Notesフィールドを使用して、例外が に必要な理由を説明してください。

+0

こんにちは、あなたの努力に感謝します。しかし、私は私が得ていない何かを持っています。リンゴスクリプトについて説明していただきありがとうございます。本当にありがたいことですが、リンゴスクリプトや一時的な例外なしでそれを行うことが本当の問題です。 – AmitSri

+0

私はcodesignツールを使用してaText.appエンタイトルメントを確認しましたが、一時的な例外は見つかりませんでした。テストアプリケーションで一時的な例外を追加すると、codesign経由のエンタイトルメントでaText.appが使用していないようです一時的な例外。 – AmitSri

+0

非常にシンプルなものがあるかもしれませんが、まだ私に当たっていませんでした。私はまだそれを行うエレガントな方法を見つけることを試みています。それが解決策を見つけたら投稿します。それはかなりの人気があるようです。 :)ありがとう – AmitSri

関連する問題