Einfache iPhone-Jailbreak-Optimierung funktioniert nicht
Frage
#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
Oben ist eine einfache Optimierung, die ich mit Logos erstellt habe.Aus irgendeinem Grund funktioniert nach der Installation nichts, ich kann einfach nicht herausfinden, was das Problem ist und wie kann ich dieses Problem lösen?
Andere Fragen, die ich habe, sind:
- Warum deklarieren wir Klassen wie
SBIconController
wenn es schon eine gibtSBIconController
klasse? - Warum deklarieren wir es als Unterklasse von
NSObject
? - Warum geben wir nicht einfach SBIconController ein, wenn wir das aufrufen
[SBIconController sharedInstance]
statt[objc_getClass("SBIconController") sharedInstance]
?
Vielen Dank für Ihre Hilfe!
Lösung
Der Code ist in Ordnung.Ich habe es getestet (ich benutze keine Logos) und iconTapped:
die Methode wird tatsächlich aufgerufen, wenn Sie auf ein App-Symbol tippen.Aber was versuchst du damit zu erreichen isEditing
?Diese Eigenschaft gibt an, ob Sie SpringBoard bearbeiten (tippen und halten Sie ein App-Symbol) und wann es gleich ist YES
Methode iconTapped:
wird NICHT aufgerufen, wenn auf das Symbol getippt wird.Es wird nur aufgerufen, wenn isEditing
gleich NO
.Also schlage ich vor, dass Sie alert ohne einfügen if ([sbic isEditing])
um zu testen, ob Ihre Optimierung funktioniert.
Wie für Ihre anderen Fragen:
- Beim Umgang mit privaten APIs haben wir keine Header und erhalten Warnungen / Fehler, wenn wir versuchen, sie zu verwenden.In deinem Fall ist es
SBIconController
.Um dieses Problem zu lösen, können wir entweder Header herunterladen, die andere mit verschiedenen Tools wie class-dump ausgegeben haben, oder diese privaten APIs selbst deklarieren.In Ihrem Fall ist es letzteres. - Da
SBIconController
erbt vonNSObject
. Du kannst es so oder so machen.Wenn Sie eine Klassendeklaration haben, müssen Sie diese natürlich nicht verwenden
objc_getClass
.Und in Ihrem Fall brauchen Sie keines dieser Dinge.Sie können einfach verwendenself
wie bei jeder anderen obj-C-Methode.Ihr Code wird so aussehen:%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