Извлечение основной информации (id, first_name) из Facebook с помощью Social Framework - приложен исходный код и скриншоты
Для более поздней игры в слова я пытаюсь получить основную информацию об игроке, используя социальную среду:
- Я бы
- имя
- Пол
- место нахождения
(т.е. ничего чувствительного, как email
и я не использую Facebook iOS SDK).
Поэтому в Xcode 5.0.2 я создаю пустое приложение для iPhone с одним представлением и добавляю Social.framework
на вкладку этапов сборки.
Затем я добавляю следующий код в ViewController.m:
#import "ViewController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h>
#define FB_APP_ID @"432298283565593"
//#define FB_APP_ID @"262571703638"
@interface ViewController ()
@property (strong, nonatomic) ACAccountStore *accountStore;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Facebook is available: %d", [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]);
[self getMyDetails];
}
- (void) getMyDetails {
if (!_accountStore) {
_accountStore = [[ACAccountStore alloc] init];
}
ACAccountType *facebookAccountType = [_accountStore
accountTypeWithAccountTypeIdentifier: ACAccountTypeIdentifierFacebook];
NSDictionary *options = @{
ACFacebookAppIdKey: FB_APP_ID,
ACFacebookPermissionsKey: @[@"basic_info"]};
[_accountStore requestAccessToAccountsWithType:facebookAccountType
options:options
completion:^(BOOL granted, NSError *error)
{
if (granted) {
NSLog(@"Basic access granted");
} else {
NSLog(@"Basic access denied %@", error);
}
}];
}
@end
И создать новое приложение Facebook, для которого я указываю de.afarber.MyFacebook
в качестве идентификатора пакета iOS:
Наконец, в Apple iTunes Connect я создаю новый идентификатор приложения, а затем новое приложение (с фиктивным значком и даже двумя скриншотами с iPhone):
Моя вкладка Xcode Info и остальная часть исходного кода остаются неизменными:
ОБНОВЛЕНИЕ 2:
Я обновил исходный код в соответствии с полезными комментариями, спасибо.
Кроме того, у меня есть еще одна игра на Facebook, которая хорошо работает (с 1-2 года) для настольных и мобильных приложений Adobe AIR (но сейчас я пытаюсь изучить нативное программирование на iOS), и я попробовала ее идентификатор 262571703638
безуспешно.
И я добавил FacebookAppID
в MyFacebook-Info.plist
в соответствии с предложением Mohit10 (мне кажется, что он нужен только для Facebook SDK, хотя я пытаюсь использовать Social Framework - но это не повредит...)
Теперь я получаю вывод отладчика:
2013-12-31 11:08:07.584 MyFacebook[3009:70b] Facebook is available: 1
2013-12-31 11:08:07.964 MyFacebook[3009:3903] Basic access granted
Мне просто нужно выяснить, как получить идентификатор, имя, пол, местоположение сейчас (и если basic_info
действительно нужно для этого)...
4 ответа
Есть несколько вещей не так с вашим кодом.
ACAccountStore *accountStore
выходит из области видимости, это должна быть переменная экземпляра.- Вам не нужно
ACFacebookAudienceKey
, это для публикации. - Вам не нужно
ACFacebookPermissionsKey
необходимые свойства доступны по умолчанию
С этими исправлениями ваш код все еще не работает для меня, хотя он работает для моего идентификатора приложения. Я получаю следующую ошибку:
"The Facebook server could not fulfill this access request: Invalid application 432298283565593" UserInfo=0x1d5ab670 {NSLocalizedDescription=The Facebook server could not fulfill this access request: Invalid application 432298283565593}
Похоже, что-то не так с настройкой Facebook вашего приложения.
Единственное отличие, которое я вижу, состоит в том, что мое приложение находится в изолированной программной среде, и я вошел в систему, используя мою учетную запись разработчика. Удачи.
Благодаря полезным комментариям (спасибо) я наконец-то смог получить некоторую информацию с помощью следующего кода:
#import "ViewController.h"
#import <Social/Social.h>
#import <Accounts/Accounts.h>
#define FB_APP_ID @"432298283565593"
//#define FB_APP_ID @"262571703638"
@interface ViewController ()
@property (strong, nonatomic) ACAccount *facebookAccount;
@property (strong, nonatomic) ACAccountType *facebookAccountType;
@property (strong, nonatomic) ACAccountStore *accountStore;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
if (NO == [SLComposeViewController isAvailableForServiceType: SLServiceTypeFacebook]) {
[self showAlert:@"There are no Facebook accounts configured. Please add or create a Facebook account in Settings."];
return;
}
[self getMyDetails];
}
- (void) getMyDetails {
if (! _accountStore) {
_accountStore = [[ACAccountStore alloc] init];
}
if (! _facebookAccountType) {
_facebookAccountType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
}
NSDictionary *options = @{ ACFacebookAppIdKey: FB_APP_ID };
[_accountStore requestAccessToAccountsWithType: _facebookAccountType
options: options
completion: ^(BOOL granted, NSError *error) {
if (granted) {
NSArray *accounts = [_accountStore accountsWithAccountType:_facebookAccountType];
_facebookAccount = [accounts lastObject];
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:url
parameters:nil];
request.account = _facebookAccount;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData
options:NSJSONReadingMutableContainers
error:nil];
NSLog(@"id: %@", responseDictionary[@"id"]);
NSLog(@"first_name: %@", responseDictionary[@"first_name"]);
NSLog(@"last_name: %@", responseDictionary[@"last_name"]);
NSLog(@"gender: %@", responseDictionary[@"gender"]);
NSLog(@"city: %@", responseDictionary[@"location"][@"name"]);
}];
} else {
[self showAlert:@"Facebook access for this app has been denied. Please edit Facebook permissions in Settings."];
}
}];
}
- (void) showAlert:(NSString*) msg {
dispatch_async(dispatch_get_main_queue(), ^(void) {
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"WARNING"
message:msg
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
});
}
@end
Это печатает мои данные:
id: 597287941
first_name: Alexander
last_name: Farber
gender: male
city: Bochum, Germany
Если у вас есть какие-либо предложения по улучшению, добро пожаловать.
Поскольку вы не внесли никаких изменений в свой файл.plist, вам необходимо добавить свой FacebookAppID в свой файл.plist. Исходя из этого, я думаю, что вам будет полезно получить информацию о пользователе, и вы сможете также интегрировать ее из своих настроек.
Ответ прост
во viewDidLoad() используйте:
accountStore= [[ACAccountStore alloc]init];
facebookAccountType= [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options= @{
ACFacebookAudienceKey: ACFacebookAudienceEveryone,
ACFacebookAppIdKey: @"<YOUR FACEBOOK APP ID>",
ACFacebookPermissionsKey: @[@"public_profile"]
};
[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) {
if (granted) {
NSLog(@"Permission has been granted to the app");
NSArray *accounts= [accountStore accountsWithAccountType:facebookAccountType];
facebookAccount= [accounts firstObject];
[self performSelectorOnMainThread:@selector(facebookProfile) withObject:nil waitUntilDone:NO];
} else {
NSLog(@"Permission denied to the app");
}
}];
///// А функция -(пусто) facebookProfile {
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];
////// Обратите внимание, что нужные вам параметры добавляются в виде словаря /// Полный список приведен ниже //// https://developers.facebook.com/docs/graph-api/reference/user
NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:@"picture,id,name",@"fields", nil];
SLRequest *profileInfoRequest= [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:param];
profileInfoRequest.account= facebookAccount;
[profileInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"Facebook status code is : %ld", (long)[urlResponse statusCode]);
if ([urlResponse statusCode]==200) {
NSDictionary *dictionaryData= [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];
} else {
}
}];
}