iOS 7.1.1上 37页例子测试失败,menuButtonDown没有得到调用

我测试37页的代码,发现在iphone iOS 7.1.1 下,其中按下Home键那段不执行… 不知道是否我写错了,还是在iOS7.1.1下有问题

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

%hook SpringBoard
-(void)applicationDidFinishLaunching: (id)application
{
NSLog(@"===========程序已经运行!!=============");//此行可以运行
%orig;
}
-(void)menuButtonDown:(id)down
{
    NSLog(@"你按下了Home键!");//按下Home键多次,均没有运行
    %orig;
}
%end

日志输出截取:

Jul 2 12:37:15 iphone SpringBoard[693] <Notice>: MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/tweaks_test01.dylib
Jul 2 12:37:15 iphone SpringBoard[693] <Warning>: ===========程序已经运行!!=============

我从iphone中 class-dump 了 SpringBoard.h SpringBoard.h.zip (4.43 KB) ,找到其中的定义:

- (void)menuButtonDown:(struct __GSEvent *)arg1;
- (void)_menuButtonDown:(struct __IOHIDEvent *)arg1;

于是我修改代码如下:

//-(void)menuButtonDown:(id)down                  //修改了这里
- (void)menuButtonDown:(struct __GSEvent *)arg1
{
    NSLog(@"你按下了Home键!");//按下Home键多次,均没有运行
    %orig;
}

可是执行依然没有效果。。。

书上的例子是在iOS 6以下的机子上测试的,在iOS 7上已经失效。具体的原因想必你也猜到了,所有的触摸事件由原来的GSEvent换成了IOHIDEvent,即触摸操作由GraphicsServices负责变成了由IOKit负责,这也暗示着iOS与OSX的进一步融合。至于你的问题,把要hook的函数改成

- (void)_menuButtonDown:(struct __IOHIDEvent *)arg1;

就可以触发了

十分感谢~!哎,自己都发现这个方法了,却没想到试试~~
一步之遥就能自己解决了,捶地!!:mad: