0

Facebook iOS SDK をアプリに統合しようとしています。アプリのデリゲート ヘッダーで次の操作を行います。

 #import <UIKit/UIKit.h>
#import "Facebook.h"
#import "FBConnect.h"

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
Facebook *facebook;
}

@property (nonatomic,strong) Facebook *facebook;

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end

実装ファイルのメソッド didFinishLaunchingWithOptions メソッドで:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate];

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
if([userDefault objectForKey:@"FBAccessTokenKey"] && [userDefault objectForKey:@"FBExpirationDateKey"])
{
    facebook.accessToken = [userDefault objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [userDefault objectForKey:@"FBExpirationDateKey"];

}

if(![facebook isSessionValid])
{
    NSArray *permision = [[NSArray alloc]initWithObjects:@"read_stream",nil] ;
    [facebook authorize:permision];
}

MyFacebooDelegate クラスは、FBSessionDelegate などの Facebook デリゲートを実装する場所です。

また、handleOpenURL と OpenURL も処理しました。アプリを実行すると、Safari で Facebook の認証画面が表示され、[OK] を押すと画面が消えてアプリに戻りますが、アプリがクラッシュして終了する場合があります。コンパイラはエラーを教えてくれます:

- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate {
self.accessToken = token;
self.expirationDate = expirationDate;
[_lastAccessTokenUpdate release];
_lastAccessTokenUpdate = [[NSDate date] retain];
[self reloadFrictionlessRecipientCache];
if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {
    [self.sessionDelegate fbDidLogin];
}

具体的には、コンパイラは次の行を示します。

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {

どんな助けでも大歓迎です

4

2 に答える 2

3

モハメッド

次の行は間違っています:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {

次のようになります。

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin:)]) {
于 2012-08-24T15:06:39.440 に答える
2

セッション デリゲートをインスタンス化する場合:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate];

他の方法で保持することはありません。Facebook SDK ファイルFacebook.hを見ると、sessionDelegateプロパティのタイプが であることがわかりますassign。つまり、デリゲート オブジェクトにメッセージを送信するときに、デリゲート オブジェクトが存在することを確認する必要があります。

これを修正するには、AppDelegate.h ファイルを追加します。

@property (strong, nonatomic) MyFacebooDelegate *controllerDelegate;

そして、didFinishLaunchingWithOptions:私の投稿の上部にあるコードの代わりに、次のようにします。

self.controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:self.controllerDelegate];

このようにして、デリゲート オブジェクトへの強い参照が維持され、時期尚早に割り当てが解除されることはありません。

お役に立てれば!ご不明な点がございましたら、お知らせください。

于 2012-08-27T07:43:19.390 に答える