(Advanced) Client SDK - Android
1. 푸시 알림 아이콘 설정
Notifly Android SDK에서는 푸시를 수신할 때 기본적으로 앱의 launcher icon을 푸시 알림 아이콘으로 사용합니다.
만약 앱의 launcher icon과 다른 아이콘을 푸시 알림 아이콘으로 사용하고 싶은 경우, ic_stat_notifly_default
의 이름으로 notification icon을 만들어 주세요. notification icon을 만드는 가이드는 Android Developers - Create app icons를 참고해 주세요.
2. 푸시 알림 사전 동의
Notifly Android SDK에서는 푸시 알림을 수신하는 시점에 사용자에게 푸시 알림 수신 동의를 받지 않습니다.
사용자 알림 수신 동의는 Notifly Android SDK 설치와 무관하게 앱 내에서 직접 구현하셔야 하며, 특히 Android TIRAMISU(API Level 33) 이상에서는 명시적으로 사용자에게 권한을 획득해야 합니다. 푸시 알림 수신 동의를 사용자에게 런타임에 요청하는 가이드는 Android Developers - Notification runtime permission을 참고해 주세요.
다음 코드는 예시입니다. 실제 알림 요청 타이밍, UI, 문구 등은 앱의 특성에 맞게 구현해 주세요.
class MainActivity : Activity() {
companion object {
private const val PERMISSION_REQUEST_CODE = 101 // 필요에 따라 변경
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
askNotificationPermission()
...
}
private fun askNotificationPermission() {
// This is only necessary for API level >= 33 (TIRAMISU)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
ContextCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
showPermissionRationaleDialog()
} else {
requestNotificationPermission()
}
}
}
private fun showPermissionRationaleDialog() {
AlertDialog.Builder(this)
.setTitle("Permission needed")
.setMessage("This app needs the notification permission to send you notifications.")
.setPositiveButton("ok") { _, _ ->
requestNotificationPermission()
}
.setNegativeButton("No thanks") { dialog, _ ->
dialog.dismiss()
}
.create().show()
}
private fun requestNotificationPermission() {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
PERMISSION_REQUEST_CODE
)
}
}
3. 푸시 알림 클릭 이벤트 구독
해당 기능은 Notifly Android SDK 1.5.0 이상 버전부터 지원됩니다.
Notifly Android SDK에서는 푸시 알림 클릭 이벤트를 구독하여 사용자가 푸시 알림을 클릭했을 때 앱 내에서 특정 동작을 수행하도록 커스터마이즈 할 수 있습니다.
package com.your.project
import android.app.Application
import android.util.Log
import tech.notifly.Notifly
import tech.notifly.push.interfaces.INotificationClickEvent
import tech.notifly.push.interfaces.INotificationClickListener
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
// Optional: Set log level
Notifly.setLogLevel(Log.VERBOSE)
// Initialize Notifly SDK
Notifly.initialize(
context = applicationContext,
projectId = BuildConfig.NOTIFLY_PROJECT_ID,
username = BuildConfig.NOTIFLY_USERNAME,
password = BuildConfig.NOTIFLY_PASSWORD,
)
// Subscribe for push notification click event
Notifly.addNotificationClickListener(object : INotificationClickListener {
override fun onClick(event: INotificationClickEvent) {
Log.d("SampleApplication", "Notification clicked!")
Log.d("SampleApplication", "Notification title: ${event.notification.title}")
Log.d("SampleApplication", "Notification body: ${event.notification.body}")
Log.d(
"SampleApplication",
"Notification custom data: ${event.notification.customData}"
)
}
})
}
}
3-1. 푸시 알림 클릭 이벤트 인터페이스
INotificationClick
의 notification
객체에 접근하여, 사용자가 어떠한 푸시를 클릭했는지에 대한 정보를 확인할 수 있습니다.
아래는 INotification
객체의 속성들에 대한 설명입니다.
Property name | Type | Description | Since |
---|---|---|---|
androidNotificationId | Int | Android system-level 푸시 알림 ID입니다. | 1.5.0 |
campaignId | String? | 푸시 알림이 발송된 Notifly 캠페인의 ID입니다. | 1.5.0 |
body | String? | 푸시 메시지의 내용입니다. | 1.5.0 |
title | String | 푸시 메시지의 제목입니다. | 1.5.0 |
url | String | 푸시 메시지가 클릭되었을 때 이동할 URL입니다. 만약 '앱 실행' 액션으로 푸시 알림을 발송하였다면, null 값이 반환됩니다. | 1.5.0 |
customData | HashMap<String, String> | FCM 푸시 메시지의 data 필드에 포함된 키-값 쌍의 커스텀 데이터입니다. 노티플라이 콘솔에서 설정할 수 있습니다. | 1.5.0 |
imageUrl | String? | 이미지형 푸시 메시지에 포함된 이미지 URL 입니다. | 1.5.0 |
importance | Importance | Importance 는 tech.notifly.push.impl.Importance 에 정의되어 있으며, Importance.HIGH , Importance.NORMAL , Importance.LOW 중 하나의 값입니다. | 1.5.0 |
notiflyMessageId | String? | Notifly 서버에서 임의로 생성한 메시지 ID입니다. | 1.5.0 |
rawPayload | String | FCM data의 가공되지 않은 payload입니다. JSON을 stringify한 형태로 반환됩니다. | 1.5.0 |
sentTime | Long | FCM 서버에서 푸시 알림을 발송한 시간입니다. | 1.5.0 |
ttl | Int | 푸시 알림의 TTL(Time To Live) 값입니다. | 1.5.0 |
4. 푸시 알림 인터셉터
해당 기능은 Notifly Android SDK 1.10.0 이상 버전부터 지원됩니다.
Notifly Android SDK에서는 푸시 알림이 표시되기 전에 알림의 설정을 커스터마이즈할 수 있는 인터셉터 기능을 제공합니다. 이를 통해 앱의 요구사항에 맞게 푸시 알림의 모양과 동작을 수정할 수 있습니다.
package com.your.project
import android.app.Application
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import tech.notifly.Notifly
import tech.notifly.push.interfaces.INotificationInterceptor
import tech.notifly.push.interfaces.IPushNotification
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
// Initialize Notifly SDK
Notifly.initialize(
context = applicationContext,
projectId = BuildConfig.NOTIFLY_PROJECT_ID,
username = BuildConfig.NOTIFLY_USERNAME,
password = BuildConfig.NOTIFLY_PASSWORD,
)
// Add Notifly notification interceptor
Notifly.addNotificationInterceptor(object : INotificationInterceptor {
override fun postBuild(
builder: NotificationCompat.Builder,
notification: IPushNotification
): NotificationCompat.Builder {
// Customize the notification here
builder.setColor(ContextCompat.getColor(applicationContext, R.color.purple_700))
// You can add more customizations based on your requirements
return builder
}
})
}
}
4-1. 푸시 알림 인터셉터 인터페이스
INotificationInterceptor
인터페이스의 postBuild
메소드를 구현하여 푸시 알림의 설정을 커스터마이즈할 수 있습니다. 이 메소드는 다음과 같은 파라미터를 받습니다:
builder: NotificationCompat.Builder
: 현재 설정된 알림 빌더입니다. 이를 수정하여 알림의 모양과 동작을 변경할 수 있습니다.notification: IPushNotification
: 푸시 알림에 대한 정보를 담고 있는 객체입니다. 이를 통해 알림의 내용에 따라 다른 설정을 적용할 수 있습니다.
postBuild
메소드에서 원하는 설정을 builder
에 적용한 후, 수정된 builder
를 반환하면 됩니다.
Android 8.0 (API 레벨 26) 이상에서는 알림 채널 설정이 우선적으로 적용됩니다. 예를 들어, 알림 채널에 이미 소리가 설정되어 있다면, builder.setSound()
로 설정한 소리는 무시될 수 있습니다. 알림의 주요 설정을 변경하려면 알림 채널 설정을 함께 고려해야 합니다.
5. WebView
Notifly Android SDK에서는 인앱 메시지를 표시하기 위해 WebView를 사용합니다.
안드로이드의 경우, 앱이 백그라운드에 있을 때에도 WebView의 Javascript 코드가 실행되며, 이로 인해 불필요한 자원 소모가 발생할 수 있어
Activity Lifecycle에 따라 WebView의 Javascript 코드를 pauseTimers()
와 resumeTimers()
를 호출하여 관리하는 것이 권장됩니다.
위 두 메소드는 하나의 WebView에만 영향을 미치지 않으며, 전역적으로 적용됩니다. 따라서, 앱 내에 여러 개의 WebView가 존재하는 경우 위 두 메소드를 호출할 때 주의해야 합니다.
Notifly Android SDK 1.8.0
보다 낮은 버전에서는, 위 두 메서드들이 In App Message 액티비티가 시작 / 종료됨에 따라 자동으로 호출되었습니다. 아래 코드는 Notifly Android SDK 1.8.0
보다 낮은 버전에서 인앱 메시지를 노출하는 액티비티의 코드 입니다.
package tech.notifly.inapp
import android.app.Activity
// ...
class NotiflyInAppMessageActivity : Activity() {
// ...
override fun onPause() {
super.onPause()
mNotiflyWebView?.pauseTimers()
}
override fun onResume() {
super.onResume()
mNotiflyWebView?.resumeTimers()
}
// ...
}
위 경우, 인앱 메시지가 닫힌 이후 pauseTimers()
함수가 불리면서 앱 내의 다른 WebView가 작동하지 않는 문제를 일으킬 가능성이 있습니다.
따라서 1.8.0
버전보다 낮은 SDK 버전에서 인앱 메시지를 사용하여 앱 내의 웹뷰가 정상 동작하지 않는 경우, resumeTimers()
함수를 명시적으로 호출하여 WebView를 다시 시작해주세요.
또한, Notifly 인앱 메시지가 노출되지 않는 경우, 인앱 메시지가 노출되는 시점에 WebView가 동작되고 있는지에 대해 꼭 확인해주세요.