#ios #objective-c #jailbreak #theos #logos
#iOS #objective-c #джейлбрейк #theos #логотипы
Вопрос:
Итак, я пытаюсь установить значок приложения для конкретного приложения по идентификатору пакета. Я подключился к 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:
Отказ от ответственности: Я не знаком с 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 = @""
Комментарии:
1. Есть ли какой-либо способ, которым я мог бы получить доступ к свойству badgeNumberOrString и изменить его внутри хука?
2. SBApplicationController наследуется от NSObject, у которого нет свойства bagdeNumberOfString . Следовательно, вам нужно создать это свойство самостоятельно.