Я не являюсь авторитетом в Growl, но у меня есть довольно хорошая догадка: когда приложение Growl установлено, одноразовое уведомление, подобное этому, выполняет молитву, потому что запущенное приложение имеет цикл выполнения и можетуправлять интерфейсом от него.В приведенном здесь примере нет цикла выполнения, поэтому у этого одноразового приложения нет возможности отрисовывать какие-либо уведомления - оно не работает даже до того, как у него появляется шанс.Я предполагаю, что если вы сделали шаблонное приложение Cocoa, а затем позвонили 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, но это еще не все - есть дополнительные, необязательные настройки для использования этой инфраструктуры.