I've hanya diperbarui facebook sdk v4.0
dan sesuai tutorial dari Menggunakan Custom Login UIs
-(IBAction)facebookLoginClick:(id)sender {
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
// Process error
} else if (result.isCancelled) {
// Handle cancellations
} else {
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if ([result.grantedPermissions containsObject:@"email"]) {
// Do work
}
}
}];
}
TAPI hasilnya selalu nihil dan kode kesalahan adalah 304, aku kehilangan sesuatu?
Saya punya masalah yang sama.
Setelah inisialisasi FBSDKLoginManager
saya menambahkan baris untuk flush data dan (Facebook)Token:
FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];
[loginmanager logOut];
Semoga ini bisa membantu.
Dengan demikian, persis seperti OP bertanya, "aku kehilangan sesuatu"?
Ya, standar berikut contoh kode yang terlihat di mana-mana, hanya salah:
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
---- ONE MAGIC LINE OF CODE IS MISSING HERE ----
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
anda harus melakukan ini:
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut]; //ESSENTIAL LINE OF CODE
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
Jika tidak, sangat sederhana, aplikasi ini tidak akan bekerja jika user yang terjadi mengubah FB account pada perangkat. (Kecuali jika mereka terjadi untuk beberapa alasan re-menginstal aplikasi!)
Sekali lagi - populer sampel kode di atas hanya tidak bekerja (aplikasi ini berjalan di lingkaran tak berujung) jika pengguna terjadi untuk mengubah account FB. LogOut
panggilan yang harus dibuat.
Hal ini terjadi pada saya ketika saya mengubah Facebook AppID (di Info.plist) pengalihan bentuk tes Facebook app untuk produksi Facebook app. Jika aplikasi anda mengirimkan Facebook token ke server yang menghasilkan JWT untuk misalnya, Facebook SDK masih berlanjut fbToken (FBSDKAccessToken.currentAccessToken()
) bertahan kecuali's mengatakan untuk menghapusnya.
Yang mungkin juga terjadi pada produksi ketika pengguna log out dari aplikasi, log out, permintaan API akan log pengguna keluar dan me-reset JWT. Tetapi bahkan sebelum mengirim log out permintaan API, klien akan perlu untuk memberitahu FBSDKLoginManager
contoh untuk log out.
if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
Aku punya ini, itu terjadi ketika mengubah aplikasi FB rincian dalam Xcode sementara sebuah aplikasi iOS berjalan. Anda perlu untuk menghapus aplikasi dari perangkat dan kemudian menerbitkan dengan FB baru aplikasi setup. Hanya recompiling tidak cukup untuk menghapus FB lama pengaturan
Swift 3.0
func loginWithFacebook
{
let loginManager = FBSDKLoginManager()
if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in
if error != nil {
print("error\(String(describing: error))")
}
else if (result?.isCancelled)! {
}
else {
print(FBSDKAccessToken.current())
}
})
}
Swift 4.0 dan FBSDKCoreKit 4.33
let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
loginManager.logOut()
}
swift 4.0, 4.2, 5.0
FBSDKLoginManager().logOut()
Sebenarnya, alasannya sangat sederhana, anda dapat mencoba langkah berikut untuk muncul kembali kode kesalahan ini dengan mudah.
"Facebook login gagal" mungkin memiliki dua alasan:
- anda mendapatkan info pengguna dari facebook gagal.
- anda mendapatkan info pengguna dari facebook sukses,tapi meng-upload ke server anda sendiri gagal.
Kode di FBSDKLoginManager.m
adalah:
- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult
{
FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
parameters:nil
tokenString:loginResult.token.tokenString
HTTPMethod:nil
flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery];
[requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSString *actualID = result[@"id"];
if ([currentToken.userID isEqualToString:actualID]) {
[FBSDKAccessToken setCurrentAccessToken:loginResult.token];
[self invokeHandler:loginResult error:nil];
} else {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey];
NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain
code:FBSDKLoginUserMismatchErrorCode
userInfo:userInfo];
[self invokeHandler:nil error:resultError];
}
}];
}
kapan currentToken.userID
tidak sama actualID
, FBSDKLoginUserMismatchErrorCode
akan melempar.
Sekarang, masalah ini akan muncul ketika pengguna login facebook gagal,tetapi anda tidak memiliki [FacebookSDKManager logOut]
setelah gagal, aplikasi akan men-cache accessToken untuk pengguna , dan kemudian pengguna mengubah facebook account untuk user B, ketika user B login facebook lagi,ia akan muncul kembali masalah ini.
Saya juga terjebak pada masalah ini untuk sementara waktu. kemudian saya buat objek untuk FBSDKLoginManager di .h file dan di viewDidLoad dari .m file , menginisialisasi dan mengatur keluar kamar.
_fbLogin= [[FBSDKLoginManager alloc]init];
[_fbLogin logOut];
Ini membantu saya dan semoga membantu anda juga. Semua yang terbaik.
Terima kasih
Bagi saya di Objective-C berikut bekerja
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
[login logOut];
}
dan masalah pengguna mencoba untuk login sebagai user lain seperti yang disarankan oleh @Vineeth Joseph
Single Sign On
I've juga menemukan bahwa masalah ini terjadi jika anda memiliki sebuah aplikasi yang tidak memerlukan single sign on (yaitu sebuah aplikasi yang beberapa pengguna akan membuat konten dan berbagi satu perangkat).
Anda dapat mengubah single sign on dalam pengaturan aplikasi anda https://developers.facebook.com/apps/your-app-id/settings/.