본문 바로가기
Framework & Lib & API/API

[파이어베이스] 안드로이드 웹뷰 푸시알림으로 특정 링크로 접속하도록 구현

by 코딩공장공장장 2020. 12. 6.

웹뷰를 통해 구현한 하이브리드 앱이 있습니다. 

 

웹서버는 스프링 프레임워크로 구현을 해주었고, 

 

푸시알림을 보내고 이를 받은 클라이언트가 푸시알림을 누르면 특정 url로 이동할 수 있게끔 구현해보았습니다. 

 

이미 푸시알림이 구현되신 분들을 대상으로 링크로 접속하도록 구현해줘야 하는 부분에 대해서 다뤄보도록 하겠습니다.

 

 

웹서버에 푸시알림 요청하는 메서드

public void send_FCMtoken(String tokenId, String title, String content, String link) throws IOException, FirebaseMessagingException {
		
		FileInputStream serviceAccount = new FileInputStream("/모자이크.json");
		
		FirebaseOptions options = FirebaseOptions.builder()
		  .setCredentials(GoogleCredentials.fromStream(serviceAccount))
		  .setDatabaseUrl("https://모자이크.com")
		  .build();
		
		if(FirebaseApp.getApps().isEmpty()) {
			FirebaseApp.initializeApp(options);
		}
		String registrationToken = tokenId;
		
		Message msg = Message.builder()
				.setAndroidConfig(AndroidConfig.builder()
						.setTtl(3600*1000)
						.setPriority(AndroidConfig.Priority.NORMAL)
						.build())
				.putData("title", title)
				.putData("content", content)
                .putData("link", link)
				.setToken(registrationToken)
				.build();
		
		String response = FirebaseMessaging.getInstance().send(msg);
	}

 

위와 같이 푸시알림 요청하는 코드를 구현해놓으셨으리라 생각합니다. 

 

메세지 보낼때 putData로 보여줄 접속하게할 링크하나 더 보내주면 됩니다.

 

 

안드로이드 MyFireBaseMessagingService.java

public class MyFireBaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token){

        Log.d("FCM Log", "Refreshed token: "+token);
    }
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage){
        if(remoteMessage.getData().size() > 0){

            Log.d("FCM Log","message: "+remoteMessage.getData());
            String messageBody = remoteMessage.getData().get("content");
            String messageTitle = remoteMessage.getData().get("title");

            //푸시알림 링크 설정
            String link = remoteMessage.getData().get("link");
            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, intent , PendingIntent.FLAG_ONE_SHOT);
            String channelId = "Channel ID";
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(messageTitle)
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setVibrate(new long[]{1000, 1000})
                    .setLights(Color.BLUE,500,2000)
                    .setContentIntent(pendingIntent)
                    ;

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                String channelName = "Channel Name";
                NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);
                notificationManager.createNotificationChannel(channel);
            }
            notificationManager.notify(0, notificationBuilder.build());
        }
    }
}

 

위의 클래스파일은 모두 존재하리라고 생각됩니다. 

 

String link = remoteMessage.getData().get("link");
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); 위에 적어주시면 됩니다. 

 

bundle 개념을 설명드리자면 bundle은 상태를 저장하고 있습니다. 

 

 Acitivity를 생성할때 이전의 데이터를 불러오고 Activity를 중단할때 현재 상태를 임시적으로 저장합니다. 

 

즉 우리가 앱에서 이리저리 페이지를 이동하다가 홈버튼을 눌러 앱에서 벗어났다가 다시 앱으로 돌아와도

 

그 전의 페이지에 머무를 수 있는건 bundle이 상태를 저장하고 있기 때문입니다. 

 

그리고 bundle은 데이터를 저장할수 있는 내용물 같은 개념으로 생각하시면 됩니다.

 

이 내용물을 Intent를 통해 전달하는 것이죠.

 

 

 

MainActivity.java

Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        if( bundle != null){
            if(bundle.getString("url") != null && !bundle.getString("url").equalsIgnoreCase("")) {
                target_url = bundle.getString("url");
            }
        }
        mWebView.loadUrl(target_url); // 웹뷰에 표시할 웹사이트 주소, 웹뷰 시작

 

MainActivity의 onCreate() 메소드 안에 위의 코드와 같이 구현해줬습니다. 

 

target_url은 private static String 값인데 bundle에 값이 있는 경우, 즉 우리가 푸시알림으로 링크를 보내준 경우에면

 

target_url 값을 우리가 보내준 링크로 바꿔 앱에 접속하는 사용자가 알림 받은 링크로 첫화면이 나타날 수 있습니다.

 

 

위와 같이 구현하면 쉽게 사용할 수 있을 것입니다. 

 

다만 저와 비슷하게 구현한다면 target_url 값이 바뀌어 앱을 종료하고 다시 실행해도 

 

메인 페이지가 아니라 푸시알림으로 보내준 링크로 접속이 될 것입니다. 

 

그렇기 때문에 onDestroy() 메소드에 다시 원래의 웹뷰 url인 target_url="메인페이지url.com" 으로 재설정하기 바랍니다.

반응형