Ajuste simples de jailbreak do iPhone não funciona
Pergunta
#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
Acima está um ajuste simples que criei com o Logos.Por algum motivo, após a instalação, nada funciona, simplesmente não consigo descobrir qual é o problema e como posso resolver esse problema?
Outras perguntas que tenho são:
- Por que declaramos classe como
SBIconController
quando já existe umSBIconController
aula? - Por que o declaramos como uma subclasse de
NSObject
? - Por que não digitamos SBIconController quando chamamos o
[SBIconController sharedInstance]
em vez de[objc_getClass("SBIconController") sharedInstance]
?
Muito obrigado por sua ajuda!
Solução
O código está bom.Eu testei (não uso logotipos) e iconTapped:
O método é realmente chamado quando você toca no ícone de um aplicativo.Mas o que você está tentando alcançar com isEditing
?Esta propriedade indica se você está editando o SpringBoard (toque e segure um ícone de aplicativo) e quando é igual YES
método iconTapped:
NÃO é chamado quando o ícone é tocado.É chamado apenas quando isEditing
é igual a NO
.Então sugiro que você insira alerta sem if ([sbic isEditing])
para testar se seu ajuste está funcionando.
Quanto às suas outras perguntas:
- Ao lidar com APIs privadas, não temos cabeçalhos e receberemos avisos/erros se tentarmos usá-los.No seu caso é
SBIconController
.Para resolver esse problema, podemos baixar cabeçalhos que outros despejaram usando várias ferramentas, como class-dump, ou declarar você mesmo essas APIs privadas.No seu caso é o último. - Porque
SBIconController
herda deNSObject
. Você pode fazer isso de qualquer maneira.Claro, quando você tem uma declaração de classe você não precisa usar
objc_getClass
.E no seu caso você nem precisa de nenhuma dessas coisas.Você pode apenas usarself
como você faria em qualquer outro método obj-C.Seu código ficará assim:%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