0

だから私は SLRequest を使用してユーザーの Facebook プロフィール画像を取得しようとしています。私は、インターネット全体を無駄に探し回ったような気がして、途方に暮れています。ここにジレンマがあります...

コードのバージョン 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 で公開されるため、この呼び出しにはアクセス トークンは必要ありません。

この回答https://stackoverflow.com/a/7882628/1175289などの多くの提案は、リクエストで「私」ではなくFacebook IDを使用することを提案していますが、 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)
                    }
                }
            }
        }
    }

ご覧のとおり、変更された唯一の点は、url 文字列に ?type=large が追加されたことです。


誰かが同様の問題に直面している場合、または私が間違っていることを知っている場合は、助けていただければ幸いです! :)

4

1 に答える 1