2010-11-11 9 views
1

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?

Répondre

2

Vous créez un plugin, qui fait référence à des symboles dans un binaire (l'application que vous essayez d'étendre). Par conséquent, vous devez indiquer à l'éditeur de liens où rechercher ces symboles (dans votre cas, _OBJC_CLASS_$_AppClass, c'est-à-dire AppClass défini dans le fichier binaire.) ). Ceci est fait en passant l'option -bundle_loader executable_name à l'éditeur de liens. Voir the man page for ld.

+0

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? –

+0

En fait, l'erreur était que la bibliothèque était compilée en tant que x86_64 lorsque le binaire lié était x86 –

+0

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: .... –