Semplice modifica al jailbreak dell'iPhone che non funziona
Domanda
#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
Sopra c'è una semplice modifica che ho creato con Logos.Per qualche motivo dopo l'installazione non funziona nulla, semplicemente non riesco a capire quale sia il problema e come posso risolverlo?
Altre domande che ho sono:
- Perché dichiariamo classe come
SBIconController
quando c'è già aSBIconController
classe? - Perché lo dichiariamo come sottoclasse di
NSObject
? - Perché non digitiamo semplicemente SBIconController quando chiamiamo il file
[SBIconController sharedInstance]
invece di[objc_getClass("SBIconController") sharedInstance]
?
Grazie mille per il vostro aiuto!
Soluzione
Il codice va bene.L'ho testato (non uso loghi) e iconTapped:
il metodo viene effettivamente chiamato quando tocchi l'icona di un'app.Ma con cosa stai cercando di ottenere? isEditing
?Questa proprietà indica se stai modificando SpringBoard (tocca e tieni premuta l'icona di un'app) e quando è uguale YES
metodo iconTapped:
NON viene chiamato quando si tocca l'icona.Si chiama solo quando isEditing
equivale NO
.Quindi ti consiglio di inserire alert senza if ([sbic isEditing])
per verificare se la tua modifica funziona.
Per quanto riguarda le altre tue domande:
- Quando abbiamo a che fare con API private non abbiamo intestazioni e riceveremo avvisi/errori se proviamo a utilizzarle.Nel tuo caso lo è
SBIconController
.Per risolvere questo problema possiamo scaricare intestazioni che altri hanno scaricato utilizzando vari strumenti come class-dump o dichiarare tu stesso queste API private.Nel tuo caso è quest'ultimo. - Perché
SBIconController
eredita daNSObject
. Lo puoi fare in entrambi i modi.Naturalmente, quando hai una dichiarazione di classe non è necessario utilizzare
objc_getClass
.E nel tuo caso non hai nemmeno bisogno di nessuna di queste cose.Puoi semplicemente usareself
come faresti con qualsiasi altro metodo obj-C.Il tuo codice sarà simile a questo:%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