6

アプリを Facebook SDK 2 から 3.1 にアップグレードしました。

RecordsScreen に投稿ボタンがあります。ユーザーが Facebook にログインしていない場合は、ログイン ページが表示され、ユーザーが既にログインしている場合は、別の nib が読み込まれ、ユーザーが自分のウォールに投稿するメッセージを入力するように求められます。

すでにログインしています。その後、投稿ボタンをクリックするたびに、アプリに関するページが既に承認されており、[OK] をクリックして続行するかどうかを確認するページが表示されます。[OK] をクリックすると、アプリが終了し、最初から起動し直します。投稿ボタンをクリックするたびに、この同じページが再び表示されます。有効なセッションが見つからないか、トークンが失われているようです。

これをシミュレーターとデバイスでテストしました。同じことが起こります。展開対象はiOS5.1です。

入力していない唯一のパラメーターは、iPhone App Store ID です。これは上記の動作に影響しますか?

私はすでに何度も試しましたが、解決策を見つけることができませんでした。

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

ありがとう!

aobs


1月4日に編集:

openSessionWithAllowLoginUI が呼び出されるたびにわかりました。状態 FBSessionStateClosedLoginFailed が返されます。ログインに問題があります。ただし、Already Authorized ページが表示されるため、ユーザーはすでにログインしています。

その理由は、applicationWillTerminate が openSessonWithAllowLoginUI の直後に実行されるためです。誰でもこれに光を当てることができますか?


appDelegate.h で FacebookSDK/FacebookSDK.h をインポートし、appDelegate.m で次のように実装します。

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FBSession.activeSession handleOpenURL:url);
}

-(void)applicationDidBecomeActive:(UIApplication *)application {
[FBSession.activeSession handleDidBecomeActive];
}

-(void)applicationWillTerminate:(UIApplication *)application {
[FBSession.activeSession close];
}

mainViewController は、ペン先を切り替えるマルチビュー コントローラーです。

Facebook のログイン/ログアウトを処理するクラス FBHandler を実装しました。FBHandler.h には #import "Facebook.h" が含まれており、FBHandler は次を含むクラスです。

-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error {
  switch(state) {
    case FBSessionStateOpen:
        break;
    case FBSessionStateClosed:
    case FBSessionStateClosedLoginFailed:
        [FBSession.activeSession closeAndClearTokenInformation];
    default:
        break;
  }

  [[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session];

  // If there is an error, display the alert view.  I have skipped this code.
}

-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
        [self sessionStateChanged:session state:state error:error];
    }];
}

nib の 1 つである RecordsScreen.xib には、Facebook のログイン/ログアウト ボタンが含まれています。RecordsScreen.m (ユーザーが自分のスコアを確認し、Facebook からログインまたはログアウトできる場所) で、viewDidLoad に以下が追加されます。

fbHandler = [[FBHandler alloc] init];
[fbHandler openSessionWithAllowLoginUI:NO];

// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad.  Code is skipped here.

// The implementation of sessionStateChanged in RecordsScreen:
-(void)sessionStateChanged:(NSNotification *)notification {
    if (FBSession.activeSession.isOpen) {
        if (self.facebook == nil) {
            self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil];
            self.facebook.accessToken = FBSession.activeSession.accessToken;
            self.facebook.expirationDate = FBSession.activeSession.expirationDate;
        }
    } else {
        self.facebook = nil;
    }
}   

RecordsScreen.m で、ユーザーがログイン ボタンをクリックすると、

if (!FBSession.activeSession.isOpen) {
    // Login to Facebook.
    [fbHandler openSessionWithAllowLoginUI:YES];
} else {
    // If user is login, post to wall.
    [self postScoreToWall];
}
4

2 に答える 2

4

問題を見つけました。plistで、「アプリケーションがバックグラウンドで実行されない」がYESに設定されていました。NOに設定すると、問題は解決しました。

于 2013-01-06T14:09:45.823 に答える
2

表示しているコードでは、セッションの読み取りアクセス許可の基本セットのみを取得します。reauthorizeWithPublishPermissions:適切な権限を渡すための呼び出しが少なくとも必要です。

私はちょうど同様の問題を抱えていました.2つのことを変更することで解決しました.ログインを行うときに、Facebookが提案する2段階の権限エスカレーション方法を使用していませんが、ログインに必要な権限をopenActiveSessionWithPublishPermissions.

handleDidBecomeActive:また、SDK への別の呼び出しを試みる前に、Facebook ログイン プロセスの最後に が呼び出されることを確認する必要があります。このプロセスのさまざまなステップを実行する一連のブロックがある場合、これは発生しない可能性があります。

この SDK の古いバージョンでは動作しませんでしたが、はるかに直感的であるように見えました。

于 2013-01-01T12:33:49.373 に答える