"Вы уже авторизовали свое приложение" при входе в систему с помощью FBSDK 4.7.1
Я следовал собственному учебному пособию Facebook для входа в FB в iOS (Objective-C), но каждый раз, когда я вхожу в систему - после начального экрана авторизации разрешений - я получаю печально известное веб-представление "Вы уже авторизовали это приложение".
Я прочитал тонну постов, но не смог разобраться, поэтому (пере) пост. Я нахожу это довольно странным, потому что приложение не имеет абсолютно ничего, кроме стандартного кода входа в систему. Такое поведение происходит как в симуляторе, так и на реальных устройствах.
Это приложение для 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.
Есть идеи как этого избежать?
3 ответа
Это поведение по умолчанию!
Facebook SDK позволяет войти в Facebook из приложения Facebook (если оно установлено на вашем телефоне), ИЛИ в противном случае он будет управлять входом из Safari. И когда логин Facebook используется вашим приложением из Safari, именно так вы должны получать разрешение каждый раз.
Другое поведение заключается в том, что если на вашем iphone нет приложения Facebook, и вы используете процесс входа в Facebook SDK из своего приложения, он будет использовать Safari; Вы не сможете выйти даже из-за того, что Safari сохраняет ваши учетные данные в cookie-файлах, и вы никак не можете удалить cookie-файлы safari из своего приложения.
Если на вашем телефоне установлено приложение Facebook, оно будет перенаправлено на ваше приложение без перебоев.
РЕДАКТИРОВАТЬ -
Такое поведение также встречается в iOS 10. Спасибо за редактирование - Tiois
Проверьте, есть ли текущий сеанс, прежде чем войти в систему с 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
}
Вместо того, чтобы вызывать логин при каждом запуске, вы можете проверить статус токена доступа. Если срок его действия не истек, вы пропускаете вход в систему и просто начинаете использовать API. Следующий метод может использоваться, чтобы проверить, истек ли токен:
+(BOOL) accessTokenIsLocalyValid
{
return [FBSDKAccessToken currentAccessToken] && [[NSDate date] compare:[FBSDKAccessToken currentAccessToken].expirationDate] == NSOrderedAscending;
}
Если у вас есть действительный токен, вы можете обновить его, используя [FBSDKAccessToken refreshCurrentAccessToken:]
,