2

Facebookチュートリアルからこのコードを取得しました:

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [[NSArray alloc] initWithObjects:
    @"email", 
    @"user_likes",
    nil];
return [FBSession openActiveSessionWithReadPermissions:permissions
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,
                                                     FBSessionState state,
                                                     NSError *error) {
                                     [self sessionStateChanged:session
                                                         state:state
                                                         error:error];
                                 }];

}

ただし、常にSafariタブが開きます。 Safari タブの代わりに WebView ログインを強制する必要があります。

よろしくお願いします!

4

2 に答える 2

14

残念ながら、この動作を強制する公開 API はないようです。回避策があります(つまり、独自のセッションを作成し、これをアクティブなセッションとして設定して使用します

    [session openWithBehavior:howToBehave
                    completionHandler:handler];

github で openActiveSessionWithPermissions のソース コードを観察すると、

+ (BOOL)openActiveSessionWithPermissions:(NSArray*)permissions
                            allowLoginUI:(BOOL)allowLoginUI
                      allowSystemAccount:(BOOL)allowSystemAccount
                                  isRead:(BOOL)isRead
                         defaultAudience:(FBSessionDefaultAudience)defaultAudience
                       completionHandler:(FBSessionStateHandler)handler {
    // is everything in good order?
    [FBSession validateRequestForPermissions:permissions
                             defaultAudience:defaultAudience
                          allowSystemAccount:allowSystemAccount
                                      isRead:isRead];
    BOOL result = NO;
    FBSession *session = [[[FBSession alloc] initWithAppID:nil
                                               permissions:permissions
                                           defaultAudience:defaultAudience
                                           urlSchemeSuffix:nil
                                        tokenCacheStrategy:nil]
                          autorelease];
    if (allowLoginUI || session.state == FBSessionStateCreatedTokenLoaded) {
        [FBSession setActiveSession:session];
        // we open after the fact, in order to avoid overlapping close
        // and open handler calls for blocks
        FBSessionLoginBehavior howToBehave = allowSystemAccount ?
                                                FBSessionLoginBehaviorUseSystemAccountIfPresent :
                                                    FBSessionLoginBehaviorWithFallbackToWebView;
        [session openWithBehavior:howToBehave
                completionHandler:handler];
        result = session.isOpen;
    }
    return result;
}

- (id)initWithAppID:(NSString*)appID permissions:(NSArray*)permissions urlSchemeSuffix:(NSString*)urlSchemeSuffix tokenCacheStrategy:(FBSessionTokenCachingStrategy*)tokenCachingStrategy; も使用できます。

セッションを作成するには、使用する場合[FBSession alloc] initWithPermissions:permissions]、info.plist ファイルにはアブラムシを値として持つキー FacebookAppID が必要です

したがって、このコードに相当するものは次のようになります

[FBSession setActiveSession: [[FBSession alloc] initWithPermissions:permissions] ];             

        [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorForcingWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            switch (status) {
                case FBSessionStateOpen:
                    // call the legacy session delegate
                    //Now the session is open do corresponding UI changes
                    break;
                case FBSessionStateClosedLoginFailed:
                { // prefer to keep decls near to their use

                    // unpack the error code and reason in order to compute cancel bool
                    NSString *errorCode = [[error userInfo] objectForKey:FBErrorLoginFailedOriginalErrorCode];
                    NSString *errorReason = [[error userInfo] objectForKey:FBErrorLoginFailedReason];
                    BOOL userDidCancel = !errorCode && (!errorReason ||
                                                        [errorReason isEqualToString:FBErrorLoginFailedReasonInlineCancelledValue]);

                    // call the legacy session delegate if needed
                    //[[delegate facebook] fbDialogNotLogin:userDidCancel];
                }
                    break;
                    // presently extension, log-out and invalidation are being implemented in the Facebook class
                default:
                    break; // so we do nothing in response to those state transitions
            }
        }];

注:1)同等のコードでは、権限を検証するためにスキップしました

于 2012-10-15T15:43:45.293 に答える
-1
 NSArray *permissions = @[@"basicinfo",etc...];
 FBSession *session = [[FBSession alloc] initWithPermissions:permissions];
 [FBSession setActiveSession:session];
 [session openWithBehavior:FBSessionLoginBehaviorForcingWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {}];
于 2014-03-31T08:39:29.053 に答える