2016-10-03 2 views
0

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

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 

EDIT: Я заметил, что я должен отделить SBApplicationIcon.sharedInstance от applicationWithBundleIdentifier, и так далее:

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

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

ответ

0

Отказ от ответственности: Я не знаком с 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 = @"" 
+0

Есть ли способ получить доступ к свойству badgeNumberOrString и изменить его внутри крючка? –

+0

SBApplicationController наследует от NSObject, который не имеет свойства bagdeNumberOfString. Следовательно, вам нужно создать это свойство самостоятельно. – EDUsta

+0

О, спасибо за разъяснение. –

Смежные вопросы