从OS X通知中心获取通知列表

时间:2014-08-18 06:22:47

标签: objective-c macos cocoa osx-mavericks

使用send notificationsNSUserNotification API类,可以NSUserNotificationCenter到Mac上的通知中心。


是否有任何方式从通知中心阅读通知?

2 个答案:

答案 0 :(得分:6)

没有公共API。所以没有任何App Store符合。

BUT

作为我的小技术 - 演示应用程序DiscoNotifier的一部分(我通过闪烁键盘LED响应通知)我写了一个DDUserNotificationCenterMonitor类

请参阅:https://github.com/Daij-Djan/DiscoNotifier/tree/master/DiscoNotifier

它使用FileSystemEvents和SQLite工作并检查通知中心的数据库

它有效且数据库包含所有信息(table:presents_notifications)但是......这是脆弱的私有

答案 1 :(得分:1)

感谢Daij-Djan的回答,我可以发现通知中心的偏好位于~/Library/Application Support/NotificationCenter/的SQLite数据库中。

要阅读此数据库,我们可以使用您FMDB找到的pod

#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"

获取数据库文件并将其打开。

NSString *pathToNCSupport = [@"~/Library/Application Support/NotificationCenter/" stringByExpandingTildeInPath];
NSError *error = nil;
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:pathToNCSupport error:&error];    //find the db

FMDatabase *database = nil;
for (NSString *child in contents) {
    if([child.pathExtension isEqualToString:@"db"]) {
        database = [FMDatabase databaseWithPath:[pathToNCSupport stringByAppendingPathComponent:child]];
        if([database open]) {
            printf("Opening Notification Center");
            [database close];
            break;
        }
    }
}

启动任何SQL查询:

if([database open]) {
    FMResultSet *rs = [database executeQuery:@"select count(*) as cnt from presented_notifications"];
    while ([rs next]) {
        int cnt = [rs intForColumn:@"cnt"];
        NSLog(@"Total Records :%d", cnt);
    }

    [database close];
}

Github完成项目。