Простая настройка джейлбрейка iPhone не работает

StackOverflow https://stackoverflow.com//questions/21006974

  •  21-12-2019
  •  | 
  •  

Вопрос

#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]) чтобы проверить, работает ли ваша настройка.

Что касается других ваших вопросов:

  1. При работе с частными API у нас нет заголовков, и мы получим предупреждения / ошибки, если попытаемся их использовать.В вашем случае это SBIconController.Чтобы решить эту проблему, мы можем либо загрузить заголовки, которые другие загрузили, используя различные инструменты, такие как class-dump, либо объявить эти частные API самостоятельно.В вашем случае это последнее.
  2. Потому что SBIconController наследуется от NSObject.
  3. Вы можете сделать это любым способом.Конечно, когда у вас есть объявление класса, вам не нужно использовать 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
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top