私のiOSアプリは、サインアップ中にFacebookのGraph APIリクエストを使用してユーザー情報を取得します。これは、Facebookの最新のSDKにアップグレードする前に正常に機能していました。アップグレード後、「FBSDKLog:Graph API v2.4以降、/ meのGETリクエストには明示的な「フィールド」パラメータが含まれている必要があります」という実行時エラーが表示されます。
コードは次のとおりです。
func requestFacebook() {
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
if ((error) != nil)
{
// Process error
println("Error: \(error)")
}
else if error == nil
{
let birthday : NSString = (result.valueForKey("birthday") as? NSString)!
var currentDate = NSDate()
var birthdayFormatter = NSDateFormatter()
let userCalendar = NSCalendar.currentCalendar()
birthdayFormatter.dateFormat = "MM/DD/YYYY"
var birthdayNSDate = birthdayFormatter.dateFromString(birthday as String)
var userAge = self.calculateAge(birthdayNSDate!)
PFUser.currentUser()!["age"] = userAge
var facebookID: NSString = (result.valueForKey("id") as? NSString)!
var pictureURL = "https://graph.facebook.com/\(facebookID)/picture?type=large&return_ssl_resources=1"
var URLRequest = NSURL(string: pictureURL)
var URLRequestNeeded = NSURLRequest(URL: URLRequest!)
NSURLConnection.sendAsynchronousRequest(URLRequestNeeded, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!, error: NSError!) -> Void in
if error == nil {
var picture = PFFile(data: data)
PFUser.currentUser()!["picture"] = picture
PFUser.currentUser()!.saveInBackgroundWithBlock({ (success, error) -> Void in
if error == nil {
var userPicture:PFFile = PFUser.currentUser()!.valueForKey("picture") as! PFFile
userPicture.getDataInBackgroundWithBlock { (imageData, error) -> Void in
if error == nil {
self.meProfileImageView.image = UIImage(data: imageData!)
var userName:String = PFUser.currentUser()!.valueForKey("username") as! String
var userAge:Int = PFUser.currentUser()!.valueForKey("age") as! Int
self.meLabel.text = "\(userName), \(userAge)"
self.findFriends()
}
}
} else {
println(error)
}
})
}
else {
println("Error: \(error.localizedDescription)")
}
})
}
})
}
エラーメッセージは次の行にあります。
let birthday : NSString = (result.valueForKey("birthday") as? NSString)!
このコードは、FacebookのSDK v4.5.1にアップグレードする前に完全に正常に実行されましたが、この機能を動作させるために何を変更すればよいかわかりません。私を助けてくれる人に感謝します!
この行には、nilではないパラメーター値が必要です
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
たとえば、さらに展開しますが、これは疑似コードです。
したがって、ObjCの場合、これはたとえば次のようになります。したがって、上記は次のようになります。
parameters:@{@"fields": @"id, name"}
Swiftでは、似たようなものになります
このようなもの:
parameters:["fields": "email"]
これはたった2つのフィールドのためのものであり、これも擬似コードですが、パラメータを指定する必要があります
このアップデートを追加して、上記のフィールドのパラメータを見つけた人に見せるために、クイックリンクを示します:
https://developers.facebook.com/docs/graph-api/reference/user
以下の情報の形式は次のとおりです。私はこれをすぐに行いました。
"parameter" "type"
"description"
id数値文字列
このユーザーのユーザーアカウントのID。このIDは各アプリに固有であり、異なるアプリ間で使用することはできません。アップグレードガイドには、アプリ固有のIDに関する詳細情報が記載されています
about文字列
この人のプロフィールの[自己紹介]セクション
age_rangeAgeRange
この人の年齢区分は、最低年齢と最高年齢として表されます。たとえば、18を超え、21未満です。
bio文字列
人のバイオ
誕生日文字列
人の誕生日。これは、MM/DD/YYYYのような固定形式の文字列です。ただし、生まれた年を月と日とは別に見ることができる人を制御できるため、この文字列は年(YYYY)または月+日(MM/DD)のみになります
contextUserContext
この人の社会的背景
通貨通貨
その人の現地通貨情報
デバイスリスト
その人が使用しているデバイスのリスト。これは、iOSおよびAndroidデバイスのみを返します
educationリスト
人の教育
email文字列
プロフィールにリストされている個人のメインのメールアドレス。有効なメールアドレスが利用できない場合、このフィールドは返されません
favorite_athletesリスト
人が好きな選手
favorite_teamsリスト
人が好きなスポーツチーム
first_name文字列
人の名
gender文字列
この人が選択した性別、男性または女性。性別がカスタム値に設定されている場合、この値は省略されます
hometownページ
人の故郷
inspirational_peopleリスト
人の心に強く訴える人々
install_typeenum
インストールタイプ
installedbool
リクエストを行っているアプリはインストールされていますか?
interested_inリスト
その人が興味を持っている性別
is_shared_loginbool
これは共有ログインですか(グレーのユーザーなど)
is_verifiedbool
多数のフォロワーを持つ人々は、自分の身元の信ity性をFacebookによって手動で検証できます。このフィールドは、個人のプロファイルがこの方法で検証されるかどうかを示します。これは検証済みフィールドとは異なります
言語リスト
この人が知っている言語を表すFacebookページ
last_name文字列
人の姓
link文字列
その人のタイムラインへのリンク
locationページ
プロフィールに入力された人の現在の場所。このフィールドはチェックインとは関係ありません
locale文字列
人のロケール
meeting_forリスト
人が会議に興味を持っているもの
** middle_name文字列
人のミドルネーム
name文字列
人のフルネーム
CoreDefault
name_format文字列
中国語、日本語、または韓国語の注文を正しく処理するようにフォーマットされた個人の名前
payment_pricepointsPaymentPricepoints
その人の支払い価格
test_groupunsigned int32
プラットフォームテストグループ
political文字列
人の政治的見解
relationship_status文字列
人の関係の状態
宗教文字列
人の宗教
security_settingsSecuritySettings
セキュリティ設定
significant_otherユーザー
その人の重要な他者
スポーツリスト
この人が好きなスポーツ
quotes文字列
その人のお気に入りの引用
third_party_id文字列
匿名であるが個人の一意の識別子を含む文字列。この識別子はサードパーティで使用できます
timezonefloat(最小:-24)(最大:24)
UTCからの個人の現在のタイムゾーンオフセット
token_for_business文字列
企業のアプリ間で同じトークン。このトークンにアクセスするには、ユーザーがアプリにログインする必要があります。このトークンは、アプリを所有するビジネスが変更されると変更されます
updated_timedatetime
更新された時間
shared_login_upgrade_required_bydatetime
共有ログインをBusiness Managerにアップグレードする必要がある時間
verifiedbool
アカウントが検証されたかどうかを示します。これはis_verifiedフィールドとは異なります。次のいずれかのアクションを実行すると、誰かが検証済みと見なされます。
Register for mobile Confirm their account via SMS Enter a valid credit card
video_upload_limitsVideoUploadLimits
ビデオのアップロード制限
viewer_can_send_giftbool
視聴者はこの人に贈り物を送ることができますか?
website文字列
人のウェブサイト
workリスト
人の仕事の経験の詳細
public_key文字列
その人のPGP公開鍵
coverCoverPhoto
"Edge"
"説明"
favorite_requests
Graph APIに対する開発者のお気に入りのリクエスト
request_history
開発者のGraph APIリクエスト履歴
アカウント
この人が管理する/管理者であるFacebookページ
実績
Facebookゲームでの成果
adaccounts
この人がアクセスできる広告アカウント
adaccountgroups
広告アカウントグループ
契約
その人の広告契約
admined_groups
ユーザー管理者をグループ化します
adnetworkanalytics
ユーザーのオーディエンスネットワークアプリのインサイトデータ
アルバム
この人が作成したフォトアルバム
apprequests
この人のアプリからの保留中のリクエスト
apprequestformerrecipients
アプリのリクエスト
本
この人のプロフィールにリストされている本
ドメイン
ユーザーが管理するドメイン
イベント
この人のイベント。デフォルトでは、これにはその人が辞退した、または返信しなかったイベントは含まれません
家族
この人の家族関係。
stream_filters
ニュースフィードエッジに適用できるフィルターのリスト
friendlists
その人のカスタム友達リスト
ids_for_business
ビジネスエンティティは、ビジネスマネージャーを使用して複数のアプリの所有権を主張できます。このEdgeは、このユーザーが他のアプリで持っているIDのリストを返します
invitable_friends
Facebook Canvasアプリのインストールに招待できる友人のリスト
ゲーム
この人が好きなゲーム
グループ
個人が属するFacebookグループ
likes
この人が気に入ったすべてのページ
映画
この人が好きな映画
音楽
この人が好きな音楽
オブジェクト
オブジェクト
許可
ユーザーがこのアプリに付与した権限
写真
ユーザーがタグ付けされた写真またはアップロードした写真
写真
その人のプロフィール写真
tagged_places
この人のタグ付けされた場所のリスト。動画、投稿、ステータス、またはリンクにタグを含めることができます
promotable_domains
ユーザーが昇格できるすべてのドメイン
promotable_events
ユーザーが昇格できるすべてのイベント。
taggable_friends
Graph APIを介して公開されたコンテンツでタグ付けできる友人
テレビ
この人が好きなテレビ番組
ビデオ
ユーザーがタグ付けまたはアップロードされた動画
video_broadcasts
この人からのビデオ放送
アプリケーション
この人が開発者であるFacebookアプリ。
checkins
この人が作成したチェックイン。
feed
この人が公開した投稿(ステータスの更新を含む)とリンクのフィード。
friendrequests
人の保留中の友人のリクエスト。
友達
人の友達。
home
個人のFacebookホームページフィード。
inbox
個人のFacebookメッセージ受信ボックス。
場所
位置情報を含み、この人物にタグが付けられた投稿と写真のフィード。これは、その人が訪れた場所の年表を作成するのに役立ちます。
相互の友人
二人の間の共通の友人のリスト。
通知
人が持っている未読のFacebook通知。
outbox
人のFacebookメッセージ送信ボックス。
質問
人が作成した質問。
スコア
この人がプレイしたFacebookゲームから受け取ったスコア。
購読者
この人をフォローしているプロファイル。
subscribed
この人がフォローしているプロファイル。
キーとして「フィールド」を使用し、値をコンマで区切ります
let params = ["fields": "email, friends"]
Obj-Cでは、logInWithReadPermissionsメソッドに次を挿入します。
parameters:@{@"fields": @"id, name, email"}
パラメータにnilを残すと、結果オブジェクトでidとnameのみを受け取りますが、たとえば次のように設定します:
NSArray *permissionsArray = @[ @"email", @"public_profile"];
ドキュメントではあまり明確ではありませんが、それが役立つことを願っています。
私も同じ問題を抱えていましたが、フィールドオプションを追加すると、ユーザーの写真を取得するときにリクエストエラーが発生しました。単純なparameters:@{@"fields": @""}
をコードに追加して、この問題を解決しました。
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"me/picture"]
parameters:@{@"fields": @""}
HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
id result,
NSError *error) {
if (!error) {
// success
} else {
// fail
}}
];
Swiftでは、次のように複数のパラメーターを宣言できます。
let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, first_name, last_name, gender, picture"])