何らかの理由で、Facebook 接続用の静的ライブラリを開発しています。
適切なプロセスの認可 URL appDelegate には - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation が必要です。
方法。したがって、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] is application:openURL:sourceApplication:annotation:
しかし、Facebook SDK は認証後にこのメソッドを起動せず、FBSessionState FBSessionStateClosedLoginFailed を取得しました。
このメソッドが起動しなかったのはなぜですか?
更新: 通常実装されているメソッドを実行時にカスタム実装に置き換えても、すべて正常に機能し、Facebook SDK は新しいメソッド実装を起動します。しかし、このメソッドを通常どおりにコーディングせず、実行時に追加すると、起動しません。
Update2 UIApplication をインスタンス化する前に (main.m ファイルで) appDelegate クラスにメソッドを追加すると、注入されたメソッドが機能します (appDelegate.mm ファイルにメソッドのデフォルトの実装がなくても)、UIApplication が作成された後にメソッドを注入すると (そのため、 appDelegate クラスのインスタンスも作成された)、メソッドの注入は、既にインスタンス化されたクラスのインスタンスには影響しません。