残念ながら、この動作を強制する公開 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)同等のコードでは、権限を検証するためにスキップしました