运行时添加的应用程序:openURL不会触发

时间:2013-02-04 21:35:14

标签: ios facebook

出于某种原因,我为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类),然后注入方法不会影响已经实例化的类实例。

0 个答案:

没有答案