#ios #swift #facebook #facebook-ios-sdk
#iOS #swift #Facebook #facebook-ios-sdk
Вопрос:
Я пытаюсь прочитать сообщения со страницы Facebook, используя следующий код:
class FacebookGraphAPI {
class func getPosts(fromPageWithID pageId: String, parameters: [String: AnyObject]?, completion: @escaping ([FacebookPost]?, Error?) -> Void) {
self.getAccessToken { (accessToken, error) in
if error != nil {
completion(nil, error)
return
}
let params = ["access_token": accessToken, "fields": "created_time,message,story"]
if let request = FBSDKGraphRequest(graphPath: "(pageId)/posts", parameters: params) {
request.start { (connection, result, error) in
if error != nil {
completion(nil, error)
return
}
guard let resultDict = result as? [String: AnyObject],
let data = resultDict["data"] as? NSArray
else {
completion(nil, nil)
return
}
var posts = [FacebookPost]()
for item in data {
posts.append(FacebookPost(dict: item as! NSDictionary))
}
completion(posts, nil)
}
}
completion(nil, nil)
}
}
class func getAccessToken(completion: @escaping (String?, Error?) -> Void) {
let clientId = Bundle.main.object(forInfoDictionaryKey: "FacebookAppID") as! String
let clientSecret = Bundle.main.object(forInfoDictionaryKey: "FacebookAppSecret") as! String
let params = ["client_id": clientId, "client_secret": clientSecret, "grant_type": "client_credentials", "fields": "access_token"]
if let request = FBSDKGraphRequest(graphPath: "oauth/access_token", parameters: params) {
request.start(completionHandler: { (connection, result, error) in
if error != nil {
completion(nil, error)
return
}
guard let resultDict = result as? [String: AnyObject] else {
completion(nil, nil)
return
}
let accessToken = resultDict["access_token"] as! String
completion(accessToken, nil)
})
}
}
}
Который я затем вызываю, используя, например, следующее:
FacebookGraphAPI.getPosts(fromPageWithID: "{page-id}", parameters: ["limit": 5 as AnyObject]) { (posts, error) in
guard error == nil else { return }
...
}
Ошибка, которую я получаю, такова: -[_SwiftValue length]: unrecognized selector sent to instance
при запуске второго запроса FBSDKGraphRequest.
Я попытался удалить первый запрос FBSDKGraphRequest, а затем я, по крайней мере, получаю ответ в completionHandler. Кажется, что я не могу выполнить более одного запроса FBSDKGraphRequest.
Любая помощь приветствуется.
Заранее спасибо!
Комментарии:
1. Можете ли вы успешно сгенерировать токен доступа из первого запроса Graph?
2. Да, без каких-либо проблем
3. Хм, внезапно я не получаю никакого ответа при попытке получить токен доступа
4. Упс, я по ошибке вызвал свой метод внутри асинхронного блока DispatchQueue. Теперь я могу снова успешно получить токен доступа
Ответ №1:
Мне наконец удалось найти проблему, когда я подумал об ошибке и вспомнил, что фреймворк FBSDKCoreKit был написан на Objective-C.
Все, что мне нужно было сделать, это привести accessToken
внутри массива параметров к NSString
.
Я изменил следующее:
let params = ["access_token": accessToken, "fields": "created_time,message,story"]
Для:
let params = ["access_token": accessToken! as NSString, "fields": "created_time,message,story"]