안녕하세요. Bucket Place의 모바일 개발자 Cloud Travel입니다. 오늘은 체계적으로 글을 써보려고 합니다.
오늘은 Amazon에서 제공해주는 Mobile Push 기능인 SNS에 대해서 알아보도록 합시다.
* SNS란 무엇인가?
SNS는 Simple Notification Service의 약자로 Amazon에서 제공해주는 모바일 푸쉬 서버입니다. SNS는 플랫폼 마다 나뉘어져 있는
예를 들어 GCM(Google Cloud Messaging), APNS(Apple Push Notification Service), ADM(Amazon Device Messaging)
등의 Mobile Push Service를 통합해준 Middleware라고 할수 있습니다. 정확히 말하면 각 플랫폼의 Push Service 앞단에서 하나로
묶어주는 역할을 한다고 볼 수 있습니다. 또한, 메세지 도달율을 보장을 해주기 때문에 사용율이 늘고 있는 추세입니다.
* SNS를 위한 준비물
1. AWS 계정을 하나 만들도록 합시다.
- http://aws.amazon.com/ko/ 사이트에 접속하여 계정을 하나 생성하도록 합시다.
- 계정 생성시에는 신용카드(VISA 카드)정보와 핸드폰 정보가 필요합니다.
- 계정 생성시 등록한 카드에서 1$의 비용이 지불되는데, 이 돈은 카드 정보를 확인하기 위함이며 환수 금액입니다.
- 핸드폰 본인 인증을 위해서 등록한 핸드폰으로 전화가 오니 미국 국제 전화(+1)라고 받지 않는 일이 없도록 합시다.
2. Google API 계정을 만들도록 합시다.
- 계정이 없다면 https://code.google.com/apis/console 사이트에 접속하여 계정을 하나 생성하도록 합시다.
- Google API계정은 Google Play에 자신의 어플을 등록하기 위해 만든 계정을 의미한다고 생각하면 됩니다.
- Google API계정은 GCM이외에 Google Map등 구글에서 제공해주는 API사용에 꼭 필요 하므로 하나 있으면 좋습니다.
- 25$의 돈이 소비되며 한 번 지불시 평생사용이 가능합니다.(2014년 04월 현재 정책)
3. Google Play Service SDK를 Import시키도록 합시다.
- ADT Bundle을 실행하여 Extra/Google Play services를 다운 받도록 합시다.
- Google Play Service SDK의 설치 위치는 <android-sdk-home>/extras/google/google_play_ervice입니다.
- 이 루트 안에 있는 libproject/google-paly-service-lib 라이브러리를 import시킵니다.
- 나중에 Android 프로젝트를 생성하거나 Import한 뒤에 library로 추가시켜줍시다.
4. AWS SDK toolkit 을 설치하도록 합시다.
- http://aws.amazon.com/ko/eclipse/ 사이트의 도구 키트 설치 방법을 따라서 설치를 합시다.
* GCM(Google Cloud Messaging for Android) 서비스 신청하기
- SNS를 사용하더라도 GCM을 이용하기 때문에 GCM 서비스를 신청해야 합니다.
1. Google APIs Console 페이지로 이동합니다. : https://console.developers.google.com
2. 구글 API를 사용한적이 없다면 화면 중앙에 떠 있는 Create Project버튼을 이용하여 하나의 프로젝트를 생성하도록 합시다.
3. 프로젝트가 생성되었다면, 프로젝트를 클릭한 후 왼쪽 메뉴 API&auth/APIs를 선택합니다.
- Google Cloud Messaging for Android를 On합니다.
- GCM이 OFF상태라면 사전순서에 의해 아래쪽에서 발견이 가능할 것입니다.
4. API 사용을 위해서 API Access Key를 생성해 주도록 합시다.
- 왼쪽 메뉴의 API&auth/Credentials를 선택 후, Public API access에 있는 "CREATE NEW KEY"를 선택해줍니다.
- 팝업 창이 뜬다면 "Server Key" 버튼을 선택해줍니다.
- 팝업 창이 바뀌면 빈칸에 IP Address를 적어 줍니다. 이 주소를 통해서만 Key를 사용 가능하게 되는 것입니다.
- 빈 칸으로 둔다면 모든 IP에서 접근 가능한 Key를 만들게 됩니다.(실험용은 빈 칸으로 두고 확인키를 누르기를 권장합니다.)
- 그럼 Public API access 줄에 Key for server applications가 생기게 됩니다. 그 밑에 표에는 API key가 생기게 됩니다.
- GCM Service 를 신청한 뒤에 필요한 두 가지 중요한 Key가 있습니다. 메모장에 기록해두도록 합시다.
1. 왼쪽 메뉴에서 Overview 를 클릭 했을 때 보이는 Project Number
2. 왼쪽 메뉴에서 APIs & auth / Credentials 를 클릭 했을 때 보이는 API Key
* SNS 샘플 코드 실행해보기
1. SNS 실행을 위한 샘플 코드를 다운 받고 압축을 풉시다.
https://s3.amazonaws.com/codesamples/sns/latest/snsmobilepush.zip
2. 이클립스를 실행한 후 위에서 다운 받은 폴더 내에서 "AndroidMobilePushApp" 프로젝트를 Import시켜 줍니다.
- library로 google-play-services_lib 와 android-support-v4.jar 을 추가 시켜 줍니다.
- google-play-services_lib는 위에서 설명했듯이 import하여 libs로 추가시켜줍니다.
- android-support-v4.jar 파일은 다음을 다운 받아서 추가해주셔도 되고, extra에서 찾아서 추가해주시면 됩니다.
3. res/string.xml 안에 있는 project_number에 GCM 등록시 얻은 프로젝트 번호(Project Number)를 입력해줍니다.
... [Insert Project Number] ...
※ 주의 : SDK 업그레이드에 따라서 Notification방법이 변경되어 실행시 오류가 발생합니다.
이를 방지하기 위해서 다음의 위치를 바꿔 줍시다.
AndroidMobilePushApp/src/com/amazoneaws/androidtest/MessageReceivingService.java의 75번째줄
(postNotification함수)
notification.getNotification() > notification.bulid()
protected static void postNotification(Intent intentAction, Context context){ final NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentAction, Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL); final Notification notification = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Message Received!") .setContentText("") .setContentIntent(pendingIntent) .setAutoCancel(true) .build(); mNotificationManager.notify(R.string.notification_number, notification); }
4. AndroidMobilePushApp 프로그램을 실행해보도록 합시다.
- registration_id 값이 출력 될 것입니다. 이 값은 디바이스마다 부여되는 고유한 값이라고 생각하시면 됩니다.
- 어플을 지웠다 깔아도 똑같은 번호가 부여됩니다. 프로젝트 번호가 바뀐다면 바뀌지 않을까 합니다.
- 프로그램 실행은 실질적으로 상용되는 핸드폰 위에서 하도록 합시다. 에뮬레이터에서는 돌아가지 않습니다.
- registration_id값은 적어둘 필요가 있는데, 너무 깁니다. Logcat을 살펴보시면 registration_id값이 나와있는 것이 보일 것입니다.
- 우클릭 한후 Filter similar messages를 클릭하여 registration_id 값을 메모장에 적어 둡시다.
5. 이제는 Message Sender를 생성할 것입니다.
- 새로운 자바 프로젝트를 생성합니다. 안드로이드 프로젝트가 아닌 자바 프로젝트 입니다.
- 위에서 다운 받은 snsmobilepush.zip 안의 SNSSamples/src 파일을 복사하여, 새로 생성한 자바 프로젝트의 src에 복사합니다.
6. 복사한 파일을 수정하도록 합시다.
- 외부 라이브러리로 다음을 추가 시켜 줍니다.
- 두개의 페키지가 나오는데 솔직히 bulkupload는 필요가 없는 부분이므로 날려 버리도록 합시다.
- AwsCredentials.properties를 수정하도록 합시다.
> 이 파일을 열면 accessKey와 secretKey를 입력하라고 합니다.
> http://aws.amazon.com/security-credentials 로 이동을 합시다.
> 로그인을 하신후 Access Credentials 위치가서 새로운 Access Key를 생성하도록 합시다.
> 생성시에는 반드시 Sercret Access Key를 저장해 둡시다.
- 여기서 얻은 두 키값을 입력해 줍시다.
#TODO: your AWS Credentials from http://aws.amazon.com/security-credentials accessKey: secretKey:
- 다음으로 SNSMobilePush.java에 있는 81번째 줄에 있는 다음문장의 주석을 해제하도록 합시다.
sample.demoAndroidAppNotification(Platform.GCM);
- 다음으로 demoAndroidAppNotification() 함수에 알맞은 값들을 넣어보도록 합시다.
public void demoAndroidAppNotification(Platform platform){ // TODO: Please fill in following values for your application String registrationId = "Logcat에서 얻은 RegistrationId"; String principal = ""; // principal is not applicable for GCM String serverAPIKey = "Google API의 Service API Key"; String applicationName = "Application Name"; demoNotification(platform, principal, serverAPIKey, registrationId, applicationName); }
7. 여기까지 완료가 되었다면 실행을 시켜봅시다.
- 어플이 꺼져있다면 푸쉬가 올 것이고, 켜져있다면 메세지가 뜰 것입니다.
※ 여러분이 수정해야 할 부분 : 받는 부분 onResume()함수 / 보내는 부분 getSampleMessage()함수
* AWS Management Console을 이용하여 직접 Push하는 방법
- 프로그램이 아닌 직접적으로 Push를 보낼 수 있다.
- 하지만, 이를 위해서는 모든 기계의 등록아이디를 등록해야 되기 때문에 불편하지만 소개는 하겠다.
1. 다음의 링크를 들어갑니다. https://console.aws.amazon.com/sns/home
2. "Add a New App" 버튼을 클릭하여 하나의 어플리케이션을 등록해줍니다.
- 여기에 들어갈 정보는 위에서 이미 나온 정보들입니다.
3. 다음으로 "Add Endpoints"를 클릭하고 "Device Token"에 Registration_Id값을 입력해 줍니다.
- 여기까지 보내기 전의 사전 작업이 완료됩니다.
4. 디바이스를 클릭한후 "Publish" 버튼을 클릭한후 메세지를 보내주도록 합니다.
* 마치는 글
- SNS는 무료 서비스는 아닙니다. 잘 기억은 나지 않지만 1만건당 0.5$의 요금이 부과 됩니다.
- 아마존 정책상 여러분이 실험으로한 1~100번 정도의 Push요청에 대해서는 요금이 부과 되지 않을 것이라고 생각됩니다.
- 우리나라엔 아직 별다른 사용 소개글이 없어서 장황하게 적어 보았습니다.- 보안에 유의하여 키관리를 확실히 합시다.