Simple iPhone jailbreak tweak not working
Question
#import <UIKit/UIAlertView.h>
@class NSObject;
@interface SBIconController : NSObject
+ (SBIconController *)sharedInstance;
- (BOOL)isEditing;
@end
%hook SBIconController
-(void)iconTapped:(id)tapped {
SBIconController *sbic = [objc_getClass("SBIconController") sharedInstance];
if ([sbic isEditing]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
[alertView release];
}
%orig;
}
%end
Above is a simple tweak that I have created with Logos. For some reason after installing, nothing is working, I just can't figure out what the problem is and How can I solve this problem?
Other questions that I have are:
- Why do we declare class like
SBIconController
when there's already aSBIconController
class? - Why do we declare it as a subclass of
NSObject
? - Why don't we just type in SBIconController when we're calling the
[SBIconController sharedInstance]
instead of[objc_getClass("SBIconController") sharedInstance]
?
Thanks a lot for your help!
Solution
The code is fine. I tested it (I don't use logos) and iconTapped:
method is indeed called when you tap an app icon. But what are you trying to achieve with isEditing
? This property indicates whether you are editing SpringBoard (tap and hold an app icon) and when it equals YES
method iconTapped:
is NOT called when icon is tapped. It's called only when isEditing
equals NO
. So I suggest you insert alert without if ([sbic isEditing])
to test whether your tweak is working.
As for your other questions:
- When dealing with private APIs we don't have headers and will get warnings/errors if we try to use them. In your case it's
SBIconController
. To solve this problem we can either download headers that others dumped using various tools like class-dump or declare these private APIs yourself. In your case it's latter. - Because
SBIconController
inherits fromNSObject
. You can do it either way. Of course, when you have class declaration you don't need to use
objc_getClass
. And in your case you don't even need either of this things. You can just useself
like you would in any other obj-C method. Your code will look like this:%hook SBIconController -(void)iconTapped:(id)tapped { if ([self isEditing]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; } %orig; } %end