투케이2K

40. (TWOK/UTIL) [Android/Ios] 브로드 캐스트 알림 및 노티피케이션 알림 채널 등록 , 실시간 알림 확인 본문

투케이2K 유틸파일

40. (TWOK/UTIL) [Android/Ios] 브로드 캐스트 알림 및 노티피케이션 알림 채널 등록 , 실시간 알림 확인

투케이2K 2022. 4. 19. 16:20
반응형

[설 명]

프로그램 : Android / Ios

설 명 : 브로드 캐스트 알림 및 노티피케이션 알림 채널 등록 , 실시간 알림 확인

 

[IOS : 데이터 없음 : 소스 코드]

// -----------------------------------------

// [IOS : 보내는 쪽 : 데이터 없음]

NotificationCenter.default.post(
    name: Notification.Name(S_FinalData.NOTI_RECEIVE_CUSTOM_ALERT), // [알림을 식별하는 채널]
    object: nil, // [발송자가 옵저버에게 보내려고 하는 객체]
    userInfo: nil // [전송 데이터]
)

// -----------------------------------------





// -----------------------------------------

// [IOS : 받는 쪽 : 데이터 없음]

[1] 뷰 컨트롤러 viewDidLoad 메모리 로드 부분에서 채널 등록 실시

NotificationCenter.default.addObserver(
    self, // [뷰 컨트롤러]
    selector: #selector(self.NOTI_RECEIVE_CUSTOM_ALERT), // [실시간 알림 처리를 수행하는 메소드]
    name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_CUSTOM_ALERT), // [채널 등록 실시]
    object: nil // [객체]
)





[2] 실시간 알림 처리를 수행하는 메소드 등록 실시

    @objc func NOTI_RECEIVE_CUSTOM_ALERT() {
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> NOTI_RECEIVE_CUSTOM_ALERT() :: [실시간 알림 받음] 커스텀 팝업창 활성]")
        print("====================================")
        print("")
    }





[3] 뷰 컨트롤러 viewDidDisappear 화면 종료 부분에서 채널 해제 실시

NotificationCenter.default.removeObserver(
    self, // [뷰 컨트롤러]
    name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_CUSTOM_ALERT), // [채널 해제 실시]
    object: nil // [객체]
)





[4] 뷰 컨트롤러 전역 변수에 deinit 선언 및 메모리 해제 시 채널 해제 실시

deinit {
    NotificationCenter.default.removeObserver(
        self, // [뷰 컨트롤러]
        name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_CUSTOM_ALERT), // [채널 해제 실시]
        object: nil // [객체]
    )
}


// -----------------------------------------
 

[IOS : 데이터 있음 : 소스 코드]

// -----------------------------------------

// [IOS : 보내는 쪽 : 데이터 있음]

NotificationCenter.default.post(
    name: NSNotification.Name(rawValue: S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE), // [알림을 식별하는 채널]
    object: nil, // [발송자가 옵저버에게 보내려고 하는 객체]
    userInfo: ["message" : sendDic] // [데이터 전송 : 객체의 저장소 [AnyHashable: Any] 형태 : value 데이터는 딕셔너리 객체로 넣음]
)

// -----------------------------------------





// -----------------------------------------

// [IOS : 받는 쪽 : 데이터 있음]

[1] 뷰 컨트롤러 viewDidLoad 메모리 로드 부분에서 채널 등록 실시

NotificationCenter.default.addObserver(
    self, // [뷰 컨트롤러]
    selector: #selector(self.NOTI_RECEIVE_PUSH_MESSAGE(_:)), // [실시간 알림 처리를 수행하는 메소드]
    name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE), // [채널 등록 실시]
    object: nil // [객체]
)





[2] 실시간 알림 처리를 수행하는 메소드 등록 실시
    @objc func NOTI_RECEIVE_PUSH_MESSAGE(_ notification:NSNotification) {
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> NOTI_RECEIVE_PUSH_MESSAGE() :: [실시간 알림 받음] 푸시 메시지 확인]")
        print("message :: \(String(describing: notification.userInfo!["message"]))")
        print("====================================")
        print("")

        // -----------------------------------------
        // [message 키 값에 포함된 value 값 전체를 딕셔너리 형태로 받음]
        guard let checkDictionary = notification.userInfo!["message"] as? Dictionary<String, Any>
        else {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> NOTI_RECEIVE_PUSH_MESSAGE() :: [실시간 알림 받음] 푸시 메시지 확인]")
            print("error :: 데이터 딕셔너리 타입 확인 에러")
            print("====================================")
            print("")
            
            // [리턴 종료]
            return
        }
        // -----------------------------------------
        // [딕셔너리 데이터를 JSON 으로 변환 실시]
        var jsonObj : String = ""
        do {
            let jsonCreate = try JSONSerialization.data(withJSONObject: checkDictionary, options: .prettyPrinted)
            
            // json 데이터를 변수에 삽입 실시
            jsonObj = String(data: jsonCreate, encoding: .utf8) ?? ""
        } catch {
            print("")
            print("====================================")
            print("[\(self.ACTIVITY_NAME) >> NOTI_RECEIVE_PUSH_MESSAGE() :: [실시간 알림 받음] 푸시 메시지 확인]")
            print("catch :: 딕셔너리 JSON 변환 에러")
            print("====================================")
            print("")
            
            // [리턴 종료]
            return
        }
        // -----------------------------------------
        ///*
        // [팝업창 알림 표시 수행]
        self.showAlert(
            type:0,
            tittle: S_FinalData.AL_TITLE,
            content: jsonObj,
            okBtb: S_FinalData.AL_OK,
            noBtn: S_FinalData.AL_NO
        )
        // */
        // -----------------------------------------
    }




[3] 뷰 컨트롤러 viewDidDisappear 화면 종료 부분에서 채널 해제 실시

NotificationCenter.default.removeObserver(
    self, // [뷰 컨트롤러]
    name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE), // [채널 해제 실시]
    object: nil // [객체]
)





[4] 뷰 컨트롤러 전역 변수에 deinit 선언 및 메모리 해제 시 채널 해제 실시

deinit {
    NotificationCenter.default.removeObserver(
        self, // [뷰 컨트롤러]
        name: NSNotification.Name(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE), // [채널 해제 실시]
        object: nil // [객체]
    )
}


// -----------------------------------------
 

[AOS : 소스 코드]

// -----------------------------------------

// [안드로이드 : 보내는 쪽]

// TODO [푸시 메시지 브로드 캐스트 알림 전달]
try {
    Intent intent = new Intent(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE); // [채널 명칭 지정]
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); // [플래그 설정]
    intent.putExtra("message", sendRecive.toString()); // [데이터 전달]
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); // [브로드 캐스트 알림 전달]
}
catch (Exception e){
    e.printStackTrace();
}

// -----------------------------------------





// -----------------------------------------

// [안드로이드 : 받는 쪽]

[1] Activity [onCreate] 부분에 리시버 채널 등록 실시

// TODO [브로드 캐스트 알림을 받기 위해 채널 등록 수행 실시]
try {
    IntentFilter filter = new IntentFilter(); // [인텐트 필터 선언]
    filter.addAction(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE); // [푸시 알림 받기 위함]
    LocalBroadcastManager.getInstance(A_Main.this).registerReceiver(mMessageReceiver, filter); // [알림을 받는 리시버 지정]
}
catch (Exception e){
    e.printStackTrace();
}





[2] 실시간 브로드 캐스트 알림 받기 메소드 등록

    // TODO [실시간 브로드 캐스트 알림 수신 부분]
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceive() :: 실시간 브로드 캐스트 알림 전달 받음]");
            Log.i("","\n"+"[채 널 :: "+String.valueOf(intent.getAction())+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");

            // ------------------------------------------
            // [푸시 알림을 받은 경우 : C_FirebaseMessagingService]
            if(S_FinalData.NOTI_RECEIVE_PUSH_MESSAGE.equals(String.valueOf(intent.getAction()))) {

                // [인텐트로 전달 받은 메시지 확인]
                String message = String.valueOf(intent.getStringExtra("message")); 

                /*
                // [팝업창 호출 실시]
                C_Ui_View.showAlert(
                        A_Main.this,
                        0,
                        S_FinalData.AL_TITLE,
                        message,
                        S_FinalData.AL_OK,
                        S_FinalData.AL_NO,
                        "");
                // */
            }
            // ------------------------------------------
        }
    };





[3] Activity [onDestroy] 부분에 리시버 채널 해제 실시

// TODO [브로드 캐스트 알림 채널 해제 실시]
try {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
catch (Exception e){
    e.printStackTrace();
}

// -----------------------------------------

 

반응형
Comments