2016-07-24 8 views
3

ScriptingBridgeを使用している別のサンドボックスアプリケーションからサンドボックスアプリケーション(私が書いたもの)をスクリプト化しようとしています。ターゲット・アプリケーションのsdefにアクセス・グループを設定し、スクリプト・アプリケーションのサンドボックス・エンタイトルメントに設定されているエンタイトルメントを持っています。ただし、Apple Eventをターゲット(ScriptingBridgeを使用)に送信しようとすると、warning: failed to get scripting definition from ~/<snip>/MyApp.app; it may not be scriptable.がコンソールに記録されています(ターゲットアプリケーションへのパスは正しい)。ScriptingBridgeを使用した別のサンドボックスアプリケーションからのAppleScriptingサンドボックスアプリケーション

私は、Sketchサンプルコードアプリの軽度に変更されたバージョンと、スクリプトブリッジを使用する非常に単純なテストアプリケーションで問題を再現できました。 Sketch.sdefの多くの要素に<access-group identifier="com.apple.CocoaExamples.Sketch.Draw" access="rw"/>を追加し、Sketchのサンドボックス機能をオンにしました。

その後、私のテストのアプリでは、私は以下の資格でサンドボックスをオン:

<?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.app-sandbox</key> 
    <true/> 
    <key>com.apple.security.scripting-targets</key> 
    <dict> 
     <key>com.apple.CocoaExamples.Sketch</key> 
     <array> 
      <string>com.apple.CocoaExamples.Sketch.Draw</string> 
     </array> 
    </dict> 
</dict> 
</plist> 

アプリを行い、以下:-applicationWithBundleIdentifier:、「警告への呼び出しの際

#import "ViewController.h" 
#import "Sketch.h" 

@implementation ViewController 
- (IBAction)draw:(id)sender { 
    SketchApplication *sketch = [SBApplication applicationWithBundleIdentifier:@"com.apple.CocoaExamples.Sketch"]; 
    if (![sketch isKindOfClass:[NSClassFromString(@"SketchApplication") class]]) { 
     NSLog(@"Unable to get SketchApplication for Sketch"); 
    } 
} 
@end 

:スクリプト定義の取得に失敗しました "というメッセージが記録され、返されるオブジェクトはSketchApplicationではなくSBApplicationのインスタンスになります。

テストアプリケーションでサンドボックスをオフにすると、エラーはログに記録されず、-applicationWithBundleIdentifier:は期待通りにSketchApplicationを返します。 com.apple.security.temporary-exception.apple-events資格を追加すると同じことが成り立ちますが、これはアプリストアレビューに合格する可能性は低いと考えています。

ターゲットのsdefにアクセスグループを定義して、com.apple.security.scripting-targets資格を追加する以外にも何か不足していますか?これは誰のためにも使えますか?私はここでテストアプリと私の変更スケッチのプロジェクトをアップロードした

https://www.dropbox.com/s/cdml9n5npu8o2m3/SandboxScriptTest.zip?dl=0

+0

ターゲットアプリケーションが* already *実行中の場合にのみ発生します。そうでなければ動作します。 –

+0

それは面白いです。私のテストアプリケーションで、Sketchが実行されていない場合、DrawボタンをクリックするとSketchが開き、 '-applicationWithBundleIdentifier:'への呼び出しが成功します。ただし、次回のクリックでSketch now runningが実行されても失敗します。 –

+0

はい、一時的な例外の資格を必要とせずに実際にはじめて動作するのは奇妙です。 –

答えて

1

を、私はこれについてAppleと技術サポートのインシデントを提出し、彼らはそれがバグであることを確認しました。彼らが示唆した唯一の回避策は、Sketchが後で使用するために実行されているときに-applicationWithBundleIdentifier:への最初の呼び出しによって返されたSketchApplicationの(有効な)インスタンスを保持することです。スクリプティングアプリケーションを起動する前にターゲットアプリケーションが既に実行されている可能性が高いため、これは実際のところ私の特別なケースでは実行可能な回避策ではありません。

私はこのためにレーダーを提出しました:rdar:// 27625862。

もう1つの方法は、com.apple.security.temporary-exception.apple-eventsサンドボックス資格を使用することです。私はそれを今のところ行い、App Storeのレビューのためにその使い方を正当化できることを願っています。

+0

さらにこれを試してみると、 'com.apple.security.temporary-exception.apple-events'は実際には動作しないようです。元の質問を書いたときになぜそれが起こったのか分かりません。 –

+0

AppleScriptでは問題なく動作しますか? SBはバギーでデザイン的に不自由なので、ASでうまく動作しているにも関わらず、SBで休憩するのは珍しいことではありません。そうであれば、答えはSBをチャックし、AppleScript-ObjCブリッジを介してASを使用することです。これにより、ネイティブのCocoaクラスやメソッドによく似たASスクリプトオブジェクトやハンドラと対話できます。[ここのクイックハウツー](http://appscript.sourceforge.net/asoc.html)。 OTOH、バグがサンドボックスシステムにあれば、アップルがそれをソースで修正するまで、あなたはおそらく詰まっているでしょう。 (参考のために[OpenRadar](http://openradar.appspot.com)にチケットを投稿することを検討してください。) – foo

+0

もちろん、 'NSAppleScript'を使用して通常のスクリプトを実行するとうまくいきます。おそらくASOCを使用することは私にとって過度のものです。それはあまりにも悪いSBはここでうまくいきません。理論的には素晴らしいアイデアです。ありがとうございました! –

関連する問題