在对象id上找不到iOS SpringBoard属性badgeNumberOrString

时间:2016-10-03 22:24:06

标签: ios objective-c jailbreak theos logos

所以我试图通过捆绑ID为特定应用设置应用徽章。在此之前,我已经连接到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方面的经验,所以我理解编程基本思想。

1 个答案:

答案 0 :(得分: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 = @""