"Вы уже авторизовали свое приложение" при входе в систему с помощью 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:

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:],

Другие вопросы по тегам