iOS7 Доступ пользователя Facebook Изображение профиля

Поэтому я пытаюсь получить изображение профиля пользователя Facebook с помощью SLRequest. Я чувствую, что я безрезультатно прочесал весь интернет, и я нахожусь в своем уме. Вот дилемма...

Версия 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) указано следующее:

Поскольку изображения профиля всегда общедоступны в Facebook, для этого вызова не требуется токен доступа.

Многие предложения, такие как этот ответ /questions/24917242/kak-ya-mogu-poluchit-izobrazhenie-profilya-kogo-to-dlya-otobrazheniya-obratno-k-nim/24917250#24917250, предлагают использовать идентификатор Facebook, а не "меня" в запросе, но это, похоже, не работает вообще сейчас, когда мы получаем app_scoped_user_id а не канонический fbId.

РЕДАКТИРОВАТЬ: Это отлично работает, я просто был доской!:)


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

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)
                    }
                }
            }
        }
    }

как вы можете видеть, единственное, что изменилось, это добавление?type=large к строке 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
Другие вопросы по тегам