iOS 쿠폰 시스템 구현 방법에 대한 고찰

현재 출시 되어있는 수많은 모바일 게임들을 살펴 보면 홍보를 목적으로 하는 쿠폰 시스템을 차용하고 있는것을 볼 수 있습니다. 이러한 쿠폰은 개발사에서 직접 발행한 문자/숫자로 이루어진 형태로 이루어져 있는 경우가 많으며 올아니 또는 오프라인의 실물 쿠폰을 만들어서 유저에게 뿌리고 있습니다. 가령 프렌즈팝의 경우 다음과 같은 모습의 오프라인 쿠폰이 있습니다.

ios_coupon_system_01

위의 쿠폰의 경우에는 이용방법을 읽어보면 “구글 플레이 혹은 애플 앱스토어에서” 라는 언급이 되어있습니다. 즉 이 쿠폰을 구글플레이/앱스토어에서 다운받은 프렌즈팝 게임에 사용할 수 있는다. 정도로 이해할수가 있습니다. 하지만 백발백중의 오프라인 쿠폰에는 다음과 같은 언급이 있습니다.

ios_coupon_system_02

“안드로이드 OS에서만 쿠폰을 입력할 수 있습니다”라는 부분이 중요합니다. 실제로 백발백중의 쿠폰을 사용하기 위해서 iOS판을 실행하여 설정 메뉴에 들어가 보면 다음과 같은 쿠폰 버튼이 존재하지 않습니다.

ios_coupon_system_03

iOS에서는 이 쿠폰을 사용할 수 없다는 이야기인데요 이는 단순히 개발자가 귀찮아서라는 이유는 아닐것입니다. 실제로 이렇게 쿠폰 시스템을 갖춘 게임/앱을 애플에 심사를 넣어보면 다음과 같은 리젝을 먹게 됩니다.

11.1

We found your app inappropriately unlocks or enables additional functionality with mechanisms other than the App Store, which is not in compliance with the App Store Review Guidelines.

Specifically, we noticed that the app utilizes codes to unlock features.

애플의 [리뷰 가이드라인]을 확인해 보면 11.1 항목에 다음과 같은 내용이 있습니다.

11. Purchasing and currencies

11.1
Apps that unlock or enable additional features or functionality with mechanisms other than the App Store will be rejected

앱스토어 이외의 어떤 매커니즘을 통해서 어떤 추가적인 기능이 언락되거나 활성화된다면 리젝될것이다..라는 무서운 언급인데요. 내가 만든 앱이지만 내 맘대로 하지도 못하게 하는 애플입니다. 결과적으로 앱스토어가 제공하는 기능들(예: In-App Purchase 등)을 제외한 모든 형태의 개발자가 개인적으로 구현한 유저에게 이익을 주는 행위는 리젝 사유입니다.

결론적으로 개발사가 임의로 구현한 쿠폰 시스템(예: 쿠폰 번호를 입력하면 다이아 500개 지급)은 애플에서 허용하지 않습니다. 하지만 iOS용 게임임에도 불구하고 쿠폰 시스템을 사용할 수 있는 게임을 볼 수 있습니다. 지금 부터 그런것을 어떻게 구현하면 될지 더 나아가 좀 더 나은 방법은 없을지 정리해 보겠습니다.

방법1. 서버에서 쿠폰 메뉴를 보여줄지 말지 결정하기

아마 이 방법이 많은 게임사들이 iOS에서 쿠폰 시스템을 구현하기 위해서 사용하는 방법이 아닐까 생각합니다. 게임뿐만 아니라 많은 앱들이 애플의 심사를 통과하는데 불필요한 화면들을 심사 기간동안 감추는 방법을 사용하고 있으며 나중에라도 애플이 걸리게 되면 좋은 일은 없겠지만 그럼에도 불구하고 많이들 사용하고 있는 방법입니다.

이 방법은 서버상에서 “심사” 플래그를 두고, 클라이언트는 실행되는 시점에 이 심사 플래그 값을 서버로부터 읽어갑니다. 심사 플래그가 참일 경우 클라이언트는 심사에 불리한 모든 기능을 보여주지 않는식으로 동작을 하게 합니다.

이후에 “Ready for Sale” 로 상태를 변경하면서 심사 플래그를 거짓으로 변경하면 일반 유저들은 온전히 모든 컨텐츠를 즐길 수 있게 됩니다.

방법2. 커스텀 스킴을 통해 앱 외부에서 쿠폰 정보를 넘겨받기

해외의 포럼글을 읽다가 매우 그럴싸한 글을 하나 발견하였습니다. 위에 언급한 서버에서 플래그를 두어서 쿠폰 메뉴를 보였다가 감추었다가 하는 방식은 애플의 불시 검문에 발각될(?) 가능성이 있습니다. 하지만 이러한 플래그를 두지 않고 앱 바깥에서 쿠폰지급을 처리한다면 문제가 다릅니다. 앱 내부에 쿠폰을 지급처리하는 어떠한 메뉴나 기능의 요소가 존재하지 않으며 바깥에서 지급처리를 하게 됨으로 애플의 불시 앱 검문에서도 문제가 되지 않습니다.

하지만 여기서도 생각해볼 문제가 하나 있습니다. 검증된 유저에게 한번의 지급만을 해야 한다면, 앱 외부에서 어떻게 해당 유저의 인증 여부를 명확하게 판단할 수 있을까요? 대부분의 인증 시스템의 구현은 앱 내부에서 구현되어있습니다. 하지만 이 부분은 앱 외부에서 쿠폰 정보를 들고 게임으로 넘어가는 방법으로 구현할 수 있습니다.

  1. 먼저 쿠폰 입력이 가능한 프로모션 페이지를 개발합니다. 이곳에는 일반적으로 게임 내부에서 볼 수 있는 쿠폰을 입력할 수 있는 폼이 존재하게 됩니다.
  2. 유저에게 전달될 쿠폰에 “구글플레이/앱스토어에서 XXX 게임을 검색해서 설치 후 설정 – 쿠폰 메뉴에서 다음의 코드를 입력” 이 문구 대신에 단순히 프로모션 페이지 URL에 접속하여 사용하라고만 안내합니다.
  3. 유저가 쿠폰입력 사이트에 접속하여 쿠폰을 입력한 뒤 “확인” 버튼을 누르면 앱이 설치되어있다면 해당 쿠폰 정보를 들고 앱을 실행하고 앱이 설치되어있지 않다면 앱 다운로드 URL로 이동시킵니다.
  4. 앱이 실행될 때 쿠폰 정보가 커스텀 스킴을 통해 입력되었다면 곧바로 지급 처리를 하고 팝업을 띄워 정상적으로 쿠폰 지급이 되었음을 알립니다.

대충 서버에서 쿠폰 페이지를 만든다면 예제는 다음과 같은 형태를 가질 것입니다.

그리고 iOS의 경우 커스텀 스킴에서 저렇게 넘겨 받은 coupon의 값을 읽어서 아이템 지급 처리에 사용합니다. 다음의 메소드는 AppDelegate.m 파일에 추가해야할 부분입니다.

이곳의 처리는 앱 내부에서 진입하여 처리되는 부분이 아니며 앱의 외부를 통해 접근할 때 실행되는 로직의 영역입니다. 하지만 앱 내부이기 때문에 기 로그인되어있는 유저의 정보에도 접근이 가능합니다. 즉 “쿠폰정보”와 “사용자 정보” 둘 모두가 있기 때문에 정상적으로 상품 지급의 처리를 할 수 있습니다. 물론 중복 처리를 막는 처리도 할 수 있겠지요.

참고 :

  • https://forums.coronalabs.com/topic/37264-rejected-by-apple-cause-of-promo-code-custom-solution/
  • https://forums.coronalabs.com/topic/37264-rejected-by-apple-cause-of-promo-code-custom-solution/

2015년에 변경된 페이스북 메신저 API 개요

Facebook-Developers-Logo

예전부터 페이스북 API중에 Chat API가 있었습니다. 카카오톡의 게임 홍보 메시지처럼 페이스북 내에 있는 메신져 플랫폼에 메시지를 발송할 수 있는 API였는데요. 기존에 사용 빈도가 적었던것인지 사용에 특별한 제약 사항이 없는 자유롭게 사용할 수 있는 API였습니다. 심지어 Graph API를 이용해서 서버상에서 호출하는것도 가능했었습니다. 하지만 언제부터인가 기존의 Chat API가 Deprecated 되었습니다.

facebook_messenser_api_overview_01

2014년 4월 30일에 기존의 XMPP기반의 채팅 API가 Deprecate 될것임을 공지하였었고 2015년 4월 30일에 더이상 이 API들을 사용할 수 없게 되었습니다. 기존에 제공되었던 API를 사용하여 활용할 수 있는 기능은 다음과 같았습니다.

  • addUserToGroup : 특정 유저를 그룹 채팅에 추가합니다.
  • changeArchivedStatus : 채팅을 보관 상태로 변경. 채팅 목록에서 즉시 사라지며 보관함에 들어갑니다.
  • deleteMessage : 이미 발송된 메시지를 삭제합니다.
  • deleteThread : 채팅을 삭제합니다.
  • getCurrentUserID : 현재 로그인되어있는 유저의 페이스북 ID를 가져옵니다.
  • getFriendsList : 친구의 페이스북 계정 정보를 가져옵니다. 이름, 성별, 프로필사진, 생일여부등을 알 수 있습니다.
  • getOnlineUsers : 친구들의 온라인 상태 정보를 가져옵니다. 오프라인, 유휴상태, 온라인, 모바일사용중으로 분류됩니다.
  • getThreadHistory : 현재 채팅의 히소토리를 가져옵니다.
  • getThreadList : 채팅 목록을 가져옵니다.
  • getUserID : 페이스북상의 이름으로 ID를 가져옵니다.
  • getUserInfo : 페이스북 ID로 계정의 정보를 가져옵니다.
  • markAsRead : 특정 채팅의 내용을 모두 읽은것으로 지정합니다.
  • removeUserFromGroup : 그룹에서 유저를 제거합니다.
  • searchForThread : 채팅방의 이름을 검색합니다.
  • sendMessage : 메시지를 발송합니다. 텍스트, 스티커ID, 파일/이미지, URL을 포함할 수 있습니다.
  • sendTypingIndicator : “유저가 글을 작성중입니다”라는 상태 메시지를 상대측에 보여줍니다.
  • setTitle : 그룹 채팅의 방 이름을 설정합니다.

그리고 2015년 3월 25일에 새로운 메신저 플랫폼이 발표되었습니다. 결과적으로 기존의 XMPP 버전의 API들과는 차원이 다르게 기능이 축소되었습니다. 아마도 친구들의 정보라던지 온라인 상태를 가져다 쓸 수 있다는 점을 문제로 생각한게 아닐까 생각됩니다. 페이스북 자체의 새로운 메신저 플랫폼에 대해서 밀어붙이던 시기이기도 했고요. 아무래도 기존에는 메신저 기능을 페이스북의 +@ 기능정도로 생각하다가 좀 더 적극적인 방향으로 생각해보기로 하면서 방향을 폐쇄적으로 변경한것인지도 모르겠습니다. 다음은 페이스북의 메신져 플랫폼에 대한 소개글을 번역한 내용입니다.

Messenger Platform

메신저 플랫폼은 개발자들이 개발중인 앱에 메신저를 통합하는 과정을 좀 더 쉽게 해줍니다. 그렇게 함으로 써 메신저를 사용하는 6억이 넘는 사용자들이 GIF, 사진, 비디오, 음성메시지 등등을 활용하여 새롭고 재미있게 그들을 표현할 수 있는 방법을 찾을 수 있을 것입니다. 이 메신저 플랫폼을 사용하면 앱의 컨텐츠들은 개인 혹은 그룹 메시지들이 창의적이고 표현적인 대화가 이루어질 수 있도록 해줄것입니다. 또한 개발자들에게 성장과 재참여를 할 갖게할 기회를 제공할 것입니다.

메신저 플랫폼의 앱은 메신저를 통해 유저로 하여금 앱을 설치하도록 유도하거나 앱의 컨텐츠를 사용하여 답장을 할 수 있게 해줍니다. 만약 메시지를 받은 유저가 앱이 설치되어있지 않아서 바로 답장을 할 수 없는 상황이라면 메신저를 앱스토어로 이동시켜 바로 설치를 할 수 있도록 유도할 것입니다. 이 과정은 유저가 친구들과의 대화를 통해서 자연스럽게 새로운 앱을 추천받게 되는 과정이 될 것입니다.

facebook_messenser_api_overview_02

메신저 플랫폼을 이용하여 개발자는 앱의 사용율을 높일 수 있습니다. 만약 메시지를 받은 유저가 이미 그 앱을 설치한 상태라면 그들은 바로 메시지의 이미지에 함께 표시되는 답장(Reply) 버튼을 누를 수 있습니다. 그러면 바로 해당 앱을 실행시켜 결과를 가지고 메신저에 바로 공유할 수 있습니다.

facebook_messenser_api_overview_03

기본적인 이미지, 동영상, 텍스트를 전송하는것을 Basic 메시지라고 부르고 이렇게 설치나, 답장을 유도할 수 있는 메시지를 Optimized 메시지라고 부릅니다. 이 Optimized 메시지를 사용하기 위해서는 몇가지 제약 사항이 있습니다.

  • 컨텐츠 공유하기를 하였을 때 선택가능한 공유 선택지중에 페이스북 메신저가 가장 첫번째로 떠야 합니다. 유저 경험 차원이라는데 그냥 페이스북의 욕심이겠죠^^;
  • 페이스북이 제공하는 통계분석툴(Analytics)를 반드시 붙여야 합니다. 이것을 붙임으로써 각종 통계를 볼 수 있게 된다고 합니다. 근데 강제 하는 이유는 페이스북도 궁금해서겠지요^^?
  • 이러한 기능을 사용하기 위해서는 페이스북에 앱 심사를 거쳐야 합니다. 이때에 당신의 앱은 앱스토어에 이미 출시되어있어야 합니다.

facebook_messenser_api_overview_06

몇몇 앱의 메신저 통합된 사례는 메신저의 대화상의 새로운 탭을 통해서 바로 연결되는 홍보 기회를 가질 수 있습니다. 이 메뉴를 통해 이미 설치된 앱을 바로 실행할 수 있는 바로가기로 사용될 수 있고 새로운 유저가 시도해 볼 수 있는 기회를 얻을 수 도 있습니다.

Business on Messenger

메신저 플랫폼 이외에는 어떻게 사람들과 기업간의 커뮤니케이션을 개선시킬 수 있을까를 목적으로 만들어진 메신저 비지니스 플랫폼도 있습니다. 이 메신저 비지니스 플랫폼은 다음과 같은것을 가능케 합니다. 유저가 어떤 기업의 사이트에서 물건을 구매하는 과정에서 유저는 기업과 대화를 시작하게 됩니다. 구매가 확정되었는지 배송 상태는 어떻게 되는지 메신저를 통해 받을 수 있으며, 특정 폼 없이 자유로운 양식으로 기업에게 질문을 하고 빠른 답장을 받을 수 있습니다.

facebook_messenser_api_overview_07

facebook_messenser_api_overview_08

현재 Everlane, Zulily, Zendesk 등의 기업에서 적용하여 경험을 실시간 채팅 경험을 만들어 나가고 있습니다. 더 자세한 내용은 [이곳]을 참고하시기 바랍니다.

참고 : https://developers.facebook.com/docs/messenger/overview