咆哮通知 - 不会使用框架 (Mist) 触发通知
Posted
技术标签:
【中文标题】咆哮通知 - 不会使用框架 (Mist) 触发通知【英文标题】:Growl Notification - Won't fire notification using framework (Mist) 【发布时间】:2012-01-16 03:17:26 【问题描述】:我正在为 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 Registration 字典,并且正在编译:
g++ growlwrapper.mm -framework Growl -framework Foundation -o growltest
这段代码有什么问题吗?任何想法为什么它不会被触发?
编辑:似乎上面的代码运行良好。只需要在运行循环中使用适当的 Growl 字典即可。
【问题讨论】:
我不确定,但是当我使用 Growl 时,Growl 桥只会尝试与 Growl 服务通信以显示通知。如果它没有找到它,它本身不会显示通知。因此,如果您没有安装 Growl,则不会显示任何通知。 好的,我可以看到在没有安装 Growl 的情况下显示通知是 1.3SDK 功能 【参考方案1】:我不是 Growl 的权威,但我有一个很好的预感:当安装 Growl 应用程序时,像这样的一次性通知有一个祈祷工作,因为正在运行的应用程序有一个运行循环并且可以从中驱动 UI。在您在这里的示例中,没有运行循环,因此这个一次性应用程序无法绘制任何通知——它甚至在它有机会之前就已经死了。我猜如果你制作了一个样板的 Cocoa 应用程序,然后从 applicationDidFinishLaunching:
调用 showGrowlMessage
,但在你终止/退出应用程序之前,我敢打赌它会工作。至少你应该试一试。
编辑:如果您创建一个新的 Cocoa 非文档应用程序,并将以下方法添加到 appDelegate 类,它将成功地使用 Mist(即应用程序内)咆哮显示通知。
@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,但这还不是全部 - 使用这个框架还有额外的、非可选的设置。
【讨论】:
不,这段代码应该可以工作,但我认为它是在消息广播之前自动释放池自动释放。 @Galaxas0 你能详细说明一下吗?没有 pool 代码将无法编译。 . .我会查看 applicationDidFinishLaunching 看看是否也能解决问题! 它与 Objective-C 内存管理有关。我建议使用 -performSelectorInBackground: 并编写一个简单的 cocoa 方法(假设您在 Objective-C++ 中并使用 .mm 文件名)并让您的 C++ 方法调用 cocoa 方法。我的假设是,池释放对象的速度比您发送给 Growl 的速度要快。 @Galaxas0 我已经用谷歌搜索了一段时间,但在 performSelectorInBackground 上找不到任何好的文档或示例。就代码而言,介意我指出正确的方向吗? 当然! developer.apple.com/library/mac/#documentation/Cocoa/Reference/… 在列表中。以上是关于咆哮通知 - 不会使用框架 (Mist) 触发通知的主要内容,如果未能解决你的问题,请参考以下文章