Хранить информацию о Facebook в базе данных Firebase с помощью SDK Facebook IOS swift

Я пытаюсь сохранить пользовательские данные facebook в базе данных Firebase, но получаю сообщение об ошибке "Не удается преобразовать что-либо? В ожидаемый тип String"

((FBSDKAccessToken.current()) != nil){
            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                if (error == nil && result != nil) {
                    guard let fbData = result as? [String:Any] else { return }
                    let fbid = fbData["id"]
                    let name = fbData["name"]
                    self.ref.child("users").child(fbid).setValue([
                        "id": fbid,
                        "name": name
                    ])
                }
            })

Я также хочу сохранить URL-адрес изображения в базе данных. Как я могу это сделать?

Использование Facebook IOS Swift SDK и Firebase

1 ответ

Попробуй мой я эту функцию реализовать. Это из производственного приложения, и оно хорошо работает для нас. Я также рекомендую загружать изображение профиля в хранилище Firebase или другое хранилище, поскольку через некоторое время URL-адрес изображения профиля становится недействительным.

    class func getAllFacebookData(success: ((_ result: [String : Any]) -> Void)?, fail: ((_ error: Error) -> Void)?) {
                guard !isGetDataFromFacebook else { return }
                DispatchQueue.global(qos: .background).async {
                    guard let tokenString = FBSDKAccessToken.current()?.tokenString else { return }
                    guard let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "name,age_range,birthday,gender,email,first_name,last_name,picture.width(1000).height(1000),work,education,hometown,location, friends"], tokenString: tokenString, version: nil, httpMethod: "GET") else { return }
                    req.start { (connection, result, error) in
                        if error == nil {
                            guard let _result = result as? [String : Any] else { return }

                            let _picture      = _result["picture"] as? [String : Any]
                            let _pictureData  = _picture?["data"] as? [String : Any]
                            let _isSilhouette = _pictureData?["is_silhouette"] as? Bool

                            let userPref = UserDefaults.standard
                            userPref.set(_isSilhouette, forKey: "UserHasSilhouetteImage")
                            userPref.synchronize()

                            debugPrint("facebook result", _result)
                            isGetDataFromFacebook = true
                            syncUserInfoInDatabase(_result)

                            success?(_result)
                        } else {
                            debugPrint("request", error!)
                            fail?(error!)
                        }
                    }
                }
            }

    fileprivate class func syncUserInfoInDatabase(_ userInfo: [String : Any]) {
        let realmManager = RealmManager()
        guard let currentUser = realmManager.getCurrentUser() else { return }
        guard let userInfoModel = createUserInfoModel(userInfo) else { return }
        do {
            let realm = try Realm()
            try realm.write {
                currentUser.info = userInfoModel
            }
        } catch {
            debugPrint("realm syncUserInfoInDatabase error", error.localizedDescription)
        }

        savePhoto(userInfo)

        let firebaseDatabaseGeneralManager = FirebaseDatabaseGeneralManager()
        firebaseDatabaseGeneralManager.updateCurrentUser(success: nil, fail: nil)

        // crete a personal settings
        let firUserSettingsDatabaseManager = FIRUserSettingsDatabaseManager()
        firUserSettingsDatabaseManager.createStartPeopleFilterSettings(success: nil, fail: nil)

        let userSearchLocationModel = UserSearchLocationModel()
        userSearchLocationModel.userID = currentUser.id
        userSearchLocationModel.birthdayTimeStamp = currentUser.birthdayTimeStamp
        userSearchLocationModel.gender = currentUser.gender

        switch currentUser.gender {
        case UserPeopleFilterSettings.FilterGenderMode.female.description:
            userSearchLocationModel.genderIndex = UserPeopleFilterSettings.FilterGenderMode.female.index
        case UserPeopleFilterSettings.FilterGenderMode.male.description:
            userSearchLocationModel.genderIndex = UserPeopleFilterSettings.FilterGenderMode.male.index
        default: break
        }

        let firPeopleSearchDatabaseManager = FIRPeopleSearchDatabaseManager()
        firPeopleSearchDatabaseManager.saveUserSearchLocationModel(userSearchLocationModel, success: nil, fail: nil)
    }

private class func savePhoto(_ userInfo: [String : Any]) {
        if let pictureDict = userInfo["picture"] as? [String : Any], let pictureDataDict = pictureDict["data"] as? [String : Any] {
            if let urlPath = pictureDataDict["url"] as? String {
                let firImageDatabaseManager = FIRImageDatabaseManager()
                firImageDatabaseManager.saveProfileImage(urlPath, fileName: nil, isFacebookPhoto: true, realmSaved: nil)
            }
        }
    }
Другие вопросы по тегам