私は現在Social.frameworkのみを使用しており(FacebookSDKは使用していません)、基本的なユーザーデータのリクエストとアクセスを開始しています。これが私が持っているすべてのコードです(お気づきのように、いくつかのプロパティが外部で宣言されています)。適切な権限を取得するという点ではすべて正常に機能しますが、ユーザーのプロフィール写真を要求すると、次の出力エラーが発生します。
2013-01-27 21:28:44.324 TestApp[9230:1a703] Account saved to accountStore
2013-01-27 21:28:45.002 TestApp[9230:1d603] (null)
2013-01-27 21:28:45.003 TestApp[9230:1d603] Request error: The operation couldn’t be completed. (Cocoa error 3840.)
そしてここにコードがあります:
- (IBAction)btnFbLoginPressed:(id)sender
{
ACAccountType *fbAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier: ACAccountTypeIdentifierFacebook];
NSArray *permissions = @[@"email"];
self.requestAccessOptions = @{ACFacebookAppIdKey:FB_API_KEY, ACFacebookPermissionsKey:permissions, ACFacebookAudienceKey:ACFacebookAudienceOnlyMe};
[self.accountStore requestAccessToAccountsWithType:fbAccountType options:self.requestAccessOptions completion:^(BOOL granted, NSError *e) {
if (granted && e == nil) {
NSArray *readPermissions = @[@"user_photos"];
NSDictionary *readAcccessOptions = @{ACFacebookAppIdKey:FB_API_KEY, ACFacebookPermissionsKey:readPermissions, ACFacebookAudienceKey:ACFacebookAudienceOnlyMe};
[self.accountStore requestAccessToAccountsWithType:fbAccountType options:readAcccessOptions completion:^(BOOL granted, NSError *e) {
if (granted && e == nil) {
NSArray *accounts = [self.accountStore accountsWithAccountType:fbAccountType];
self.facebookAccount = [accounts lastObject];
[self.accountStore saveAccount:self.facebookAccount withCompletionHandler:^(BOOL success, NSError *error) {
if (error != nil || !success) {
NSLog(@"Error saving account to accountStore: %@", error.localizedDescription);
} else {
NSLog(@"Account saved to accountStore");
}
}];
NSString *uid = [NSString stringWithFormat:@"%@", [[self.facebookAccount valueForKey:@"properties"] valueForKey:@"uid"]];
NSString *url = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture", uid];
NSURL *profilePictureURL = [NSURL URLWithString:url];
SLRequest *profilePictureRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:profilePictureURL parameters:nil];
profilePictureRequest.account = self.facebookAccount;
[profilePictureRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *e)
{
NSDictionary *responseDataDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&e];
NSLog(@"%@", responseDataDictionary);
if (e != nil) {
NSLog(@"Request error: %@", e.localizedDescription);
} else {
}
}];
} else {
NSLog(@"Read permissions request error: %@", e.localizedDescription);
}
}];
} else {
NSLog(@"Basic permissions request error: %@", e.localizedDescription);
}
}];
}
reponseDataDictionaryがnullであり、データを解析するときに何かが発生することがわかります。同じエラーコードについてSO上の他のスレッドがいくつかあることに気づきましたが、これまでのところ運がありません。私の推測では、1)Facebookコードに問題があるか、2)データを誤って解析しています。どんな助けでもありがたいです!
注:ソーシャル/アカウントフレームワークのみを使用することに固執したいと思います。
更新:コメントの提案のおかげでわずかな変更。
変更されたコード:
[profilePictureRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *e)
{
NSLog(@"Request error value: %@", e.localizedDescription);
NSError *jsonError = nil;
NSDictionary *responseDataDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&jsonError];
NSLog(@"Response data dictionary value: %@", responseDataDictionary);
if (jsonError != nil) {
NSLog(@"Serialization error: %@", jsonError.localizedDescription);
} else {
NSLog(@"Serialization successful");
}
}];
出力:
2013-01-28 18:55:16.265 TestApp[9565:1ae03] Account saved to accountStore
2013-01-28 18:55:17.640 TestApp[9565:1b503] Request error value: (null)
2013-01-28 18:55:17.640 TestApp[9565:1b503] Response data dictionary value: (null)
2013-01-28 18:55:17.642 TestApp[9565:1b503] Serialization error: The operation couldn’t be completed. (Cocoa error 3840.)