Facebook SDK 3.1.1を使用して、iOSアプリケーションにFB Connectを実装しています。これは、新しいFB統合(iOSにログイン)を使用するか、Webビューを介して通常の認証にフォールバックする(どちらの場合もネイティブFacebookアプリケーションをインストールしていない)単純なケースでは正常に機能します。この問題は、iOSレベルでアカウントを切り替えると発生します。別のFBユーザーアカウントでログアウトしてログインします。
ログイン/許可するには、以下を実行します。
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
次に、その状態に達したときにcloseAndClearTokenInformation
を実行しても、FBSessionStateClosedLoginFailedを毎回取得します。
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
switch (state) {
case FBSessionStateOpen:
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
[[FBSession activeSession] closeAndClearTokenInformation];
break;
default:
break;
}
ただし、再試行するたびに同じ状態になります。私のログは次のように述べています:
FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}
誰でもこれを再現できますか、問題がどこにあるのか考えていますか?
別の回答 デバイスとサーバーを手動で再同期する方法を提供します。このコードを呼び出すためにfbRsync
というメソッドを定義しました。必ず#import <Accounts/Accounts.h>
を実装ファイルに追加して、このメソッドを定義します。
-(void)fbResync
{
ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){
NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
id account;
if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){
[accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
//we don't actually need to inspect renewResult or error.
if (error){
}
}];
}
}
次に、fbResync
でエラーが発生した場合は、openActiveSessionWithReadPermissions
を呼び出します。
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if(error)
{
NSLog(@"Session error");
[self fbResync];
[NSThread sleepForTimeInterval:0.5]; //half a second
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
else
[self sessionStateChanged:session state:state error:error];
}];
0.5秒の遅延はおそらく不要ですが、現在は安心できます。
これで問題が解決したようです。 Facebookアカウントを切り替えてログインできるようになりました。
私も同じ問題を抱えていました。設定-> FacebookでFBアプリが有効になっていることを確認してください。鉱山は(私はそれを無効にしたことを覚えていませんが)無効にされ、一度有効にすると修正されました。
私のテストプロセスでは、自分のFBアプリを、iPhoneにリンクされているFBアカウントから数回追加および削除しました。魔法のように、私のアプリが無効にされた理由を説明しているかもしれません。
IOS 6でfb sdk 3.1.1を使用。 "[FBSessio openActiveSessionWithReadPermissions ..."メソッドでアクセス許可パラメーターを "nilまたはemail"として渡してください。ここで私のコードはそれがうまくいきました。
#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )
-(void)showFBLogin
{
[FBSession.activeSession closeAndClearTokenInformation];
NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];
#ifdef IOS_NEWER_OR_EQUAL_TO_6
permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif
NSLog(@"\npermissions = %@", permissions);
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error) {
NSLog(@"\nfb sdk error = %@", error);
switch (state) {
case FBSessionStateOpen:
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
//success
}
}];
break;
case FBSessionStateClosed:
//need to handle
break;
case FBSessionStateClosedLoginFailed:
//need to handle
break;
default:
break;
}
}];
}
iOS7.1の3.1.3 FB SDKでも同じ問題があります。そして、私はここで解決策を見つけます。それが役に立てば幸い!!
私はここですべての答えを試しました。
@ loganathan nil権限、@ ill_always_be_a_warriors fbResync。
それらすべては私のために働きません。
しかし、iPhone 7.1シミュレータで同じコードを起動するとうまく機能することがわかりました
(SSO「シングルサインオン」なし)
同じコードが古いバージョンのiOS FB SDKで適切に機能します(バージョンはわかりませんが、3.13はわかりません)。
(ただし、ログインしようとしたときにSSOは表示されません)
それで、サンプル問題を書き直そうとします。ここでいくつかの違いが見つかりました。
1。 https://developers.facebook.com/docs/ios/getting-started 新しいFacebookDisplayNameを追加
2。 iTune接続のBundleIDを変更しましたが、Faceboook App Devに更新していません
これらの設定を変更すると、SSO機能を備えたiOSアプリで機能します。
それが役に立てば幸い!!
RenewSystemCredentialメソッドを試しましたか?この投稿を見てください:
Facebook iOS SDK extendAccessTokenが機能していません-fbDidExtendTokenが呼び出されていません
同じエラーが発生しました。しかし、私は@ill_always_be_a_warriorsメソッドを使用しました:-(void)fbResync
が動作しません。
私は最終的にそれが私の権限の問題であることに気付き、私はoffline_access
許可、それは機能します。