我对越狱iOS调整开发非常新,并且有一个问题。我按照教程在每次从Springboard打开应用程序时显示警报。调整代码是:
#include <UIKit/UIKit.h>
@interface SBApplicationIcon
- (void)launchFromLocation:(int)arg;
- (id)displayName;
@end
%hook SBApplicationIcon
-(void)launchFromLocation:(int)location{
NSString *appName = [self displayName];
NSString *message = [NSString stringWithFormat:@"Application launched: %@", appName];
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:appName message:message delegate:nil cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil];
[myAlert show];
%orig;
}//end function
%end
这个调整代码工作得很好。我不明白的是这是如何运作的。查看SBApplicationIcon的头文件,没有这样的方法 - (void)launchFromLocation:(int)location;
经过一些研究后我发现SBIcon类头具有这个确切的函数定义。如果我将代码更改为:
#include <UIKit/UIKit.h>
@interface SBIcon
- (void)launchFromLocation:(int)arg;
- (id)displayName;
@end
%hook SBIcon
-(void)launchFromLocation:(int)location{
NSString *appName = [self displayName];
NSString *message = [NSString stringWithFormat:@"Application launched: %@", appName];
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:appName message:message delegate:nil cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil];
[myAlert show];
%orig;
}//end function
%end
警报视图不会显示,并且永远不会调用该功能!我觉得这是一个愚蠢的问题,但我根本不明白这是如何运作的。有人可以向我解释一下吗?我使用的是iOS7标头和iOS7 iPhone。
谢谢!
答案 0 :(得分:1)
SBIcon的启动方法(因为至少iOS 5,之前不知道)一直存在只是在子类中被覆盖,例如SBLeafIcon,即SBApplicationIcon的超类。在iOS 7中,-launchFromLocation也是如此:因此,SBIcon的实现从未调用过(如果它只是一个空方法,为什么要调用super?),所以你的代码永远不会运行如果你挂钩SBIcon。