Показать сообщение отдельно
Старый 07.11.2013, 16:25
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 10  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Как-то нужно было быстро портировать приложение на FB, особого желания разбираться с очередным глюком в трехлетней давности API на AS не было, потому на коленке сделал так:
1. Логин(в терминологии ФБ - это вход в соц.сеть + добавление приложения в список пользовательских приложений) на JS, при этом нужно было отключать автоматическую проверку статуса в FB.init, чтобы асинхронно сообщить флешке о завершении операции логина(возможно, есть какое-то решение с событиями, но все делалось в спешке, и найти что-то подходящее не удалось, да и JS у меня не числится в списке понимаемых языков):
Загрузка скриптов API:
Код:
(function(d, s, id)
{
	var js, fjs = d.getElementsByTagName(s)[0];
	if (d.getElementById(id)) 
	{
		return;
	}
	js = d.createElement(s); 
	js.id = id;
	js.src = "//connect.facebook.net/en_US/all.js";
	fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
Инициализация API:
Код:
window.fbAsyncInit = function() 
{
	FB.init({
		appId      : '',
		channelUrl : '',
		cookie : true,
		status : false,
		xfbml : false
	});
	IsFBLoaded = true;
};
В флешке по таймеру выполнялась проверка IsFBLoaded(в это время пользователь видел анимированный загрузчик), после успешной инициализации через ExternalInterface вызывался метод:
Код:
function PerformLogin()
{
	FB.getLoginStatus(function(response) 
	{
		if(response.status === 'connected')
		{
			NotifyLogin(response);
		}
		else
		{
			FB.login(function(response) 
			{
				NotifyLogin(response);
			}, {scope: 'publish_actions,publish_stream'});
		}		
	}, {scope: 'publish_actions,publish_stream'});
}
Скорее всего, это можно реализовать намного проще, но в данном случае в готовый пайплайн инициализации приложения пришлось впихивать подключение к FB, потому такое решение оказалось оптимальным так как заработало сразу .

2. Работа с API через HTTP-запросы, загрузка списка пользователей с использованием FQL:
Код AS3:
public function GetUsers(AIDs:Vector.<String>):void
{
	var vList:String = AIDs.join(',');
	var vFQL:String = 'SELECT uid, name FROM user WHERE uid IN (' + vList + ')';
	var vRequest:FBSimpleRequest = new FBSimpleRequest();
	var vData:URLVariables = new URLVariables();
	var vURL:String = 'fql?q=' + vFQL;
	vRequest.CompleteHandler = OnUsersList;
	vRequest.ErrorHandler = OnUsersError;
	vRequest.Method = URLRequestMethod.GET;
	vRequest.Data = vData;
	vRequest.Load(API + vURL);
}
Похожим способом и посты на стенку, и работа с Open Graph API была реализована(live feed у пользователя)...да и любой метод Graph API так можно реализовать, главное получить access token с нужными правами. Нужно только не забывать, что REST API использует коды ошибок HTTP и слушать HTTPStatusEvent.HTTP_STATUS загрузчика, чтобы отлавливать JSON с информацией об ошибках.
P.S. В Chrome тогда ExternalInterface работал(приложение было проверено даже на Safari под Windows %) ), как сейчас - не в курсе. Вроде есть возможность выполнить логин на серверной стороне с redirect url и последующей передачей токена, скажем, в flashvars, но тогда так и не получилось нормально это реализовать...если будут проблемы с ExternalInterface - стоит попробовать такой метод.


Последний раз редактировалось C4Grey; 07.11.2013 в 16:52.