J'ai quelques grands problèmes remplaçant certaines fonctions dans une application externe que j'utilise SIMBL pour se connecter.SIMBL avec la méthode Swizzling
Dans cette application, il existe une classe - appelons-la "AppClass". Dans cette classe il y a une fonction,
-(void)doSomething;
J'ai obtenu ceci de la classe-dumping le binaire. toute l'interface est définie comme:
@interface AppClass : NSObject
{
}
Je suis en train de passer outre cette fonction avec jr_swizzleMethod: withMethod: Erreur:
Avec le manque de documentation, ce que je suis venu avec:
#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
Cela devrait suffire? Mais je reçois cette erreur lors de la compilation:
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
Comment résoudre ce problème?
Merci pour la réponse. J'ai essayé d'ajouter ceci à OTHER_LDFLAGS -bundle_loader/Chemin/À/Binaire Même erreur. Est-ce le mauvais endroit pour mettre ce ld en XCode? –
En fait, l'erreur était que la bibliothèque était compilée en tant que x86_64 lorsque le binaire lié était x86 –
J'ai d'autres problèmes pour le moment. J'essaie de remplacer une méthode de classe, mais jr_swizzleMethod renvoie: Erreur Domaine = NSCocoaErrorDomain Code = -1 UserInfo = 0x13911f90 "+ [NSObject (JRSwizzle) jr_swizzleMethod: avecMéthode: erreur:]: méthode d'origine notifyWithTitle: description: notificationName: iconData: priorité: isSticky: clickContext: introuvable pour la classe GrowlApplicationBridge ". La définition est là, juste que c'est une méthode de classe: + (void) notifyWithTitle: .... –