Gigya для iPhone
Gigya — это сервис, который берет на себя работу по авторизации пользователя. Список провайдеров в том виде, в каком он используется потом в API: facebook, twitter, yahoo, messenger, google, linkedin, myspace, aol,orkut, blogger, wordpress, typepad, Paypal, livejournal, hyves, verisign, openid, netlog, signon, orangefrance, mixi, livedoor. В списке нет ВКонтакте. Думаю, это объясняется тем, что Gigya — американский сервис, их команда находится в Маунтин-Вью, штат Калифорния. И до наших Палестин они пока не добрались (наша земля богата Логинзой).
Gigya вытаскивает порядочное количество данных. Но не все. Скажем, от Twitter нельзя получить адрес электронной почты пользователя и его день рождения. Сводную таблицу возможностей можно посмотреть в документации.
Для iPhone и Android имеется свой SDK. Сначала следует скачать архив. В архиве все необходимые файлы для работы: классы для работы с Gigya и отдельно для работы с JSON, которая представлена здесь известным фреймворком SBJSON.
Для теста, пожалуй, будет проще создать проект с готовым View. После добавления файлов GSSDK к проекту нужно сделать #import "GSAPI.h". Указатель GSAPI *gsAPI разместим в интерфейсе созданного View. Выделение памяти и инициализацию — во viewDidLoad:
gsAPI = [[GSAPI alloc] initWithAPIKey:@"API KEY" viewController:self];
Откуда взять API KEY? Нужно зарегистрироваться на сайте Gigya. Процесс создания аккаунта традиционный. После регистрации можно будет привязать к аккаунту несколько сайтов. В списке сайтов есть API KEY. У меня он начинался с «2_». Нужен этот ключ, а не Secret Key, который указан снизу. Никаких преобразований для API KEY не требуется. Можно заметить, что справа от API KEY есть список сервисов для сайта. Причем зеленым отмечен только OpenID. Это не значит, что остальные недоступны. Это нужно, чтобы при входе через них высвечивалось, что авторизацию запрашивает не Gigya, а ваше приложение, которое, понятно, в этом случае придется отдельно регистрировать. Так что можно оставить все это как есть.
Не спешите закрывать аккаунт. В настройках сайта внизу найдите секцию Advanced. Она никак не выделена. Развертите ее и отметьте Enable Mobile or Desktop client applications API access. Без этого ваше приложение будет возвращать ошибку "400011 Invalid redirect_uri". Да и то, если вы отловите ее в событии gsLoginUIDidFail. Теперь все. Можно возвращаться в XCode (или CIDR). Интерфейс выглядит примерно так:
#import#import "GSAPI.h" @interface GigyaViewController : UIViewController { GSAPI *gsAPI; IBOutletUIButton *loginButton; } - (IBAction)loginWithGigya; @end
Добавлен протокол GSLoginUIDelegate. И еще кнопка с ее обработчиком. Соответственно, в Interface Builder установлены все связи. Во viewDidLoad, как мы помним, инициализация API:
gsAPI = [[GSAPIalloc] initWithAPIKey:@"API KEY" viewController:self];
Важно, чтобы этот объект был в единственном экземпляре. Теперь добавим реализацию двух методов протокола GSLoginUIDelegate и обработчик кнопки, который будет вызывать список провайдеров.
- (void)gsLoginUIDidFail:(int)errorCode errorMessage:(NSString *)errorMessage context:(id)context { NSLog(@"gsLoginUIDidFail: %i %@", errorCode, errorMessage); } - (void)gsLoginUIDidLogin:(NSString*)provider user:(GSDictionary*)user context:(id)context { NSLog(@"gsLoginUIDidLogin: provider=%@ user=%@ context=%@",provider,[user stringValue],context); } - (IBAction)loginWithGigya { GSDictionary *d = [[[GSDictionaryalloc] init] autorelease]; [d putStringValue:@"facebook, twitter"forKey:@"enabledProviders"]; [gsAPIshowLoginUI:d delegate:self context:nil]; }
Словарь можно и не создавать, передав nil. Это сделано для наглядности. В списке останутся только Facebook и Twitter. После запуска и клика на кнопку будет показан список провайдеров. Выбор элемента влечет авторизацию. Потом осуществляется возврат на экран с кнопкой. В консоли должна появится информация о текущем входе и пользователе.
Несколько моментов напоследок. Если вдруг вы решили поместить инициализацию и вызов showLoginUI подряд во viewDidLoad, скорее всего, у вас ничего не запустится, экран автоматически не сменится на экран выбора провайдера. Можно выставить performSelector с задержкой в 0.01, все должно сработать. Видимо, дело в анимации. Еще в файле GSWebViewController.m можно сделать #define _DEBUG, тогда в консоль будет выводится информация о промежуточных шагах. Это все. Удачи.
Исходные тексты проекта, zip-архив 1.1 Мб
Комментарии
arkichek
У меня ошибка void value not ignored вылетает в классе GSWebViewController в методе facebookLoginActivated. Это из-за чего?
Александр Черный
Предположу, что есть функция с типом возвращаемого значения void, которая вызывается в конструкции с if. Это, понятно, невозможно.
arkichek
Я вот нашел такое:
#ifdef GIGYA_APP
- (BOOL)authorize:(NSString *)application_id
permissions:(NSArray *)permissions
delegate:(id)delegate {
#else
- (void)authorize:(NSString *)application_id
permissions:(NSArray *)permissions
delegate:(id)delegate {
#endif
а GIGYA_APP нигде не определен
arkichek
Прикрепите пожалуйста к посту архивчик с рабочим примером
Александр Черный
Я не нашел у себя в проекте строчку #ifdef GIGYA_APP. Глядя на приведенный код нельзя точно сказать, нужный он или нет. Исходник проекта я приложил. Имейте в виду, что там мой ключ. Замените на свой.
arkichek
хм, у меня с самого сайта gigya почему-то архив скачался с классами facebook sdk и вот там как раз эти строки…
Александр Черный
Скачал. Да, есть такие файлы и такая ошибка. Природа ошибки определена верно. Есть попытка вернуть void из функции, которая должна возвращать BOOL. Переходим на определение функции и видим, что она определяется по-разному, в зависимости от константы GIGYA_APP. Ищем константу. Убеждаемся, что она есть только в Facebook.h и Facebook.m, отлично. У нас приложение с Gigya? Тогда просто #define GIGYA_APP в Facebook.h и все. Наверное, где-то в документации есть указание, что так нужно сделать. Если его нет — тоже может быть. В API встречаются ошибки.
arkichek
Спасибо за ответы