转自 iBuick,原文地址 http://ibuick.com/index.php/archives/add-growl-support-over-cocoa-app
Growl是Mac OS X上非常优秀且流行的开源消息提示框架。很多开源Cocoa应用程序都使用它来向用户提示各种消息。关于Growl的介绍以及软件使用Growl进行提示的例子,请看我朋友bmwmengwei的系列文章Growl ;GrowlMail ;magsafeGrowl。
好了,下面简单的说一下如何为你自己的Cocoa应用程序添加Growl支持。
首先,你需要到这里 http://growl.info/index.php 下载Growl SDK。
请注意,Java,Python,Perl,AppleScript都有支持的Growl框架,这里只说Cocoa程序如何利用Growl
下载Growl SDK后添加到你的Xcode工程 Frameworks下,,,
添加完成后,你还需要注册你的程序到本地的Growl进程(换句话说,你的程序需要一个标识,让Growl进程知道你这个程序是支持Growl消息提示框架的)
手动在Resources下简历一个叫 Growl Registration Ticket.growlRegDick 的文件,,,并添加内容如下
<?xml version=“1.0” encoding=“UTF-8”?>
<!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<!–
Growl Registration Ticket.growlRegDict
mfTuneKit
Created by Buick Wong on Jul 26,2010.
Copyright 2010 Buick Wong. All rights reserved.
–>
<plist version=“1.0”>
<dict>
<key>TicketVersion</key>
<integer>1</integer>
<key>AllNotifications</key>
<array>
<string>ibuickRssNotification</string>
</array>
<key>DefaultNotifications</key>
<array>
<string>ibuickRssNotification</string>
</array>
</dict>
</plist>
这个文件的内容特别简单,,,,,,你需要修改的一个是AllNotifications的内容
<key>AllNotifications</key>
<array>
<string>ibuickRssNotification</string>
</array>
这个array中你可以添加一到多个消息提示内容,这个消息提示内容会在系统偏好设置,Growl面板,应用程序,应用程序设定中进行配置。
还有一个
<key>DefaultNotifications</key>
<array>
<string>ibuickRssNotification</string>
</array>
这个是指默认的消息提示,当你的程序没有指定用哪一个特定的消息提示配置时,则使用默认配置。
好了,这个文件编辑完,你就可以开始写代码了
首先在你的代码中导入Growl头文件
#include <Growl/Growl.h>
在你需要进行Growl提示的时候,,,,,用如下代码段
[GrowlApplicationBridge
notifyWithTitle:@"iBuick RSS Feed Fetcher"
description:[result description]
notificationName:@”ibuickRssNotification”
iconData:nil
priority:2
isSticky:YES
clickContext:latest_comment_link];
这个方法使用很简单,不是么?
notifyWithTitle:这是给Growl提示指定一个标题
description: 这是Growl提示的正文内容
notificationName:这是对应ticket文件中的消息配置
iconData: Grwol消息中的图标,如果为nil,则以应用程序默认图标代替
priority: 优先级
isSticky: 是否需要用户点击才能消失,否则就一直显示
clickContext: 很多Growl消息,我们一点击它,就会打开一个邮件,或者对话,这个Context是用来将当前的数据,状态传输到那个相应用户点击Growl消息的操作中,如果为nil的话,点击Growl消息不会触发那个相应操作
下面这张图片,就是上段代码产生的效果
最后讲一下这个clickContext的用法。比如上面提到的这个消息,如果你点击这个消息,系统将会打开最新一个评论所在的页面(使用默认浏览器打开)。所以你看到,在上面我的代码块最后,我将一个NSString类型的数据latest_comment_link(就是评论所在’页面的链接传给了clickContext。
如果要对消息点击进行相应,你需要实现Growl Delegate规定的一些方法,,,,,针对点击操作,你只需要实现这一个方法即可
-(void) growlNotificationWasClicked:(id)clickContext;
在一个类中实现这个方法,然后在使用GrowlApplicationBridge前,把实现了这个方法的类注册为Growl代理,代码如下
iBuickRSSGrowlDelegate* gd = [[iBuickRSSGrowlDelegate alloc]init];
[GrowlApplicationBridge setGrowlDelegate:gd];
注册完成后,使用GrowlApplicationSupport发布消息,在clickContext中给与非nil值后,点击消息将会触发-(void) growlNotificationWasClicked:(id)clickContext;中的代码
当然Growl还有其它的代理方法,就不一一介绍了,,,详情请看Growl官网,,,
Growl Application Bridge
Implement Growl Support in your App
另外多一句嘴,如果你的程序是类似命令行程序那种执行后立即退出的程序,则实现用户点击响应的时候,需要你自行实现RunLoop逻辑,不然,用户没来得及点击消息,你的程序就已经退出了,,,,,,至于这个RunLoop如何实现,咱们下回细说。