Свойство iOS SpringBoard badgeNumberOrString не найдено в объекте идентификатора

Итак, я пытаюсь установить значок приложения для конкретного приложения по идентификатору пакета. Перед этим я подключился к SpringBoard и установил для всех приложений определенную строку, но не могу найти способ установить строку значка для одного значка приложения. Ошибка, которую я получаю в настоящее время:

Tweak.xm:28:123: error: property 'badgeNumberOrString' not found on object of
      type 'id'
  ...applicationWithBundleIdentifier:@"com.apple.AppStore"].badgeNumberOrStri..
                                                            ^
1 error generated.
make[3]: *** [/home/theodd/Desktop/appbadge/.theos/obj/debug/armv7/Tweak.xm.94fb86bd.o] Error 1
make[2]: *** [/home/theodd/Desktop/appbadge/.theos/obj/debug/armv7/AppBadge.dylib] Error 2
make[1]: *** [internal-library-all_] Error 2
make: *** [AppBadge.all.tweak.variables] Error 2

Мой текущий код в Tweak.xm:

#import <SpringBoard/SpringBoard.h>
#define PLIST_PATH @"/var/mobile/Library/Preferences/com.theodd.appbadge.plist"

inline bool GetPrefBool(NSString *key){
    return [[[NSDictionary dictionaryWithContentsOfFile:PLIST_PATH] valueForKey:key] boolValue];
}

inline NSString* GetPrefString(NSString *key){
    return [[NSDictionary dictionaryWithContentsOfFile:PLIST_PATH] objectForKey:key];
}

inline NSString* appID(NSString *key) {
    return [[[NSBundle mainBundle] infoDictionary] objectForKey:key];
}

@interface SBApplicationIcon : NSObject
- (void)setBadge:(id)arg1;
@end

@interface SBApplicationController : NSObject
+ (id)sharedInstance;
- (id)applicationWithBundleIdentifier:(id)arg1;
@end

BOOL isEnabled = GetPrefBool(@"enableSwitch");
NSString* bString = GetPrefString(@"badgeName");

NSString* appStoreString = [SBApplicationController.sharedInstance applicationWithBundleIdentifier:@"com.apple.AppStore"].badgeNumberOrString;

%hook SBApplication
- (id)badgeNumberOrString {
    id r = %orig;
    if(isEnabled) return bString;
    return r;
}

%end

РЕДАКТИРОВАТЬ: я заметил, что должен отделить SBApplicationIcon.sharedInstance от applicationWithBundleIdentifier и т. д. и собрать его вместе следующим образом:

that = SBApplicationController.sharedInstance,
then this = [that applicationWithBundleIdentifier:@""],
this.badgeNumberOrString = @""

Но я не уверен, в какие типы объектов я должен их сохранить. Я все еще новичок в среде logos/objective-c. У меня есть опыт работы с C++ и Java/javaScript, поэтому я понимаю основные идеи программирования.


person TheOdd    schedule 03.10.2016    source источник


Ответы (1)


Отказ от ответственности: я не знаком со SpringBoard.

Вы определили badgeNumberOrString как метод, а не как свойство.

Если вы добавите его в SBApplicationController, например:

@interface SBApplicationController : NSObject
+ (id)sharedInstance;
- (id)applicationWithBundleIdentifier:(id)arg1;

@property NSString *badgeNumberOrString;

@end

Он будет установлен соответствующим образом, и вы можете продолжить переопределение геттера.

Если вы хотите использовать методы, вам нужно использовать скобки, как и в других ваших методах:

NSString* appStoreString = [[SBApplicationController.sharedInstance applicationWithBundleIdentifier:@"com.apple.AppStore"] badgeNumberOrString];

Но эта строка все равно не будет работать, поскольку вы пытаетесь получить доступ к свойству, которое недоступно, и установить его значение:

this.badgeNumberOrString = @""
person EDUsta    schedule 04.10.2016
comment
Есть ли способ получить доступ к свойству badgeNumberOrString и изменить его внутри хука? - person TheOdd; 04.10.2016
comment
SBApplicationController наследуется от NSObject, у которого нет свойства bagdeNumberOfString. Следовательно, вам нужно создать это свойство самостоятельно. - person EDUsta; 05.10.2016