0

Ruby On Rails로 iFrame을 통해 작동하는 facebook 앱을 제작 중입니다.facebook iFrame 클라이언트 알아보기

내 앱은 여러 클라이언트, 웹, 모바일 및 Facebook에 서비스를 제공합니다. 그리고 클라이언트의 유형에 따라 UI는 다른 종류의보기를 렌더링합니다.

사용자가 Facebook 페이지 탭을 사용하여 내 앱에 연결하면 페이스 북에서 온 사용자를 식별 할 수있는 충분한 정보 (params 컬렉션)를 얻게됩니다. 이를 바탕으로 iFrame에 맞게보기를 사용자 정의 할 수 있습니다.

그러나 iframe을 통해 발생하기 때문에 후속 요청의 경우 페이드북 요청임을 알리는 내용은 없습니다 (내가 알지 못하는 헤더에 뭔가가 없으면 알 수 있습니다).

첫 번째 요청을하는 동안 쿠키를 설정해 보았는데 효과적이었습니다. 그러나 문제는 사용자가 다른 브라우저 탭 (페이스 북을 통하지 않고)에서 직접 내 앱을 요청했을 때 쿠키가 여전히 존재하고 사용자가 일반 UI 대신 facebook (ised) UI를 보게되는 경우입니다.

누구든지 해결책을 가지고 있습니까?

답변

0

기존 코드에 대한 침입을 최소화하면서이 문제를 해결해야했습니다. 비슷한 문제를 해결하고자하는 사람들을 위해 내 솔루션을 게시하고 있습니다.

나는 페이스 북을위한 독특한 레이아웃을 가지고 있는데, 이는 위에서 언급 한 것처럼 (페이스 북 탭에서 올린 초기 요청은 페이스 북 매개 변수를 가지고있다.). 후속 요청에 대한 페이스북 매개 변수가 있는지 확인하기 위해 페이스 북 레이아웃 내에서 숨겨진 양식 요소와 쿼리 문자열 매개 변수를 각각 추가하는 메소드로 모든 양식 제출 및 앵커 클릭 이벤트를 바인딩했습니다.

: 그래서 같은 redirect_to 방법을 확장하기 위해 필요한, (당신이 등 리소스를 업데이트 할 때 일반)

<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> 

이제 서버 쪽 리디렉션 처리 :

이 클라이언트 측 코드가 같은 모습입니다

/app/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 
1

Facebook 탭에 다른 경로를 사용하는 것이 좋습니다. 일반 URL은 다음과 같이한다면 :

/foobar 

은 그럼 당신은 페이스 북에 대한 당신의 페이스 북의 앱 탭이나 캔버스 URL에 (또는 유사) "/ FB"접두사를 추가하여이 같은 것을 사용할 수 있습니다 :

/fb/foobar 

routes.rb에서 매개 변수를 전달하면 사용자가 "channel = facebook"또는 "facebook = true"와 같이 Facebook에서 페이지를보고 있음을 나타낼 수 있습니다.

당신의 routes.rb는 다음과 같이 보일 수 있습니다 : 노선으로

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

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

는 페이스 북에서 발생하는 각 요청은 자동으로 "채널 = 페이스 북의"매개 변수를해야합니다. 물론 앱 내에서 적절한 URL을 생성해야 할 책임이 있습니다. 위의 범위에 :as => 'facebook':as => web을 추가하고이를 사용하여 전용 도우미 (예 : facebook_foobar_url, web_foobar_url)를 사용하여 URL을 생성 할 수 있습니다. 하지만 이렇게하는 가장 좋은 방법은 앱의 복잡성에 달려 있습니다.

또는 컨트롤러에서 default_url_options을 사용하여 현재 요청이 Facebook에서 비롯된 것으로 감지되면 컨트롤러에 "channel = facebook"또는 "facebook = true"매개 변수를 추가 할 수 있습니다. signed_request 또는 추가 한 채널/facebook 매개 변수). 이 메소드는 Rails 3에서 더 이상 사용되지 않으며, Rails 3.1 또는 3.2에서 공식 교체가 무엇인지 (있는 경우) 확실치 않습니다.

+0

감사 답변에 대한 . 나는 실제 구현에 대해 혼란스럽지 않다. 모든 요청에는 facebook = true param이 포함되어야합니까? – thanikkal

+0

수동으로이 param을 추가하는 것은 다른 옵션 일지라도 내가 염두에 두었던 것이 아닙니다. 필자는 원래 제안에 대한 세부 정보를 추가하고 해당 매개 변수와 관련된 대안을 게시하도록 게시했습니다. –

+0

미르코, 나는 조금씩 다르게 끝내었다. 자세한 내용은 아래를 참조하십시오. +1하고 제안 해 주셔서 감사합니다. 유사한 문제를 해결하려는 사람을 도울 수 있습니다. 감사! – thanikkal