====== 페이스북 앱 개발 ====== 페이스북 앱 개발 과정 및 SDK 등에 대해 정리한다. ===== Canvas 앱 개발 ===== 페이스북 사이트에서 실행되는 앱인 canvas 앱 개발에 대해 살펴본다. ==== 준비 ==== 페이스북 앱 개발을 위해선 최소 아래의 환경이 필요하다. * HTTP POST를 지원하는 웹서버 (https 설치 권장) * public URL * 웹브라우저 웹서버에 https를 위한 인증서를 복사하고 https 접속 설정까지 하는 것이 좋다. 페이스북의 앱 URL로 들어가면 자동으로 https 사이트로 리다이렉트되기 때문이다. 만약 연결된 앱 페이지가 http 프로토콜로만 접속이 가능하다면 보안 문제로 자바스크립트 코드가 실행되지 않을 수 있다. 모든 환경이 준비되면 페이스북 개발자 페이지로 들어가 앱을 추가하고 Settings 페이지에서 Canvas 플랫폼을 추가한다. ==== Authentication ==== 먼저 index 페이지의 태그에서 페이스북 SDK 코드를 불러온다. 그리고 html 문서가 로드된 후 페이스북 SDK를 초기화한다. $( document ).ready(function() { FB.init({ appId: YOUR_APP_ID, frictionlessRequests: true, status: true, version: 'v2.0' }); FB.Event.subscribe('auth.authResponseChange', onAuthResponseChange); FB.Event.subscribe('auth.statusChange', onStatusChange); }); * [[https://developers.facebook.com/docs/javascript/reference/FB.init/v2.0|FB.init()]] * [[https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/v2.0|FB.Event.subscribe()]] FB.Event.subscribe() 함수는 이벤트와 이벤트 핸들러를 연결한다. ''FB.Event.subscribe('auth.authResponseChange', onAuthResponseChange);''는 auth.authResponseChange 이벤트가 발생하면 onAuthResponseChange() 이벤트 핸들러를 실행한다. 이벤트 핸들러는 다음과 같이 작성한다. function login(callback) { FB.login(callback); } function loginCallback(response) { console.log('loginCallback',response); if(response.status != 'connected') { top.location.href = 'https://www.facebook.com/appcenter/YOUR_APP_NAMESPACE'; } } function onStatusChange(response) { if( response.status != 'connected' ) { login(loginCallback); } else { showHome(); } } function onAuthResponseChange(response) { console.log('onAuthResponseChange', response); } * [[https://developers.facebook.com/docs/reference/javascript/FB.login/v2.0|FB.login()]] 위 코드는 아래와 같이 동작한다. - Canvas가 로드되면 유저의 인증 상태 체크 (onStatusChange) - 유저가 이전에 로그인한 적이 있으면 connected, 그렇지 않으면 not_connected - not_connected인 경우 login 함수 실행 - login 함수의 콜백함수를 통해 유저가 로그인 버튼을 클릭했는지 다시 체크 - 유저가 로그인 버튼을 클릭했다면 다시 auth.statusChange 이벤트 발생 - showHome() 함수 실행 ==== Graph API ==== Graph API는 페이스북 사용자의 각종 정보를 얻어올 수 있는 API이다. ''FB.api()'' 함수를 이용하여 Graph API를 호출할 수 있다. var friendCache = {}; function getMe(callback) { FB.api('/me', {fields: 'id,name,first_name,picture.width(120).height(120)'}, function(response){ if( !response.error ) { friendCache.me = response; callback(); } else { console.error('/me', response); } }); } 위 함수는 /me 엔드포인트를 통해 유저의 정보를 가져온다. 그리고 me 대신 페이스북 유저의 id를 넣으면 해당 유저의 정보를 가져올 수 있다. Graph API는 비동기적으로 호출됨에 유의한다. 즉, FB.api() 함수를 실행하면 파라메터의 콜백함수를 통해 Graph API가 호출된다. * [[https://developers.facebook.com/docs/graph-api|Graph API]] * [[https://developers.facebook.com/docs/javascript/reference/FB.api/|FB.api()]] **주의사항** : Graph API 호출에 대한 응답 데이터인 response가 data 변수 안에 데이터를 포함할 수도 있다. 예를 들어 /me/permission 엔드포인트로 permission 리스트를 가져오면 다음과 같은 형태의 데이터를 가져오게 된다. "data": [ { "permission": "installed", "status": "granted" }, { "permission": "public_profile", "status": "granted" }, { "permission": "user_friends", "status": "granted" } ] 페이스북의 공식 튜토리얼에는 이 부분이 틀려 permissions을 제대로 가져올 수 없었다. Graph API의 버전이 2.0으로 바뀌면서 생긴 오류인 것으로 추측. web-friend-smash-v2 예제의 FB.api() 함수 사용 부분을 참고하자. 더 좋은 것은 Graph Explorer로 데이터를 직접 확인해보는 것! ==== Permission ==== FB.login() 함수를 호출할 때 다음과 같이 permission을 요청할 수 있다. function login(callback) { FB.login(callback, {scope: 'user_friends'}); } 위 함수는 user_friends 권한을 요청한다. Permission을 추가로 얻게 되면 Graph API 호출을 통해 얻을 수 있는 정보도 더 많아진다. Graph API 호출을 통해 얻는 데이터는 개발자 페이지 - Tools - Graph Explorer 페이지에서 확인해볼 수 있다. 다음 페이지도 참고. * [[https://developers.facebook.com/docs/facebook-login/permissions/v2.0|Permissions with Facebook Login]] 특정 권한을 갖고 있는지 확인하려면 다음과 같이 한다. function hasPermission(permission) { for( var i in friendCache.permissions ) { if( friendCache.permissions[i].permission == permission && friendCache.permissions[i].status == 'granted' ) return true; } return false; } 물론 그 전에 permissions 데이터를 FB.api() 함수로 가지고 와야 한다. ==== 권한이 변경된 경우 ==== ==== 초대, 요청 ==== ==== 공유 ==== ==== 디버깅 ==== ===== 결제 ===== [[programming:facebook_dev:payment|이곳]]을 참고 ===== 테스트 ===== ===== 리뷰 ===== [[programming:facebook_dev:review|이곳]]을 참고 ===== 참고 ===== * [[https://developers.facebook.com/docs/games/canvas/canvas-tutorial|Canvas Tutorial (공식 문서)]] * [[https://developers.facebook.com/docs/games/canvas/payments-tutorial|Canvas Payments Tutoria (공식 문서)]] * [[https://github.com/fbsamples|Facebook Platform Samples]]