Growl Notification - не будет запускать уведомление с использованием фреймворка (Mist) - PullRequest
2 голосов
/ 16 января 2012

Я работаю над небольшой оболочкой для 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 Ответ

2 голосов
/ 16 января 2012

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

...