Выяснение клиентов Facebook iFrame - PullRequest
0 голосов
/ 25 февраля 2012

Я нахожусь в процессе создания приложения для Facebook, которое работает через iFrame с Ruby On Rails.

Мое приложение обслуживает несколько клиентов, веб, мобильные и Facebook. И в зависимости от типа клиента пользовательский интерфейс отображает различные виды представлений.

Когда пользователь подключается к моему приложению с помощью вкладки страницы Facebook, я получаю достаточно информации (в сборе параметров), чтобы идентифицировать пользователя, пришедшего с Facebook. Исходя из этого, я могу настроить вид в соответствии с iFrame.

Но для последующих запросов, поскольку они происходят через iframe, ничто не говорит о том, что это запрос facebook (насколько я могу судить, если в заголовках нет чего-то, о чем я не знаю).

Я попытался установить cookie во время первого запроса, и это сработало отлично. Но проблема в том, что когда пользователь запрашивал мое приложение непосредственно из другой вкладки браузера (не через Facebook), cookie все еще присутствовал, и пользователь в конечном итоге увидел пользовательский интерфейс facebook (ised) вместо обычного пользовательского интерфейса.

У кого-нибудь есть решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Я рекомендую использовать другой маршрут для вкладок Facebook.Поэтому, если ваши обычные URL-адреса выглядят так:

/foobar

Тогда вы можете использовать что-то подобное для Facebook, добавив префикс "/ fb" (или аналогичный) на вкладку вашего приложения Facebook или URL-адрес холста:

/fb/foobar

В вашем rout.rb вы можете затем передать параметр, указывающий, что пользователь просматривает страницу в Facebook, например, "channel = facebook" или "facebook = true".

Ваш route.rb может выглядеть примерно так:

scope 'fb', :channel => 'facebook' do
    # ... your routes ...
end

scope :channel => 'web' do
    # ... your routes ...
end

При использовании этих маршрутов каждый запрос, исходящий из Facebook, автоматически будет иметь параметр "channel = facebook".Конечно, вы все равно будете нести ответственность за создание соответствующих URL-адресов в своем приложении.Вы можете добавить :as => 'facebook' и :as => web к областям выше и использовать это для генерации URL с помощью выделенных помощников (например, facebook_foobar_url, web_foobar_url).Но лучший способ сделать это во многом зависит от сложности вашего приложения.

В качестве альтернативы, вы также можете использовать default_url_options в вашем контроллере для добавления параметра "channel = facebook" или "facebook = true"на каждый сгенерированный URL, если вы обнаружите, что текущий запрос исходил от Facebook (либо от наличия подписанного подписи, либо от добавленного вами параметра channel / facebook).Обратите внимание, что этот метод устарел в Rails 3, и я не совсем уверен, какая (если таковая имеется) официальная замена в Rails 3.1 или 3.2.

0 голосов
/ 09 марта 2012

Мне нужно было решить это с наименьшим количеством вторжения в существующий код. И я публикую здесь свое решение для тех, кто хочет решить подобную проблему.

У меня есть уникальный макет для facebook, и он был вызван во время первого запроса (как я уже упоминал выше, первоначальный запрос, размещенный на вкладке facebook, содержит параметры facebook). Чтобы убедиться, что для последующих запросов был параметр facebook, в макете facebook я связал все события отправки формы и привязки якоря с методом, который добавил бы скрытый элемент формы и параметр строки запроса соответственно.

так выглядит код на стороне клиента:

<script type="text/javascript">
  $(document).ready(function() {
    $('form').submit(function(e) {


        $('<input>').attr({
    type: 'hidden',
    id: 'fb_param',
    name: 'fb_param',
    value: 'true'
}).appendTo($(this));

     return true;
    });
    $('a').click(function(e) {          
        var newUrl = $(this).attr("href");
        if (newUrl.indexOf("?") != -1) {
            newUrl = newUrl + '&fb_param=true';
        } else {
            newUrl = newUrl + '?fb_param=true';                
        }
        $(this).attr("href", newUrl);
     return true;
    });
  });
  </script>

Теперь для обработки перенаправлений на стороне сервера (обычно при обновлении ресурса и т. Д.) Необходимо расширить метод redirect_to следующим образом:

/ приложение / conntrollers / application_controller.rb

class ApplicationController < ActionController::Base

  def redirect_to(options = {}, response_status = {})
    if params[:fb_param] == 'true'  
      if options
        if options.is_a?(Hash)
          options["fb_param"] = "true"
        else
          if options.include? "?" 
            options = "#{options}&fb_param=true"
          else
            options = "#{options}?fb_param=true"
          end 
        end
      end 
    end

    super 

  end

end
...