본문 바로가기

.Net

[Server] GCM 전송 및 결과 처리 ( c#)

  • GCM 전송 및 결과 처리

#region ANDROID 전송
                // 안드로이드 전송 후 결과를 저장합니다.
                MobilePushResponseModel responseModel = new MobilePushResponseModel();
                MobilePushResponseModel resultModel = new MobilePushResponseModel() { results = new List<MobilePushResponseModel .Result>()};
                foreach (var data in makeMessageForAndroid(message, AndroidPushList, locationUrl))
                {
                    responseModel = new MobilePushResponseModel ();
                    responseModel = new JavaScriptSerializer ().Deserialize<MobilePushResponseModel>(pushMessageForAndroid(data));

                    //resultModel.multicast_id += responseModel.multicast_id;
                    resultModel.canonical_ids += responseModel.canonical_ids;
                    resultModel.sucess += responseModel.sucess;
                    resultModel.failure += responseModel.failure;
                    resultModel.results.AddRange(responseModel.results);
                }

                #region GCM 결과 처리 정책 주석
                // D_ID 삭제 리스트를 구합니다.
                // 1. 성공처리 
                //  - 유효한 registration_ids  인경우
                //    { "message_id": "1:1516" }
                // 2. 삭제처리 - 해당 index의 request의 registration_id를 삭제/미사용 처리.
                //  - 유효하지 않은 registration_ids 이면서 해당 단말기에 어플을 삭제 후 설치하지 않은 경우
                //    { "error": "NotRegistered"}
                //  - 유효하지 않은 registration_ids 이나 해당 단말기가 최종적으로 다시 어플을 설치하여 정상 push를 받을 수 있는 경우
                //    여기서 "32" 값은 다시 어플을 설치하여 정상 push를 받을수 있는 registration_ids 이다.
                //    { "message_id": "1:2342", "registration_id": "32" }
                //  - 복구할수 없는 오류가 있는 경우
                //    { "error": "InvalidRegistration" }
                // 3. 미발송처리
                //    DB수정없음 - 발송성공처리후 리스트에서 미발송상태로 재처리
                //  - GCM에 정상 발송하지 못해 재전송이 필요한경우 - 재전송 로직 없이 성공처리 한다(계속된 실패가 될수도 있으므로)
                //    { "error": "Unavailable" }
                //  - NotRegistered, InvalidRegistrationd 을 제외한 에러메세지 있는 경우는 모두 미발송 처리한다.
                #endregion

                Boolean deleteFlag = false ; // 삭제하는경우 true , 삭제하지않는경우 false
                String androidDeviceId = String .Empty;
                MobilePushResponseModel.Result result = new MobilePushResponseModel .Result();
                String errerMsg = String .Empty;
                for (int i = 0; i < resultModel.results.Count(); i++)
                {
                    deleteFlag = false;
                    result = resultModel.results[i]; // PUSH 발송 결과 리스트
                    androidDeviceId = AndroidPushList[i] as String ; // registration_ids

                    #region 데이터베이스에서 삭제해야할 Device Id를 구합니다.
                    errerMsg = result.error;
                    if (!String .IsNullOrEmpty(errerMsg)){
                        if( "NotRegistered" .Equals(errerMsg) || "InvalidRegistration".Equals(errerMsg) )
                        {
                            deleteFlag = true;
                        }
                        else
                        {
                            sentFailList.Add(androidDeviceId); // 전송일자를 기록하지 않는다. 재전송을 위해
                        }
                    } else if (!String.IsNullOrEmpty(result.registration_id)){
                        deleteFlag = true;
                    }
                    #endregion

                    if (deleteFlag)
                    {
                        pushDeleteList.Add( new MobilePushUserListModel (){ id = androidDeviceId }); // 데이터베이스에서 삭제/미사용 처리
                    }
                }
                #endregion

  • 전송후 DB 처리 내용

  1. pushDeleteList 내 단말정보를 삭제/미사용처리
  2. 미사용 단말을 제외한 나머지 푸시 정보에 전송일자 기록
  3. sentFailList 내 단말정보는 전송일자 초기화