我正在编写一个挂钩,记录系统中的所有darwin通知。我勾选到以下函数:
CFNotificationCenterPostNotification
CFNotificationCenterPostNotificationWithOptions
NSNotificationCenter::postNotification
NSNotificationCenter::postNotificationName
我看到很多日志。我解锁屏幕的例子显示了SBDeviceLockStateChangedNotification。
但我期待像“com.apple.springboard.lockcomplete”这样的事件或其他事件,例如here
不确定为什么我无法捕获类似达尔文的通知。任何帮助赞赏。这是审核代码
#include <notify.h>
#include <substrate.h>
#include <sqlite3.h>
#include <string.h>
#import <CoreFoundation/CFNotificationCenter.h>
//#include "CPDistributedMessagingCenter.h"
#import <CoreFoundation/CoreFoundation.h>
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
//#import <SpringBoard/SpringBoard.h>
// init CFNotificationCenterPostNotification hook
void (*orig_CFNotificationCenterPostNotification) (
CFNotificationCenterRef center,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo,
Boolean deliverImmediately
);
void replaced_CFNotificationCenterPostNotification (
CFNotificationCenterRef center,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo,
Boolean deliverImmediately
){
NSLog(@"CFNotificationCenterPostNotification: %@", name );
orig_CFNotificationCenterPostNotification(center,name,object,userInfo,deliverImmediately);
}
void (*orig_CFNotificationCenterPostNotificationWithOptions) (
CFNotificationCenterRef center,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo,
CFOptionFlags options
);
void replaced_CFNotificationCenterPostNotificationWithOptions (
CFNotificationCenterRef center,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo,
CFOptionFlags options
)
{
NSLog(@"CFNotificationCenterPostNotificationWithOptions: %@", name );
orig_CFNotificationCenterPostNotificationWithOptions(center,name,object,userInfo,options);
}
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application {
%orig;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome"
message:@"Welcome to my iPhone!"
delegate:nil
cancelButtonTitle:@"Thanks"
otherButtonTitles:nil];
[alert show];
//[alert release];
}
%end
%hook NSNotificationCenter
- (void)postNotification:(NSNotification *)notification{
NSLog(@"NSNotificationCenterpostNotification: %@",[notification name]);
%orig;
}
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo{
NSLog(@"NSNotificationCenterpostNotificationName: %@",aName);
%orig;
}
%end
__attribute__((constructor)) void notificationinit() {
%init;
MSHookFunction(CFNotificationCenterPostNotification, replaced_CFNotificationCenterPostNotification, &orig_CFNotificationCenterPostNotification);
MSHookFunction(CFNotificationCenterPostNotificationWithOptions, replaced_CFNotificationCenterPostNotificationWithOptions, &orig_CFNotificationCenterPostNotificationWithOptions);
}
答案 0 :(得分:4)
所以,一些想法:
首先,您能解释为什么您想要使用方法调整,或挂钩来检测这些通知?您是否尝试实际拦截通知,在软件中处理通知,并停止将其发送到系统的其他部分?如果这就是你想要的,那么我理解你的方法。如果您只是想接收这些通知,那么我建议只注册Darwin事件(所有这些或所有名称)的正常方法。 See here for an example
这只是com.apple.springboard.lockcomplete
事件的问题吗?因为解锁设备时不会生成该事件。它仅在锁定时发布。要检测解锁事件,您可以see this answer。
如果您仍然遇到问题,也许这是因为事件可以通过多种方式发布。您可能正在挂钩CFNotificationCenterPostNotification()
和CFNotificationCenterPostNotificationWithOptions()
,但它们不是发布活动的唯一方式。也可以使用低级notify_post() API。我猜是CFNotificationCenterPostNotification()
实际上会使用notify_post()
调用来发布事件。因此,如果您尝试检测某个事件,尤其是未记录的,则可能会直接使用notify_post()
发布该事件,这可以解释为什么您没有看到它
希望这有帮助。