Swift / Backendless — вход через Facebook работает на iPhone, но не на iPad Simulator. Как правильно использовать Facebook SDK?

Я использую следующую функцию, чтобы использовать вход FacebookSDK для моих бэкэнд-пользователей:

func application(application: UIApplication,
                 openURL url: NSURL,
                 sourceApplication: String?,
                 annotation: AnyObject) -> Bool {

    let result = FBSDKApplicationDelegate.sharedInstance().application(application,
                                                                       openURL: url,
                                                                       sourceApplication: sourceApplication,
                                                                       annotation: annotation)
    if result {

        let token = FBSDKAccessToken.currentAccessToken()
        let fieldsMapping = [
            "id" : "facebookId",
            "name" : "name",
            "birthday": "birthday",
            "first_name": "fb_first_name",
            "last_name" : "fb_last_name",
            "gender": "gender",
            "email": "email"
        ]

        // REQUEST FB IMAGE
        let request = FBSDKGraphRequest.init(graphPath: "me", parameters: ["fields":"email"], tokenString: token.tokenString, version: nil, HTTPMethod: "GET")

        request.startWithCompletionHandler({ (connection, result, error : NSError!) in

            if error == nil {
                let facebookID = result["id"]! as! String
                let avatarURL = "https://graph.facebook.com/\(facebookID)/picture?type=normal"

                updateBackendlessUser(facebookID, avatarURL: avatarURL)
            } else {
                print(error)
            }
        })
        // REQUEST FB IMAGE END

        backendless.userService.loginWithFacebookSDK(
            token,
            fieldsMapping: fieldsMapping,
            response: { (user: BackendlessUser!) -> Void in
               // self.backendless.userService.currentUser = user
                print("user: \(user)")

                dispatch_async(dispatch_get_main_queue()) {
                    let lcVC = stb.instantiateViewControllerWithIdentifier("LoadContentVC")
                    self.window?.rootViewController = lcVC
                    self.window?.makeKeyAndVisible()
                }

            },
            error: { (fault: Fault!) -> Void in
                print("Server reported an error: \(fault)")
        })
    }      
    return result
}

Обычно это работает нормально. Сегодня я хотел проверить свой интерфейс на симуляторе iPad Air2. Логин привел к fatal error: unexpectedly found nil while unwrapping an Optional value.

введите здесь описание изображения

Проверил еще раз на своем айфоне. Еще работает.

Я использую последнюю версию FB SDK (пробовал обновить модуль):

pod 'FBSDKCoreKit' pod 'FBSDKLoginKit' pod 'FBSDKShareKit'

Xcode 8 и Swift 2.3

Я попытался поместить блок REQUEST FB IMAGE в оператор if для проверки token != nil, но это привело к сбою в backendless.userService.loginWithFacebookSDK

Почему между физическим iPhone (6S Plus iOS 10.0) и iPad Air2 (iOS 10.0) результаты разные? Помощь очень ценится.

PS: эта строчка во мне didFinishLaunchingWithOptions :

FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

person David Seek    schedule 15.09.2016    source источник


Ответы (1)


Я поделюсь своим опытом. Эта проблема была в моем приложении только в том случае, когда я вызываю FBSDKAccessToken.currentAccessToken() перед методом:

FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

Попробуйте добавить этот метод в файл AppDelegate к методу didFinishLaunchingWithOptions.

Также взгляните на официальную документацию FB.

FBSDKLoginManager работает напрямую с [FBSDKAccessToken currentAccessToken] и устанавливает «currentAccessToken» при успешной авторизации (или устанавливает nil в случае выхода из системы). Вы должны проверить [FBSDKAccessToken currentAccessToken] перед вызовом logIn*, чтобы узнать, доступен ли кешированный токен (обычно в вашем viewDidLoad). Если вы управляете собственными экземплярами токенов за пределами «currentAccessToken», вам нужно будет установить «currentAccessToken» перед вызовом logIn* для авторизации дополнительных разрешений для ваших токенов.

person Oleg Gordiichuk    schedule 15.09.2016
comment
у меня это FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) в моем didFinishLaunchingWithOptions - person David Seek; 15.09.2016