fcm push notification example / (fcm) 푸시알림 클릭시 지정한 URL로 이동하기

북마크 추가

안녕하세요

 

푸시알림을 통해 앱을 열었을 때 지정한 URL이 바로 열리게 하는 방법입니다.

 

웹뷰를 사용하는 하이브리드앱 기준입니다.

 

https://trandent.com/board/Android/detail/745

 

이 글을 보시면 저의 경우 nodejs 서버를 통해서 푸시알림을 발송 하는데

 

중간에   

function sendTopicMessage(title, content, imgUrl, link) {

var message = { title : title , content : content, imgUrl : imgUrl , link : link }

 

라는 부분이 있습니다.

 

여기서 link를 사용하는 방법 입니다.

 

1.FirebaseMessagingService.java


기존 코드에서 추가되는 부분만 작성 하겠습니다.

 

Bundle을 사용해서 앱이 초기 구동될때 url을 전달하게 됩니다.


nodejs서버를 통해 발송한 메세지중 link url을 받아옵니다. 

 

private void sendNotification(String messageBody) {

String link = "";

try {
JSONObject obj = new JSONObject(messageBody);
link = obj.getString("link");
}catch(Exception e){

}
//String title =
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putString("url", link);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);

}

빨간색 부분이 추가되는 부분입니다.

 

Bundle을 선언하고 전달 받은 link url을 담아줍니다.

 

이제 Push 알림 창에서는 메세지로 전송한 LINK URL을 담고 있습니다.

 

2. MainActivity.java

 

제 앱의 경우 웹뷰를 통해 앱 구동시 https://trandent.com URL을 열도록 되어있습니다.

 

private static String target_url = https://trandent.com;

 

하이브리드 앱이라면 onCreate 안에서 webview.loadUrl("도메인"); 코드를 통해 메인 페이지를 열게 되어 있을텐데요

 

메인 페이지가 열리기 전에 1번에서 Bundle에 담은 Url이 존재 하는지 검사를 해서 만약 존재한다면 target_url을 바꿔주는 방법입니다.

 

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
if( bundle != null){
if(bundle.getString("url") != null && !bundle.getString("url").equalsIgnoreCase("")) {
target_url = bundle.getString("url");
}
}

첫번째로 Bundle이 null 인지 아닌지 검사를 하고 null 이 아니라면 url을 꺼내옵니다

마찬가지로 url이 null 이거나 공백이 아니라면 기존의 메인페이지 target_url을 전달받은 url로 바꿔줍니다.

 

그리고 나서 loadUrl을 바뀐 URL로 해주면 끝입니다.

 

만약 네이티브 앱인데 푸시알림 클릭시 웹뷰를 먼저 띄우고 싶으시다면 URL이 존재하는 경우 웹뷰 생성부터 별도로 구성하시면 됩니다.

 

 

클릭하면 앱이 열리고

 


 

메인 페이지가 아닌 지정한 URL이 바로 열리게 됩니다.

 


 

 

다음으로는 하이브리드앱에서 메뉴부분을 네이티브로 따로 구현하는 방법을 올리도록 하겠습니다.

 

HKH
2016-11-24 11:08
SHARE
댓글

웹상에서 어떻게 발송하는지 코드를 봐야 알것같습니다
HKH

sendTopicMessage('asdf','1234','','');
웹에서 이렇게 호출하면 푸시가 와야하는게 정상이지 않나요?;;
firebast콘솔에서는 정상적으로 푸시가 옵니다.

웹에서는 발송이 되질 않네요. 뭐가 틀린걸까요?;;
송영민

저의 경우 앱이 foreground로 실행 중 일때 url이 포함된 푸시 알림을 클릭하면 앱이 재시작 되면서 해당 링크가 열립니다
HKH

안녕하세요 포스팅대로 따라하다가 질문이 있어서 남깁니다ㅠㅠ 하이브리드 앱 개발 중이라 같은 방식으로 target url을 webview가 있는 main activity에 넘겨주려고 했습니다. 근데 앱이 foreground에서 실행중인 경우에는 push로 부터 온 url이 제대로 activity에 전달되지 않습니다. 확인해보니 notification의 Pendingintent의 intent에서 실행시키려는 Activity가 main Activity여서 이미 foreground로 실행중이여서 인것 같습니다. 이럴 경우는 어떻게 url을 실행중인 Activity에 전달할 수 있을까요?ㅠㅠ 
broadcast도 보내봤는데 그럴 경우엔 아예 노티 눌럿을 때 반응하지 않네요ㅠㅠ...
MJ

넵.. 잘되시기를 바라겠습니다ㅋㅋ
HKH

감사합니다 ! 오늘안에 마무리 지을수있겠네요 두개 답변 다달아주셨네요 ㅠ 감동입니다..
andy

어플이 실행될때 기본으로 설정한  도메인 대신에 푸시를 통해 전송한 url로 바꿔치기 해서 띄워주는 개념으로
onCreate안에서 loadUrl을 호출하기 전에만 실행시켜 주면 됩니다.

naver.com을 bundle을 사용해 넘겨 줬다고 가정하면
String target_url ="";
if 전송한 url이 있으면
        target_url = "http://naver.com";
else //전송한 url이 없으면
         target_url = "https://trandent.com";

webView.loadUrl(target_url); (naver.com or trandent.com)
개념입니다.
HKH

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
if( bundle != null){    
    if(bundle.getString("url") != null && !bundle.getString("url").equalsIgnoreCase("")) {
        target_url = bundle.getString("url");
    }
}
같은경우는 onCreate안에 넣어야하는건가요?? 계속 블랭크 페이지만 나오네요..
andy
keyboard_arrow_left
keyboard_arrow_up