Запрос разрешения Facebook вылетает из iOS-приложения

Нам нужен такой пользователь, я добавил его в FacebookAuthManager (мой пользовательский класс), и все новые пользователи увидят запрос на это разрешение. Но у нас также есть текущие пользователи, поэтому я написал класс, который проверяет, что пользователь был зарегистрирован в Facebook и запрашивает разрешение. Я столкнулся с тем, что получаю сбой приложения и получаю эту ошибку "Завершение приложения из-за необработанного исключения"NSInvalidArgumentException ", причина:" Запросы на чтение не разрешено запрашивать с разрешениями на публикацию или управление". Я указал в комментариях, в какой последовательности я вызываю функции. Как я могу это исправить?

class FacebookPermissionManager {

    /// Request new permission if user's provider is Facebook
    // first
    open func requestNewPersmission(_ permission: FacebookInfo.Permession, completion: ((_ isGranted: Bool, _ error: Error?) -> Void)?) {
        DispatchQueue.global(qos: .background).async {
            guard let currentUser = Auth.auth().currentUser else { return }

            let facebookProvider = "facebook.com"

            var isFacebookProvider = false

            for providerInfo in currentUser.providerData {
                if facebookProvider == providerInfo.providerID {
                    isFacebookProvider = true
                    break
                }
            }
            guard isFacebookProvider else {
                completion?(false, nil)
                return
            }
            guard !self.checkGrant(permission) else {
                debugPrint("checkGrant == true")
                completion?(true, nil)
                return
            }
            debugPrint("isFacebookProvider", isFacebookProvider)
            self.requestPermission(permission, completion: completion)
        }
    }

    // the third
    open func requestPermission(_ permission: FacebookInfo.Permession, completion: ((_ isGranted: Bool, _ error: Error?) -> Void)?) {
        DispatchQueue.main.async {
            guard let topVC = UIApplication.topViewController() else { return }
            let loginManager = FBSDKLoginManager()
            loginManager.logIn(withPublishPermissions: [permission.rawValue], from: topVC, handler: { (result, error) in
                if let _error = error {
                    let file = #file
                    let funcName = #function
                    BugfenderManager.reportError(funcName, fileName: file, error: _error)
                    completion?(false, _error)
                    return
                }
                guard let _result = result else {
                    completion?(false, nil)
                    return
                }
                if _result.grantedPermissions.contains(permission.rawValue)  {
                    completion?(true, nil)
                } else if _result.declinedPermissions.contains(permission.rawValue) {
                    // TODO: do not request permissions again immediately. Consider providing a NUX
                    // describing  why the app want this permission.
                    completion?(false, nil)
                }
            })
        }
    }

    // the second
    private func checkGrant(_ permission: FacebookInfo.Permession) -> Bool {
        guard let accessToken = FBSDKAccessToken.current() else { return false }
        return accessToken.hasGranted(permission.rawValue)
    }

}

1 ответ

Решение

Я исправил это. Я изменил loginManager.logIn(withPublishPermissions:) в loginManager.logIn(withPublishPermissions:)

class FacebookPermissionManager {

    /// Request new permission if user's provider is Facebook
    // first
    open func requestNewPersmission(_ permission: FacebookInfo.Permession, completion: ((_ isGranted: Bool, _ error: Error?) -> Void)?) {
        DispatchQueue.global(qos: .background).async {
            guard let currentUser = Auth.auth().currentUser else { return }

            let facebookProvider = "facebook.com"

            var isFacebookProvider = false

            for providerInfo in currentUser.providerData {
                if facebookProvider == providerInfo.providerID {
                    isFacebookProvider = true
                    break
                }
            }
            guard isFacebookProvider else {
                completion?(false, nil)
                return
            }
            guard !self.checkGrant(permission) else {
                debugPrint("checkGrant == true")
                completion?(true, nil)
                return
            }
            debugPrint("isFacebookProvider", isFacebookProvider)
            self.requestReadPermission(permission, completion: completion)
        }
    }

    // the third
    open func requestReadPermission(_ permission: FacebookInfo.Permession, completion: ((_ isGranted: Bool, _ error: Error?) -> Void)?) {
        DispatchQueue.main.async {
            guard let topVC = UIApplication.topViewController() else { return }
            let loginManager = FBSDKLoginManager()
            loginManager.logIn(withReadPermissions: [permission.rawValue], from: topVC, handler: { (result, error) in
                if let _error = error {
                    let file = #file
                    let funcName = #function
                    BugfenderManager.reportError(funcName, fileName: file, error: _error)
                    completion?(false, _error)
                    return
                }
                guard let _result = result else {
                    completion?(false, nil)
                    return
                }
                if _result.grantedPermissions.contains(permission.rawValue)  {
                    completion?(true, nil)
                } else if _result.declinedPermissions.contains(permission.rawValue) {
                    // TODO: do not request permissions again immediately. Consider providing a NUX
                    // describing  why the app want this permission.
                    completion?(false, nil)
                }
            })
        }
    }

    // the second
    private func checkGrant(_ permission: FacebookInfo.Permession) -> Bool {
        guard let accessToken = FBSDKAccessToken.current() else { return false }
        return accessToken.hasGranted(permission.rawValue)
    }

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