Growl Notification - не будет запускать уведомление с использованием фреймворка (Mist)
Я работаю над небольшой оболочкой для 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.
1 ответ
Я не являюсь авторитетом в Growl, но у меня есть довольно хорошая догадка: когда установлено приложение Growl, одноразовое уведомление, как это, должно молиться, потому что запущенное приложение имеет цикл выполнения и может управлять пользовательским интерфейсом из Это. В приведенном здесь примере нет цикла выполнения, поэтому у этого одноразового приложения нет возможности отрисовывать какие-либо уведомления - оно не работает даже до того, как у него появляется шанс. Я бы догадался, если бы вы сделали шаблон приложения Cocoa, а затем позвонили showGrowlMessage
от applicationDidFinishLaunching:
Но, прежде чем вы закроете / закроете приложение, я уверен, что оно будет работать. По крайней мере, вы должны попробовать.
РЕДАКТИРОВАТЬ: Если вы создаете новое приложение без документов Какао и добавляете следующие методы в класс 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, но это еще не все - есть дополнительные, необязательные настройки для использования этой платформы.