我正在为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字典。
答案 0 :(得分:2)
我不是Growl的权威,但我有一个非常好的预感:当安装Growl应用程序时,像这样的一次性通知有一个祈祷工作,因为正在运行的应用程序有一个运行循环,可以从中驱动UI。在这里的示例中,没有运行循环,因此这个一次性应用程序无法绘制任何通知 - 它甚至在它有机会之前就已经死了。我想如果你制作了一个样板应用程序,然后从showGrowlMessage
调用了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,但这不是全部 - 使用这个框架还有额外的非可选设置。