jim*_*jim 64 objective-c ios facebook-sdk-4.0
我刚刚更新了facebook sdk v4.0
并根据使用自定义登录UI的教程
-(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
}
}
}];
}
Run Code Online (Sandbox Code Playgroud)
但结果总是为零,错误代码是304,我错过了什么?
Vin*_*eph 204
我遇到了类似的问题.
初始化后,FBSDKLoginManager我添加了一行来清除数据和(Facebook)令牌:
FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];
[loginmanager logOut];
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
因此,正如OP所要求的那样,"我错过了什么"吗?
是的,以下标准示例代码随处可见,这是完全错误的:
-(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); }
}
}];
}
Run Code Online (Sandbox Code Playgroud)
你必须这样做:
-(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); }
}
}];
}
Run Code Online (Sandbox Code Playgroud)
否则,非常简单,如果用户碰巧更改设备上的FB帐户,该应用程序将无法运行.(除非他们因某些原因重新安装应用程序!)
再一次 - 如果用户碰巧更改FB帐户,上面流行的示例代码根本不起作用(应用程序进入无限循环).该logOut调用必须进行.
当我将Facebook AppID(在Info.plist文件中)从测试Facebook应用程序切换到生产Facebook应用程序时,这发生在我身上.如果你的应用程序将Facebook令牌发送到例如生成JWT的服务器,Facebook SDK仍然会FBSDKAccessToken.currentAccessToken()持久保存fbToken(),除非它被告知要删除它.当用户退出应用程序时,也可能在生产中发生这种情况,注销API请求会将用户注销并重置您的JWT.但即使在发送注销API请求之前,客户端也需要告诉FBSDKLoginManager实例注销.
if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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())
}
})
}
Run Code Online (Sandbox Code Playgroud)