Простая настройка джейлбрейка iPhone не работает
Вопрос
#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
Выше приведена простая настройка, которую я создал с помощью Логотипов.По какой-то причине после установки ничего не работает, я просто не могу понять, в чем проблема и как я могу решить эту проблему?
Другие вопросы, которые у меня есть, таковы:
- Почему мы объявляем класс следующим образом
SBIconController
когда уже естьSBIconController
класс? - Почему мы объявляем его как подкласс
NSObject
? - Почему бы нам просто не ввести SBIconController, когда мы вызываем
[SBIconController sharedInstance]
вместо того, чтобы[objc_getClass("SBIconController") sharedInstance]
?
Большое спасибо за вашу помощь!
Решение
С кодом все в порядке.Я протестировал это (я не использую логотипы) и iconTapped:
метод действительно вызывается, когда вы нажимаете на значок приложения.Но чего вы пытаетесь достичь с помощью isEditing
?Это свойство указывает, редактируете ли вы SpringBoard (коснитесь и удерживайте значок приложения) и когда оно равно YES
способ iconTapped:
НЕ вызывается при нажатии на значок.Он вызывается только тогда, когда isEditing
равно NO
.Поэтому я предлагаю вам вставить оповещение без if ([sbic isEditing])
чтобы проверить, работает ли ваша настройка.
Что касается других ваших вопросов:
- При работе с частными API у нас нет заголовков, и мы получим предупреждения / ошибки, если попытаемся их использовать.В вашем случае это
SBIconController
.Чтобы решить эту проблему, мы можем либо загрузить заголовки, которые другие загрузили, используя различные инструменты, такие как class-dump, либо объявить эти частные API самостоятельно.В вашем случае это последнее. - Потому что
SBIconController
наследуется отNSObject
. Вы можете сделать это любым способом.Конечно, когда у вас есть объявление класса, вам не нужно использовать
objc_getClass
.И в вашем случае вам даже не нужно ни то, ни другое.Вы можете просто использоватьself
как и в любом другом методе obj-C.Ваш код будет выглядеть примерно так:%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