웹뷰를 통해 구현한 하이브리드 앱이 있습니다.
웹서버는 스프링 프레임워크로 구현을 해주었고,
푸시알림을 보내고 이를 받은 클라이언트가 푸시알림을 누르면 특정 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" 으로 재설정하기 바랍니다.
'Framework & Lib & API > API' 카테고리의 다른 글
[FCM]Firebase(파이어베이스)와 스프링 연동(토큰방식 여러개 한번에 푸시알림 보내기) (0) | 2020.12.21 |
---|---|
[파이어베이스] 안드로이드 HttpsURLConnection을 이용하여 웹서버에 토큰 전달 (0) | 2020.12.04 |