6

最近FacebookSDK3.1の使用を開始しましたが、を使用してログインすると問題が発生しopenActiveSessionWithReadPermissionsます。

実際、ログインは完全に機能します。キャッシュされたトークンが利用可能な場合は、Facebook UIを表示せずにログインし、そうでない場合はUIを表示します。

に電話をかけた後に問題が発生しreauthorizeWithPublishPermissionsます。を呼び出しreauthorizeWithPublishPermissionsてからアプリケーションを閉じて再度開き、を呼び出すとopenActiveSessionWithReadPermissions、Facebook UIが表示され、キャッシュされたトークンが使用可能であっても、ユーザーは「はい、読み取り権限で大丈夫です」と言う必要があります。

に電話をかけた場合にのみFacebookUIが誤って表示されreauthorizeWithPublishPermissionsます。それ以外の場合は、すべて正常に機能します。

読み取りコード用に開く:

[FBSession openActiveSessionWithReadPermissions:readpermissions allowLoginUI:YES
                                         completionHandler:^(FBSession *aSession, FBSessionState status, NSError *error) {
            [self sessionStateChanged:[FBSession activeSession] state:status error:error];
            if (status != FBSessionStateOpenTokenExtended) {
                // and here we make sure to update our UX according to the new session state
                FBRequest *me = [[FBRequest alloc] initWithSession:aSession
                                                         graphPath:@"me"];
                [me startWithCompletionHandler:^(FBRequestConnection *connection,
                                                 NSDictionary<FBGraphUser> *aUser,
                                                 NSError *error) {
                    self.user = aUser;

                    aCompletionBlock(aSession, status, error);
                }];
            }
        }];

sessionStateChanged関数:

- (void)sessionStateChanged:(FBSession *)aSession state:(FBSessionState)state error:(NSError *)error {

    if (aSession.isOpen) {
        // Initiate a Facebook instance and properties
        if (nil == self.facebook || state == FBSessionStateOpenTokenExtended) {
            self.facebook = [[Facebook alloc]
                             initWithAppId:FBSession.activeSession.appID
                             andDelegate:nil];

            // Store the Facebook session information
            self.facebook.accessToken = FBSession.activeSession.accessToken;
            self.facebook.expirationDate = FBSession.activeSession.expirationDate;
        }
    } else {
        // Clear out the Facebook instance
        if (state == FBSessionStateClosedLoginFailed) {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
        self.facebook = nil;
    }
}

テスト用の空のaPublishActionを使用したPublish呼び出し:

- (void)doPublishAction:(void(^)(FBSession *aSession, NSError *error))aPublishAction {

    if ([FBSession.activeSession.permissions
         indexOfObject:@"publish_actions"] == NSNotFound) {

        NSArray *writepermissions = [[NSArray alloc] initWithObjects:
                                     @"publish_stream",
                                     @"publish_actions",
                                     nil];

        [[FBSession activeSession]reauthorizeWithPublishPermissions:writepermissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *aSession, NSError *error){
            if (error) {
                NSLog(@"Error on public permissions: %@", error);
            }
            else {
                aPublishAction(aSession, error);
            }


        }];

    }
    else {
        // If permissions present, publish the story
         aPublishAction(FBSession.activeSession, nil);
    }
}

よろしくお願いします。よろしくお願いします!!

4

2 に答える 2

6

追加する必要があります

[FBSession.activeSession handleDidBecomeActive];

移行ガイドに記載されて-(void) applicationDidBecomeActive:(UIApplication *)applicationいるように、アプリのデリゲートのメソッドに。

于 2012-11-20T17:18:18.567 に答える
-2

What if you use openActiveSessionWithPermissions instead of openActiveSessionWithReadPermissions?

于 2012-11-26T09:45:42.740 に答える