出于某种原因,我为facebook连接开发了静态库。
正确的流程授权URL appDelegate应具有 - (BOOL)应用程序:(UIApplication *)应用程序 openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication 注释:(ID)注释
方法。 因此,当我在appDelegate.mm文件中编码时,一切正常,方法调用和facebook会话被授权。 但我必须在运行时将此方法添加到委托中,因此我使用了以下代码:
{
NSString* methodDescription;
methodDescription = @"B@:@@@@";
UIApplication* app = [UIApplication sharedApplication];
bool res = class_addMethod([app.delegate class], @selector(application:openURL:sourceApplication:annotation:), (IMP)applicationIMP, [methodDescription UTF8String]);
NSLog(@"Result of add method is %d", res);
}
//这里是新方法的实现:
bool applicationIMP(id self, SEL _cmd, UIApplication *application, NSURL *url, NSString *sourceApplication, id annotation)
{
NSLog(@"Log from applicationIMP injected method");
return [[LibSocial sharedInstance] FacebookHandleOpenURL:url];
}
此代码成功添加方法(我在调用class_copyMethodList时看到此方法): 2013-02-04 23:02:00.704 LibSocialTest [38167:19a03] Mathod [0]是应用程序:openURL:sourceApplication:annotation:
但Facebook SDK在验证后不会触发此方法,我得到了FBSessionState FBSessionStateClosedLoginFailed。
为什么这个方法没有被解雇?
更新 即使我在运行时用自定义实现替换正常实现的方法,一切运行良好,Facebook SDK启动新方法实现。但是,如果我没有正常编码这个方法,但是在运行时添加它,它就不会激活。
UPDATE2 如果我在实例化UIApplication(在main.m文件中)之前向appDelegate类添加方法,那么注入的方法可以工作(即使appDelegate.mm文件中没有方法的默认实现),但是如果我在创建UIApplication之后注入方法(例如也创建了appDelegate类),然后注入方法不会影响已经实例化的类实例。