2012-01-17 11 views
1

お読みいただきありがとうございます。認証後にiOS Facebook Publish Feedダイアログが表示されない

私はFacebook iOS SDK Feed Dialog issue after authenticationに行きましたが無駄でした。

は何作品: を私はフィードダイアログでFacebook iOS Tutorialを使用して、サンプルの「Hello、World」のアプリを作成しました。このチュートリアルはうまくいき、私のフィードの投稿を見ることができます。

問題:私は私のアプリでこのコードを統合すると 、私はコントロールが私のアプリに戻って到達したときに、認証後にフィードダイアログを見ることはありません。コントロールの

フロー: 私は写真を撮るカメラを示すUIImagePickerControllerを持って、その後、画像がアップロードされていることを示すためUIAlertViewを示し、結果を表示するUIAlertViewを示しては、番組最後に、サーバから返され、 UIActionSheetには、さまざまな共有オプション(Facebook、Twitterなどへの共有)が表示されます。

ユーザーは「フェイスブックの共有」をヒットすると、次selectorが呼び出されます:


- (void) initFacebook 
{ 
    //Init Facebook 
    facebook = [[Facebook alloc] initWithAppId:@"308136969223987" andDelegate:self]; 

    //Check for access_token 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if(![facebook isSessionValid]) { 
     [facebook authorize:nil]; 
    } 

    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"https://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    @"Facebook Dialogs are so easy!", @"message", 
    nil]; 

    [_facebook dialog:@"feed" andParams:params andDelegate:self]; 
} 

これは、認証のためにFacebookアプリを起動し、その後UIImagePickerControllerで再び私のアプリを開きますが、表示されません。 Feed Dialog

誰かお手伝いできますか?

答えて

4

あなたは手動であなたのケースでは、あなたがもう一度したいメソッドをコールする必要があります - FBSessionDelegateの(空)fbDidLogin - で、(無効)initFacebook。

また、私がやった後に少しトリック、これはより一般的な作るために[FacebookのAUTHORIZE:nilを];私は保留中のターゲットとセレクタを設定して、ログイン後に実行する必要がある保留コマンドを保存します。このような何か...

id fbPendingTarget; 
SEL fbPendingAction; 

    if (![delegate.facebook isSessionValid]) { 
     [delegate.facebook authorize:nil]; // Facebook app or Safari login, mustitask 

     // Save pending actions 
     delegate.fbPendingTarget = self; 
     delegate.fbPendingAction = @selector(facebookButtonPressed); 

     [self retain]; // *** hold on to self if you will release self and is using fbPendingTarget as self 
    } 

とデリゲート火災、それはあなたの保留中のアクションを実行します...

- (void)fbDidLogin { 
    [self storeAuthData:[facebook accessToken] expiresAt:[facebook expirationDate]]; 
    [self apiFQLIMe]; // request user info 

    // perform any pending actions after login 
    if ([fbPendingTarget respondsToSelector:fbPendingAction]) { 
     [fbPendingTarget performSelector:fbPendingAction]; 
    } 
    self.fbPendingTarget = nil; 
    self.fbPendingAction = nil; 

    [self release]; // *** let go of self after we finished everything 
} 

ログイン後に必要なすべての保留中のアクションを実行するこのヘルプ。実行後にクリアするか、ログインに失敗したことを忘れないでください。

-(void)fbDidNotLogin:(BOOL)cancelled { 
    UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:@"Cannot Connect" 
                 message:@"There was an error while connecting to Facebook. Please try Again." 
                 delegate:self 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil] autorelease]; 
    [alertView show]; 

    self.fbPendingTarget = nil; 
    self.fbPendingAction = nil; 

    [self release]; // *** let go of self after we finished everything 
} 

希望はこのことができます:)

編集:私はそれがより良いいくつかのアプリの生涯を通じて存在するオブジェクト(のようなappDelegate)ではなくselfに設定することfbPendingTargetを設定するために見つけます。多くの場合、あなたのselfは、ユーザーがフェイスブックにポストを送信した後、右にリリースされる予定のビューであるためです。解放されたオブジェクトにメッセージを送信すると、アプリがクラッシュします。

これを回避するための汚い方法は、送信する前に[self retain]を明示的に使用し、次にに[self release]を使用することです。しかし、それはその時までに自己で解放されるべき他のものをすべて保持するでしょう。とにかくアラートを表示するだけなので、appDelegateに設定する方が簡単です。安全のためだけにコードを編集します。

関連する問題