Un simple réglage de jailbreak pour iPhone ne fonctionne pas
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
Ci-dessus, un simple ajustement que j'ai créé avec Logos.Pour une raison quelconque, après l'installation, rien ne fonctionne, je n'arrive tout simplement pas à comprendre quel est le problème et comment puis-je résoudre ce problème ?
Les autres questions que j'ai sont :
- Pourquoi déclarons-nous la classe comme
SBIconController
quand il y a déjà unSBIconController
classe? - Pourquoi le déclarons-nous comme une sous-classe de
NSObject
? - Pourquoi ne tapons-nous pas simplement SBIconController lorsque nous appelons le
[SBIconController sharedInstance]
au lieu de[objc_getClass("SBIconController") sharedInstance]
?
Merci beaucoup pour votre aide!
La solution
Le code est bien.Je l'ai testé (je n'utilise pas de logos) et iconTapped:
La méthode est en effet appelée lorsque vous appuyez sur l’icône d’une application.Mais qu'essayez-vous de réaliser avec isEditing
?Cette propriété indique si vous modifiez SpringBoard (appuyez longuement sur l'icône d'une application) et quand elle est égale à YES
méthode iconTapped:
n'est PAS appelé lorsque l'icône est enfoncée.On l'appelle seulement quand isEditing
équivaut à NO
.Je vous suggère donc d'insérer une alerte sans if ([sbic isEditing])
pour tester si votre réglage fonctionne.
Quant à vos autres questions :
- Lorsque nous traitons avec des API privées, nous n'avons pas d'en-têtes et recevrons des avertissements/erreurs si nous essayons de les utiliser.Dans votre cas, c'est
SBIconController
.Pour résoudre ce problème, nous pouvons soit télécharger les en-têtes que d'autres ont vidés à l'aide de divers outils tels que le dump de classe, soit déclarer vous-même ces API privées.Dans votre cas, c'est ce dernier. - Parce que
SBIconController
hérite deNSObject
. Vous pouvez le faire de toute façon.Bien sûr, lorsque vous avez une déclaration de classe, vous n'avez pas besoin d'utiliser
objc_getClass
.Et dans votre cas, vous n’avez même besoin d’aucune de ces choses.Vous pouvez simplement utiliserself
comme vous le feriez dans n'importe quelle autre méthode obj-C.Votre code ressemblera à ceci :%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