私が見つけた解決策は、Objective-CランタイムAPIを使用することでした。これを整理するためのより良い方法があると確信していますが、これが私がそれを行った方法です:
カテゴリを作成するための.hファイルと.mファイルは次のとおりです。lowerVolume
どのように実際のメソッドではなく、引数、、id self
およびをもつC関数であることに注意してくださいSEL _CMD
。setupCategories
また、関数に気付くでしょう。後で呼び出します。
// iTunes+Volume.h
#import <objc/runtime.h>
#import "iTunes.h"
void lowerVolume(id self, SEL _cmd, int dest, float speed);
void setupCategories();
@interface iTunesApplication (Volume)
- (void)lowerVolume:(int)dest speed:(float)speed;
@end
// iTunes+Volume.m
#import "iTunes+Volume.h"
void lowerVolume(id self, SEL _cmd, int dest, float speed)
{
NSLog(@"Lower Volume: %i, %f", dest, speed);
}
void setupCategories()
{
id object = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
Class class = [object class];
[object release];
class_addMethod(class, @selector(lowerVolume:speed:), (IMP)lowerVolume, "@:if");
}
関数を作成したので、Objective-CランタイムAPIを使用して、実際にそれらをスクリプトブリッジクラスに追加する必要があります。これをmain.m
実行して、実行ループの開始時にメソッドを使用する準備ができていることを確認します。
// main.m
#import <Cocoa/Cocoa.h>
#import "iTunes+Volume.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
setupCategories();
return NSApplicationMain(argc, (const char **) argv);
[pool drain];
}
これで、ヘッダーファイルをインクルードする限り、どこでもメソッドを使用できます。
- (void)mute
{
iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
[iTunes lowerVolume:0 speed:1];
[iTunes release];
}
これのいずれかが意味をなさない場合は、私に教えてください。私はそれをよりよく説明しようとします。