咆哮通知 - 不会使用框架(Mist)触发通知

Growl Notification - Won't fire notification using framework (Mist)

本文关键字:通知 Mist 框架 咆哮      更新时间:2023-10-16

我正在为Growl 1.3.1 SDK开发一个小型包装器。更具体地说,我想将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;
}

我还有合适的Growl注册词典,正在使用进行编译

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

这个代码有什么问题吗?你知道它为什么不开火吗?


编辑:似乎上面的代码运行得很好。只需要在运行循环中,使用适当的Growl字典内容。

我不是Growl的权威,但我有一个很好的预感:当Growl应用程序安装时,像这样的一次性通知会起作用,因为运行的应用程序有一个运行循环,可以从中驱动UI。在这里的示例中,没有运行循环,因此,这个一次性应用程序不可能发出任何通知——它还没来得及发出通知就已经死了。我想如果你制作了一个Cocoa应用程序的样板,然后从applicationDidFinishLaunching:调用showGrowlMessage,但在你终止/退出该应用程序之前,我敢打赌它会起作用。至少你应该试一试。

编辑:如果您创建一个新的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,但这还不是全部——使用这个框架还有额外的、非可选的设置。