Запрос разрешения 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)
}
}