2012-01-16 3 views
2

Я работаю над небольшой оберткой для Growl 1.3.1 SDK. Более конкретно, я хотел бы упаковать Growl в мое приложение, так что даже если у пользователя нет Growl, они все равно смогут получать уведомления. Раньше я устанавливал Growl, и мой код запускал уведомление. С тех пор я удалил Growl и использую только фреймворк; Туман, я считаю, что это называется. Однако, когда я запускаю код сейчас (что Growl удаляется), никакое уведомление не увольняется! Ниже код Сейчас я работаю с:Уведомление о росте - не будет уведомлять об использовании фреймворка (Mist)

#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 

Есть что-нибудь не так с этим кодом? Любые идеи, почему он не будет стрелять?


Edit: Кажется, что приведенный выше код работает просто отлично. Просто нужно быть в цикле выполнения с соответствующим материалом словаря Growl.

+0

Я не уверен, но когда я использовал Growl, мост Growl был бы ТОЛЬКО ПОЛУЧИТЬ, чтобы связаться с сервисом Growl, чтобы показать уведомление. Если он не найдет его, он не будет показывать уведомление сам по себе. Поэтому, если у вас нет установленного Growl, никаких уведомлений вообще не будет показано. –

+0

Хорошо, я вижу, что это функция 1.3SDK, чтобы показать уведомление без установленного Growl. –

ответ

2

Я не являюсь авторитетом в Growl, но у меня довольно хорошая догадка: когда приложение Growl установлено, одноразовое уведомление, подобное этому, имеет молитву на работу, потому что работающее приложение имеет цикл запуска и может управлять UI от него. В примере, который у вас здесь, нет цикла запуска, поэтому нет возможности для этого одноразового приложения делать какие-либо уведомления - он мертв, прежде чем он даже получит шанс. Я бы предположил, что если вы создали шаблонное приложение Cocoa, а затем вызвали showGrowlMessage от applicationDidFinishLaunching:, но до того, как вы прекратите действие/прекратите приложение, я готов поспорить, что это сработает. По крайней мере, вы должны попробовать.

EDIT: Если вы создаете новое приложение для документов без калорий и добавьте следующие методы в класс appDelegate, оно будет успешно отображать уведомление с использованием Mist (например, in-app) 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, но это еще не все - есть дополнительная, необязательная настройка для использования этой структуры.

+0

Нет, этот код должен работать, но, на мой взгляд, это autoreleasepool autoreleasing до того, как будет транслироваться сообщение. –

+0

@ Galaxas0 вы могли бы разработать? Код не будет компилироваться без пула. , , Я посмотрю на applicationDidFinishLaunching и посмотрю, все ли это похоже! – Julio

+0

Это связано с управлением памятью Objective-C. Я предлагаю использовать -performSelectorInBackground: и напишите простой метод какао (предполагая, что вы находитесь в Objective-C++ и с именем .mm filename), и ваш метод C++ вызывает метод какао. Пул освобождает объект быстрее, чем вы отправляете его в Growl, это мое предположение. –