Upload
kenu-heo
View
969
Download
0
Embed Size (px)
Citation preview
agenda
• 사전 준비
• GCM 기능
• 아키텍처• 클라이언트• 써드파티 서버 모듈
GCM
• Google Cloud Message
• 서버가 디바이스 호출
사전 준비
• https://code.google.com/apis/console
• API 프로젝트 생성
Sender ID
• Project Number
Service ON
• Google Cloud Messaging for Android
Key for server apps
Android Library
gcm-server.jar
주요 기능
• 간단 메시지
• 서버에서 디바이스로 전송; 일방향
• 대용량 콘텐츠 필요시 서버에 다시 접속
• 순서나 트랜잭션 무보장
클라이언트
• 프로세스 살아있을 필요 없음
• 인텐트 브로드캐스트 이용해서 앱 실행
• 매니페스트에 브로드캐스트 미리 설정
요구 조건
• 안드로이드 2.2 이상 필수 조건
• 구글 플레이 스토어 앱 설치
• 구글 계정 설정
• 안드로이드 4.0.4 이상은 예외
아키텍처
• 컴포넌트(Component)
• 자격증명(Credentials)
컴포넌트
• 안드로이드 디바이스
• 써드파티 애플리케이션 서버
• GCM 서버
자격증명• Sender ID
• App ID ; 패키지명
• 등록 ID ; 특정 디바이스에서 구동되는 특정 앱 구분
• 구글 사용자 계정; 4.0.4 미만
• Sender AuthToken; 써드파티 서버 보관, API키
Lifecycle
• GCM 활성화 > 메시지 보내기 > 메시지 받기
앱 만들기
• 매니페스트 파일 수정
• 자바 코드 구현
매니페스트 파일 작성<manifest ...>
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="com.google.android.gcm.demo.app.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.google.android.gcm.demo.app.permission.C2D_MESSAGE"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application ...> <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.google.android.gcm.demo.app" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> </application></manifest>
GCM 등록 static boolean register(final Context context, final String regId) { String serverUrl = SERVER_URL + "/register"; Map<String, String> params = new HashMap<String, String>(); params.put("regId", regId); long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000); for (int i = 1; i <= MAX_ATTEMPTS; i++) { Log.d(TAG, "Attempt #" + i + " to register"); try { displayMessage(context, context.getString( R.string.server_registering, i, MAX_ATTEMPTS)); post(serverUrl, params); GCMRegistrar.setRegisteredOnServer(context, true); String message = context.getString(R.string.server_registered); CommonUtilities.displayMessage(context, message); return true; } catch (IOException e) {
등록 결과 메시지 처리
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String newMessage = intent.getExtras().getString(EXTRA_MESSAGE); mDisplay.append(newMessage + "\n"); }};
수신 메시지 처리
public class GCMIntentService extends GCMBaseIntentService { @Override protected void onMessage(Context context, Intent intent) { String message = getString(R.string.gcm_message); displayMessage(context, message); // notifies user generateNotification(context, message); }...}
써드파티 서버
• 클라이언트 통신
• GCM 서버에 요청
• 클라이언트 요청 처리
• GCM 서버 실패 재요청
• API키와 클라이언트 등록 아이디 저장
diff C2DM GCM
• 메시지 크기 : 1kb → 4kb
• 서비스 신청 : Mail → 웹설정 On
• 인증 : AuthToken → API key
• 전송 횟수 제한 없어짐
• GCM요청에 JSON 추가
• 4.0.4 이상 구글 계정 없어도 가능
참고
• 안드로이드 프로그래밍의 모든 것, 김지훈 외, 2013, 에이콘, 32장 GCM 서비스