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


(5.0)

북마크 추가

안녕하세요

 

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

 

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

 

http://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

 

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

 

private static String target_url = http://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이 바로 열리게 됩니다.

 


 

 

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

 

AD
관리자
2016-11-24 11:08
SHARE
댓글

제가 로그인폼을 따로 만들어서 로그인폼에 입력한 정보를 서버에 보내서 로그인 하는 방식으로 제작을 하였는데요 푸쉬 클릭시 로그인 엑티비티가 뜨고 로그인 버튼을 누르면 제가 보내준 링크로 안가고 제가 지정해둔 링크로 넘어가는데 혹시 힘트좀 주실수있을까요
신**
 네이티브인지 하이브리드 인지 모르겠는데 일단 로그인 엑티비티를 띄울때 bundle에 있는 url을 전역변수에 담았다가
버튼 클릭에 매핑된  method에서 갖다 쓰면 될것 같습니다. 
작성한 글에 있는 내용은 앱이 열릴때 onCreate에서 링크 페이지를 바로 보여주지만 구현하신 방식은 페이지가 따로 있고 거기서 액션을 취했을때 전달받은 url을 사용하는 방식이라 전역으로 빼면 될 것 같습니다.
관리자
 답변감사합니다. 저문제는 해결하였는데 포그라운드일시 지정된 url로 이동이 안되어서요 포그라운드 일떄 설정을 따로 해줘야 하는건가요??
신**
 포그라운드에서는 동작되는 순서를 해봐야 될 것 같습니다. 그 부분을 크게 신경쓰지 않고 만들어서 지금은 어려운데
아마 위 방식으로 동작 하지 않는다면 별도 로직이 들어가야 될 것 같습니다.
관리자

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

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

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

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

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

넵.. 잘되시기를 바라겠습니다ㅋㅋ
관리자

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

어플이 실행될때 기본으로 설정한  도메인 대신에 푸시를 통해 전송한 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)
개념입니다.
H**

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안에 넣어야하는건가요?? 계속 블랭크 페이지만 나오네요..
a***