2014-08-27 2 views
0

Так что я пытаюсь получить изображение профиля Facebook пользователей, используя SLRequest. Я чувствую, что я все время прочесывал весь интернет, и я нахожусь на своем пути. Вот дилемма ...iOS7 Access user Facebook Профиль Picture

Version 1 кода:

let store = ACAccountStore() 
let type = store.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierFacebook) 
store.requestAccessToAccountsWithType(type, options: [ ACFacebookAppIdKey: "1437725166510606", ACFacebookPermissionsKey: ["email"] ]) { (granted: Bool, error: NSError!) -> Void in 
    if granted { 
     let accounts = store.accountsWithAccountType(type) 
     if let account = accounts.last as? ACAccount { 
      let pictureURLString = "https://graph.facebook.com/v2.1/me/picture" 
      let request = SLRequest(forServiceType: SLServiceTypeFacebook, requestMethod: SLRequestMethod.GET, URL: NSURL(string: pictureURLString), parameters: nil) 
      request.account = account 
      request.performRequestWithHandler() { (data: NSData!, response: NSHTTPURLResponse!, error: NSError!) -> Void in 
       if let imageData = data { 
        // Save the image 
        // println("Data size: \(imageData.length)\ndata: \(imageData.description)\nAs string: \(NSString(data: imageData, encoding: NSUTF8StringEncoding))") 
        data.writeToFile(NSFileManager.defaultManager().profileImagePath(), atomically: true) 
       } 
      } 
     } 
    } 
} 

Итак, эта версия работает, но возвращает действительно, очень небольшую версию изображения профиля. Я хочу увеличить изображение! В соответствии с документами Facebook и многими другими на SO способ сделать это - указать такие параметры, как: type = large или width = 120 & height = 120, но как только я это сделаю, я получаю следующую ошибку:

{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}} 

Когда документы Facebook для получения изображения профиля (в https://developers.facebook.com/docs/graph-api/reference/v2.1/user/picture) явно состояние:

Because profile pictures are always public on Facebook, this call does not require any access token.

Многие предложения, такие, как этот ответ https://stackoverflow.com/a/7882628/1175289, предлагают использовать идентификатор Facebook, а не «я» в запросе , но теперь это, похоже, не работает, потому что мы получаем app_scoped_user_id, а не каноническую fbId.

EDIT: Это прекрасно работает, я просто был доской! :)


Ради здравомыслия, вот код, который вызывает ошибку:

let store = ACAccountStore() 
    let type = store.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierFacebook) 
    store.requestAccessToAccountsWithType(type, options: [ ACFacebookAppIdKey: "1437725166510606", ACFacebookPermissionsKey: ["email"] ]) { (granted: Bool, error: NSError!) -> Void in 
     if granted { 
      let accounts = store.accountsWithAccountType(type) 
      if let account = accounts.last as? ACAccount { 
       let pictureURLString = "https://graph.facebook.com/v2.1/me/picture?type=large" 
       let request = SLRequest(forServiceType: SLServiceTypeFacebook, requestMethod: SLRequestMethod.GET, URL: NSURL(string: pictureURLString), parameters: nil) 
       request.account = account 
       request.performRequestWithHandler() { (data: NSData!, response: NSHTTPURLResponse!, error: NSError!) -> Void in 
        if let imageData = data { 
         // Save the image 
         // println("Data size: \(imageData.length)\ndata: \(imageData.description)\nAs string: \(NSString(data: imageData, encoding: NSUTF8StringEncoding))") 
         data.writeToFile(NSFileManager.defaultManager().profileImagePath(), atomically: true) 
        } 
       } 
      } 
     } 
    } 

, как вы можете видеть, единственное, что изменилось, так это добавление типа = большой? к строке URL.

Если кто-либо сталкивался с подобной проблемой или имеет представление о том, что я делаю неправильно, помощь будет очень признательна! :)

ответ

1

Поскольку вы используете /me/ в своем вызове API, требуется access_token, потому что API не знает, кто такой me. Если вы замените это идентификатором пользователя, например.

https://graph.facebook.com/v2.1/4/picture?type=large 

Должно работать нормально.

Если вы хотите продолжать использовать /me/ в URL, просто добавьте access_token к URL пользователя тоже например .:

https://graph.facebook.com/v2.1/4/picture?type=large&access_token=abcdef 
+0

Эй, спасибо за ответ. Я бы хотел извиниться за свою глупость! Я думал, что использование идентификатора пользователя не работает при использовании app_scoped_user_id, когда на самом деле я ранее неправильно создавал ссылку! Кажется, на самом деле это работает, как вы говорите! –

+0

Вы бы не поняли, почему запрос на https://graph.facebook.com/v2.1/10204218234286542/picture?type=large отлично работает в браузере, но по запросу через SLRequest в моем приложении, return: {"error": {"message": "(# 100) type должно быть одним из следующих значений: small, normal, large, square", "type": "OAuthException", "code": 100}} ?? –

+0

@ george-green вам нужно будет добавить тип = большие параметры как часть параметров SLRequest Dictionary, например. 'Параметры: @ {@ "тип": @ "нормальный"}'. Тогда это сработает. – fschaper