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, но это еще не все - есть дополнительные, необязательные настройки для использования этой платформы.

Другие вопросы по тегам