Xcode 7.0を使用し、iOS 9.0.2でテストし、Facebook SDK 4.7.0を使用しています。
ユーザーをログインさせると、ほとんどの場合すべてが正常に機能しますが、時々このエラーが表示され、理由がわかりません!
操作を完了できませんでした。 (com.facebook.sdk.loginエラー308。)
調査した後、parse.comのFBUtils
と公式のFBSDK
で同時にログインすると、エラーが発生する人がいるのを見ましたが、FBSDK
のみを使用しています私のプロジェクトで。
だから私の質問は、なぜこのエラーが発生するのですか、どうすれば取り除くのですか?
編集-コードの追加
ログインロジックは次のとおりです。
func loginWithFacebook(sender: UIViewController, completion: (profile: FBSDKProfile?, token: String?, cancelled: Bool, error: String?) -> Void ) {
FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
NSNotificationCenter.defaultCenter().addObserver( sender , selector: "onProfileUpdated:", name:FBSDKProfileDidChangeNotification, object: nil)
let loginManager = FBSDKLoginManager()
loginManager.logInWithReadPermissions(["email", "public_profile"], fromViewController: sender) { (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
if error != nil {
print("ERROR")
completion(profile: nil, token: nil, cancelled: false, error: error.localizedDescription)
print(error.localizedDescription)
} else if result.isCancelled {
print("CANCELLED")
completion(profile: nil, token: nil, cancelled: true, error: nil)
} else {
print("NO ERROR")
if FBSDKProfile.currentProfile() == nil {
print("PROFILE IS NIL")
completion(profile: nil, token: result.token.tokenString, cancelled: false, error: nil)
} else {
print("PROFILE IS NOT NIL")
completion(profile: FBSDKProfile.currentProfile(), token: result.token.tokenString, cancelled: false, error: nil)
}
}
}
}
Xcode8-iOS10の場合、
Enableターゲットの[機能]タブ内のキーチェーン共有により、問題が修正されました。
詳細はこちらをご覧ください: https://github.com/facebook/facebook-sdk-Swift/issues/51
Xamarin Studio(@Kenneth推奨)の場合、
Entitlements.plistファイルを、iOSプロジェクトのiOS Bundle Signing
オプションの下のCustom Entitlementsに追加します。
この問題の解決策を見つけました。ログインマネージャーのインスタンスを必要な場所で作成していました。
let loginManager = FBSDKLoginManager()
次に、それを使用してログインし、ログアウトメソッドで別のインスタンスを作成していました。アプリ全体で使用する遅延変数を作成することで問題を修正しました。
lazy var fbLoginManager: FBSDKLoginManager = {
return FBSDKLoginManager()
}()
[〜#〜] update [〜#〜]
Facebookはバグを認識しており、調査中です。私のソリューションが常に機能するとは限らないことがわかり、コードを次のように更新しましたが、その後は見ていません。
private var _fbLoginManager: FBSDKLoginManager?
var fbLoginManager: FBSDKLoginManager {
get {
if _fbLoginManager == nil {
_fbLoginManager = FBSDKLoginManager()
}
return _fbLoginManager!
}
}
Facebookからログアウトするときは、_fbLoginManager = nil
およびインスタンスは、次回のログインに使用されるときに再作成されます。ログアウト後に同じインスタンスを使用して再度ログインする場合、この問題はより頻繁に発生するようですが、FBSDKLoginManager
のインスタンスが複数ある場合はさらに問題が発生するため、上記のように宣言すると問題が修正されたようです。
2018年10月。
理由:challengeReceived文字列の「+」記号が「」に置き換えられています。 FBSDKの問題。
迅速かつダーティな修正: https://github.com/facebook/facebook-objc-sdk/pull/922
具体的には、FBSDKLoginManagerの233行目を置き換えます。
NSString *challengeExpected = [self loadExpectedChallenge];
と
NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];
facebook-objc-sdk
で利用可能な修正 https://github.com/facebook/facebook-objc-sdk/releases/tag/sdk-version-4.38.1 以上。
4.9.0で問題が解決したようです。同じ問題が発生しましたが、新しいSDKバージョンで修正されています。
https://developers.facebook.com/docs/ios/change-log-4.x
再度ログインする前に、ログアウトしていることを確認してください
let loginManager = LoginManager()
loginManager.logOut()
loginManager.logIn(readPermissions: [.email, .publicProfile,
また、このエラーが発生したのは、私の場合でした:FacebookログインボタンがあるAuthentificationControllerがNavigation Controllerなしで表示されました。このエラーを解決するには、Navigation Controllerを追加し、AuthentificationControllerをルートとして設定しました。