2

Growl1.3.1SDKの小さなラッパーに取り組んでいます。具体的には、Growlをアプリケーションにパッケージ化して、ユーザーがGrowlを持っていなくても、通知を受け取ることができるようにします。以前にGrowlをインストールしていましたが、コードで通知が発生しました。それ以来、Growlをアンインストールし、フレームワークのみを使用しています。ミスト、それは呼ばれていると思います。ただし、今すぐコードを起動すると(Growlがアンインストールされている)、通知は発行されません。以下は私が現在使用しているコードです:

#import "growlwrapper.h"

void showGrowlMessage(std::string title, std::string desc) {
    std::cout << "[Growl] showGrowlMessage() called." << std::endl;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [GrowlApplicationBridge setGrowlDelegate: @""];
    [GrowlApplicationBridge
        notifyWithTitle: [NSString stringWithUTF8String:title.c_str()]
        description: [NSString stringWithUTF8String:desc.c_str()]
        notificationName: @"Upload"
        iconData: nil
        priority: 0
        isSticky: NO
        clickContext: nil
    ];
    [pool drain];
}

int main() {
    showGrowlMessage("Hello World!", "This is a test of the growl system");
    return 0;
}

私は適切な唸り声登録辞書も持っており、コンパイルしています:

g++ growlwrapper.mm -framework Growl -framework Foundation -o growltest

このコードに何か問題がありますか?なぜそれが発火しないのか、何か考えはありますか?


編集:上記のコードは問題なく機能しているようです。適切なGrowlディクショナリを使用して、実行ループに入る必要がありました。

4

1 に答える 1

2

私はGrowlの権威ではありませんが、かなり良い予感があります。Growlアプリをインストールすると、実行中のアプリに実行ループがあり、からUIを駆動できるため、このようなワンショット通知で機能するように祈ります。それ。ここにある例では、実行ループがないため、このワンショットアプリが通知を描画する方法はありません。チャンスが来る前に死んでしまいます。showGrowlMessageボイラープレートCocoaアプリを作成してから呼び出した場合は推測できますが、applicationDidFinishLaunching:アプリを終了/終了する前に、動作するはずです。少なくとも、それを試してみるべきです。

編集:新しいCocoa非ドキュメントアプリケーションを作成し、次のメソッドをappDelegateクラスに追加すると、Mist(つまりアプリ内)Growlを使用して通知が正常に表示されます。

@implementation SOAppDelegate

@synthesize window = _window;

- (void)showGrowlMessageTitled: (NSString*)title description:(NSString*) desc
{
    NSLog(@"[Growl] showGrowlMessage() called.");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [GrowlApplicationBridge notifyWithTitle: title
                                description: desc
                           notificationName: @"Upload"
                                   iconData: nil
                                   priority: 0
                                   isSticky: NO
                               clickContext: nil];
    [pool drain];
}


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [GrowlApplicationBridge setGrowlDelegate: (NSObject<GrowlApplicationBridgeDelegate>*)self];
    [self showGrowlMessageTitled: @"Foo" description: @"Bar"];    
}

- (NSDictionary *) registrationDictionaryForGrowl
{
    return [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSArray arrayWithObject: @"Upload"], GROWL_NOTIFICATIONS_ALL,
            [NSArray arrayWithObject: @"Upload"], GROWL_NOTIFICATIONS_DEFAULT,
            nil];
}

@end

つまり、元のコードの問題は、runLoopの問題だけでなく、実際のデリゲート(つまり、必要に応じてヘッダーに記述されているデリゲートメソッドを実装するオブジェクト)をGrowlApplicationBridgeに渡さなかった(空のデリゲートを渡す)ことでした。ストリング)。確かにまだrunLoopが必要ですが、それだけではありません。このフレームワークを使用するための追加のオプションではないセットアップがあります。

于 2012-01-16T03:59:13.833 に答える