Facebook APIの更新を放置しすぎていて、
ついにFacebookの情報取得ができなくなっていたので修正した時の覚書。
参考
◆ FacebookSDK v4.x/Graph API2.xへの移行
http://qiita.com/kaway/items/0bd3006c7eb2440665d4
◆ Facebook Graph API v2.0のApp Scoped User Idについて調査したことメモ
http://qiita.com/takaaki-mizuno/items/0eec10478188ff365297
SDKの変更
Facebook-iOS-SDK → FBSDKCoreKit / FBSDKLoginKit / FBSDKShareKit
ログイン処理
- ログイン結果のAccessTokenは、[FBSDKAccessToken currentAccessToken]に入る
- permissionを追加したい場合は、再度logInWithReadPermissionsを呼ぶ
- PublishなPermissionを追加したい場合は、logInWithPublishPermissions
適当なサンプル記述
FBSDKLoginManager *login = [FBSDKLoginManager new];
[login logInWithReadPermissions:@[@"email",@"public_profile",@"user_friends"] fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!error && !result.isCancelled) {
// 成功
} else {
// 失敗
}
});
}];
App Scoped User Id
Facebook Graph API v2.0から、取得できるIDが本物のIDではなくApp Scoped User Idと呼ばれるものになったが従来通りのIDと同じ使い方が可能。
https://www.facebook.com/[app_scoped_user_id]
でプロフィールにアクセス可能
リクエスト
- FBSDKGraphRequestを使うだけで、その他はほぼ同じ。
- 明確に
fields
パラメータを設定してあげないと警告が出るようになった。 - usernameを取得することは不可能。
- 友人リストは、基本的に同じアプリを利用している友人だけが取れる。
NSDictionary *param = @{@"locale":[[NSLocale currentLocale] objectForKey:NSLocaleIdentifier],
@"fields":@"id,birthday,email,name"
};
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:param];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!error) {
// 成功
} else {
// 失敗
}
});
}];
permissionの確認
- [FBSDKAccessToken currentAccessToken].permissionsを参照すればある程度はわかるが、ログイン後に権限を一部削除されてもわからない
- 例えばuser_friendsを後から削除された状態でme/friendsを実行しても空の配列が取れるだけでわからない
iOS9対応
AppTransportSecurity及びURLスキーム周りでの変更により
plistへ以下の記述を追加する必要がある。
追加していないと、普通にアプリが強制終了します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
v4.5以前のFacebookSDKを使っていた場合は、以下も追加
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
<string>fbauth</string>
<string>fbauth2</string>
<string>fb-messenger-api20140430</string>
</array>
FBSDKMessengerShareKitを使ってた場合は以下も追加
<string>fb-messenger-platform-20150128</string>
<string>fb-messenger-platform-20150218</string>
<string>fb-messenger-platform-20150305</string>
v4.6 から利用する場合には、以下だけでよい
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>