SIMBL с методом Swizzling
У меня есть большие проблемы с переопределением некоторых функций во внешнем приложении, к которому я подключаю SIMBL.
В этом приложении есть класс - назовем его "AppClass". В этом классе есть функция,
-(void)doSomething;
Я получил это из класса бинарников. весь интерфейс определяется как:
@interface AppClass : NSObject
{
}
Я пытаюсь переопределить эту функцию с помощью jr_swizzleMethod:withMethod:error:
Из-за отсутствия документации я пришел к такому выводу:
#import "JRSwizzle.h"
#import "AppClass.h"
@interface AppClass (MyPlugin)
- (void)myPlugin_doSomething;
@end
@implementation AppClass (MyPlugin)
- (void)myPlugin_doSomething {
NSLog(@"lol?");
}
@end
@implementation MyPlugin
+ (void) load {
Mylugin* plugin = [MyPlugin sharedInstance];
NSError *err = nil;
BOOL result = [NSClassFromString(@"AppClass") jr_swizzleMethod:@selector(doSomething) withMethod:@selector(myPlugin_doSomething) error:&err];
if(!result)
NSLog(@"<Plugin> Could not install events filter (error: %@)", err);
NSLog(@"Plugin installed");
}
+ (MyPlugin *)sharedInstance {
static MyPlugin* plugin = nil;
if(plugin == nil)
plugin = [[MyPlugin alloc] init];
return plugin;
}
@end
Этого должно быть достаточно, верно? Но я получаю эту ошибку при компиляции:
Undefined symbols:
"_OBJC_CLASS_$_AppClass", referenced from:
l_OBJC_$_CATEGORY_AppClass_$_MyPlugin in MyPlugin.o
objc-class-ref-to-AppClass in MyPlugin.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Как мне это решить?
1 ответ
Вы создаете плагин, который ссылается на символы в двоичном формате (приложение, которое вы пытаетесь расширить). Поэтому вам нужно указать компоновщику, где искать эти символы (в вашем случае это _OBJC_CLASS_$_AppClass
т.е. AppClass
это определено в двоичном коде.).
Это делается путем передачи опции -bundle_loader executable_name
компоновщику. Смотрите страницу руководства для ld.