"You have already authorized yourApp" 使用 FBSDK 4.7.1 登录时
"You have already authorized yourApp" when logging in using FBSDK 4.7.1
我在 iOS (Objective-C) 中关注 Facebook's own tutorial 以进行 FB 登录,但每次登录时 - 在初始权限授权屏幕之后 - 我都会收到臭名昭著的 "You have already authorized this app" 网页浏览。
我读了很多 post,但我无法整理,因此 (re)post。我觉得这很奇怪,因为该应用程序除了样板登录代码外什么都没有。这种行为在模拟器和真实设备中都会发生。
此应用适用于 iOS 9.0,我使用的是 FBSDK 4.7.1(通过 CocoaPods 安装):
pod 'FBSDKLoginKit', '~> 4.6'
代码本身就是样板文件,这是我的 AppDelegate.m:
#import "AppDelegate.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBSDKAppEvents activateApp];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
@end
和我的 ViewController.m:
#import "ViewController.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"];
[loginButton setLoginBehavior:FBSDKLoginBehaviorSystemAccount]; // No difference
loginButton.center = self.view.center;
[self.view addSubview:loginButton];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
以及Info.plist的截图:
最后,我在控制台中也遇到了这两个错误:
2015-11-24 11:50:42.855 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"
2015-11-24 11:50:42.860 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"
尽管根据我的阅读,如果在 Info.plist.
中设置了 LSApplicationQueriesSchemes,则可以安全地忽略它
有什么办法可以避免这种情况吗?
这是默认行为!
Facebook SDK 允许您从 Facebook 应用程序登录到 facebook(如果它安装在您的 phone 中),否则它将管理从 Safari 的登录。
当您的应用程序从 Safari 使用 Facebook 登录时,这就是您每次都必须接受许可的方式。
另一个行为是,如果您的 iphone 没有 Facebook 应用程序,并且您从您的应用程序使用 Facebook SDK 登录过程,它将使用 Safari;您甚至无法注销,因为 Safari 会将您的凭据保存在 cookie 中,您无法从应用程序中清除 safari cookie。
如果您的 phone 有 Facebook 应用程序,它将重定向到您的应用程序而不会受到任何干扰。
编辑 -
此行为也存在于 iOS10 中。
感谢编辑 - Tiois
您可以检查访问令牌的状态,而不是在每次启动时都触发登录。如果未过期,则跳过登录,直接开始使用 API。可以使用以下方法检查令牌是否过期:
+(BOOL) accessTokenIsLocalyValid
{
return [FBSDKAccessToken currentAccessToken] && [[NSDate date] compare:[FBSDKAccessToken currentAccessToken].expirationDate] == NSOrderedAscending;
}
如果您有一个有效的令牌,您可以使用[FBSDKAccessToken refreshCurrentAccessToken:]
刷新它。
使用FBSDKLoginManager
登录前检查是否有当前会话。
if ([FBSDKAccessToken currentAccessToken])
{
NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
// Now get details using graphpath.
} else {
// login with permissions using FBSDKLoginManager and get details using graphpath in completion
}
我在 iOS (Objective-C) 中关注 Facebook's own tutorial 以进行 FB 登录,但每次登录时 - 在初始权限授权屏幕之后 - 我都会收到臭名昭著的 "You have already authorized this app" 网页浏览。
我读了很多 post,但我无法整理,因此 (re)post。我觉得这很奇怪,因为该应用程序除了样板登录代码外什么都没有。这种行为在模拟器和真实设备中都会发生。
此应用适用于 iOS 9.0,我使用的是 FBSDK 4.7.1(通过 CocoaPods 安装):
pod 'FBSDKLoginKit', '~> 4.6'
代码本身就是样板文件,这是我的 AppDelegate.m:
#import "AppDelegate.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBSDKAppEvents activateApp];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
@end
和我的 ViewController.m:
#import "ViewController.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"];
[loginButton setLoginBehavior:FBSDKLoginBehaviorSystemAccount]; // No difference
loginButton.center = self.view.center;
[self.view addSubview:loginButton];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
以及Info.plist的截图:
最后,我在控制台中也遇到了这两个错误:
2015-11-24 11:50:42.855 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"
2015-11-24 11:50:42.860 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"
尽管根据我的阅读,如果在 Info.plist.
中设置了 LSApplicationQueriesSchemes,则可以安全地忽略它有什么办法可以避免这种情况吗?
这是默认行为!
Facebook SDK 允许您从 Facebook 应用程序登录到 facebook(如果它安装在您的 phone 中),否则它将管理从 Safari 的登录。 当您的应用程序从 Safari 使用 Facebook 登录时,这就是您每次都必须接受许可的方式。
另一个行为是,如果您的 iphone 没有 Facebook 应用程序,并且您从您的应用程序使用 Facebook SDK 登录过程,它将使用 Safari;您甚至无法注销,因为 Safari 会将您的凭据保存在 cookie 中,您无法从应用程序中清除 safari cookie。
如果您的 phone 有 Facebook 应用程序,它将重定向到您的应用程序而不会受到任何干扰。
编辑 -
此行为也存在于 iOS10 中。 感谢编辑 - Tiois
您可以检查访问令牌的状态,而不是在每次启动时都触发登录。如果未过期,则跳过登录,直接开始使用 API。可以使用以下方法检查令牌是否过期:
+(BOOL) accessTokenIsLocalyValid
{
return [FBSDKAccessToken currentAccessToken] && [[NSDate date] compare:[FBSDKAccessToken currentAccessToken].expirationDate] == NSOrderedAscending;
}
如果您有一个有效的令牌,您可以使用[FBSDKAccessToken refreshCurrentAccessToken:]
刷新它。
使用FBSDKLoginManager
登录前检查是否有当前会话。
if ([FBSDKAccessToken currentAccessToken])
{
NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
// Now get details using graphpath.
} else {
// login with permissions using FBSDKLoginManager and get details using graphpath in completion
}