Android SDK 사용자 정의
딥링크를 처리할 액티비티에 scheme, host, pathPrefix 파라미터와 함께 <data> 태그를 추가하세요.
<activity android:name=".PromoActivity" android:label="PromoActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.pushwoosh" android:host="promotion" android:pathPrefix="" /> </intent-filter</activity>위 예시에서 딥링크는 PromoActivity를 엽니다. 아래의 기본 구현은 단순화를 위해 프로모션 ID 값으로 알림을 표시합니다. 애플리케이션에서는 분명히 더 유용한 작업을 수행할 수 있습니다!
public class PromoActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.deep_link); setTitle("Deep link activity");
Intent intent = getIntent(); String action = intent.getAction(); Uri data = intent.getData();
if (TextUtils.equals(action, Intent.ACTION_VIEW)) { openUrl(data); } }
private void openUrl(Uri uri) { String promoId = uri.getQueryParameter("id"); Toast.makeText(getApplicationContext(), promoId, Toast.LENGTH_LONG).show(); }}인앱 구매 추적
Anchor link toCustomer Journeys에서 인앱 구매를 추적하려면 다음 메서드를 호출하여 구매 정보를 Pushwoosh로 보내도록 구성하세요:
Pushwoosh.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);지오존 푸시 알림
Anchor link to지오존 푸시를 사용하려면 com.pushwoosh:pushwoosh-location 라이브러리를 추가하고 다음을 호출하세요:
PushwooshLocation.startLocationTracking();AndroidManifest.xml에 필요한 권한을 포함하세요:
<manifest ... > <!-- Required for geolocation-based push notifications --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Required for precise location tracking --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Required for background location access on Android 10 (API level 29) and higher --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /></manifest>Pushwoosh와 함께 로컬 알림 사용하기
Anchor link toPushwoosh 로컬 알림 API를 사용하는 경우, AndroidManifest.xml에 RECEIVE_BOOT_COMPLETED 권한을 추가하세요:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>xAndroid에서 배지 번호 사용하기
Anchor link toPushwoosh는 다음 Android 런처에서 앱 아이콘 바로 가기에 배지 번호 설정을 지원합니다:
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO.
이 기능을 사용하려면 애플리케이션에 com.pushwoosh:pushwoosh-badge 라이브러리를 추가하기만 하면 됩니다.
사용자 정의 액티비티 열기
Anchor link to푸시 알림에 응답하여 특정 액티비티를 시작하려면 해당 액티비티에 다음 인텐트 필터를 추가하세요:
<activity android:name="YourActivity"> <intent-filter> <action android:name="${applicationId}.MESSAGE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity>로그 레벨 제어
Anchor link to디버깅 및 통합을 돕기 위해 SDK는 기본적으로 모든 요청을 콘솔에 출력합니다. 프로덕션 빌드를 준비할 때, AndroidManifest.xml에 com.pushwoosh.log_level 메타데이터를 “ERROR” 값으로 추가하세요. 이렇게 하면 오류에 대한 정보만 콘솔에 출력됩니다. 다른 옵션은 다음 중 하나일 수 있습니다:
NONE - SDK에서 로그 없음
ERROR - 콘솔에 오류만 표시
WARN - 경고도 표시
INFO - 정보 메시지 표시
DEBUG - 디버그 정보까지 표시
NOISE - SDK가 출력할 수 있는 모든 것과 그 이상
<meta-data android:name="com.pushwoosh.log_level" android:value="ERROR" />Proguard 사용하기
Anchor link toProguard를 사용할 때 다음 옵션을 추가하세요:
-keep class com.pushwoosh.** { *; }-dontwarn com.pushwoosh.**Proguard에 관한 Google Play Services 라이브러리 요구 사항은 여기를 참조하세요:
https://developers.google.com/android/guides/setup
알림 열기 동작 사용자 정의
Anchor link to푸시 알림의 결과로 표시할 액티비티를 프로그래밍 방식으로 선택해야 하는 경우, 사용자 정의 NotificationServiceExtension을 생성하고 com.pushwoosh.notification_service_extension 값 아래의 메타데이터에 NotificationServiceExtension의 정규화된 클래스 이름을 포함할 수 있습니다.
<meta-data android:name="com.pushwoosh.notification_service_extension" android:value="com.your.package.YourNotificationServiceExtension" />public class YourNotificationServiceExtension extends NotificationServiceExtension { @Override protected void startActivityForPushMessage(PushMessage message) { // super.startActivityForPushMessage()는 기본 런처 액티비티 또는 // ${applicationId}.MESSAGE 액션으로 표시된 액티비티를 시작합니다. // 이 동작을 재정의하려면 간단히 호출하지 마세요. // super.startActivityForPushMessage(message);
// 대신 사용자 정의 액티비티를 시작합니다: Intent launchIntent = new Intent(getApplicationContext(), YourActivity.class); launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// (선택 사항) 알림 데이터를 액티비티로 전달 launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
context.startActivity(launchIntent); }}푸시 알림 사용자 정의
Anchor link to푸시 알림의 뷰를 사용자 정의하려면 사용자 정의 팩토리를 생성해야 합니다. 사용자 정의 NotificationFactory를 생성하고 com.pushwoosh.notification_factory 값 아래의 메타데이터에 NotificationFactory의 정규화된 클래스 이름을 포함할 수 있습니다.
<meta-data android:name="com.pushwoosh.notification_factory" android:value="com.your.package.YourNotificationFactory" />public class YourNotificationFactory extends PushwooshNotificationFactory { @Override public Notification onGenerateNotification(@NonNull PushMessage pushMessage) { if (customNotification) { // TODO: 사용자 정의 알림 생성 및 반환 }
// 기본 Pushwoosh 알림 반환 return super.onGenerateNotification(pushMessage); }}그룹 요약 사용자 정의
Anchor link to그룹 요약의 모양을 사용자 정의하려면 사용자 정의 팩토리를 생성하세요. 사용자 정의 SummaryNotificationFactory를 생성하고 com.pushwoosh.summary_notification_factory 값 아래의 메타데이터에 SummaryNotificationFactory의 정규화된 클래스 이름을 포함할 수 있습니다.
<meta-data android:name="com.pushwoosh.summary_notification_factory" android:value="com.your.package.YourSummaryNotificationFactory" />public class YourSummaryNotificationFactory extends PushwooshSummaryNotificationFactory { @Override public String summaryNotificationMessage(int notificationsAmount) { // 원하는 메시지 반환 return super.summaryNotificationMessage(notificationsAmount); } @Override public int summaryNotificationIconResId() { // 원하는 아이콘 리소스 ID 반환 return super.summaryNotificationIconResId(); }}프라이빗 엔드포인트 URL
Anchor link toPushwoosh는 Custom Plan 구독 고객을 위해 프라이빗 엔드포인트를 제공합니다. Android SDK용 프라이빗 엔드포인트를 설정하려면 AndroidManifest.xml 파일에 다음을 추가해야 합니다:
<meta-data android:name="com.pushwoosh.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />리치 미디어 큐 생성
Anchor link to동시에 표시할 여러 리치 미디어 페이지가 있는 경우(예: 둘 이상의 인앱에 대한 트리거 이벤트가 동시에 발생하거나, 다른 트리거 이벤트가 발생할 때 이미 리치 미디어 페이지가 표시되고 있는 경우), 리치 미디어 페이지 표시를 위한 큐를 설정할 수 있습니다. 큐를 생성하려면 프로젝트에 다음 코드를 추가하세요:
package com.pushwoosh.testingapp;
import com.pushwoosh.RichMediaManager;import com.pushwoosh.exception.PushwooshException;import com.pushwoosh.richmedia.RichMediaPresentingDelegate;import com.pushwoosh.richmedia.RichMedia;import com.pushwoosh.internal.utils.PWLog;
import java.util.ArrayDeque;import java.util.concurrent.locks.ReentrantLock;
public class DefaultRichMediaPresentingDelegate implements RichMediaPresentingDelegate { private final String TAG = DefaultRichMediaPresentingDelegate.class.getSimpleName(); private ArrayDeque<RichMedia> richMediaQueue = new ArrayDeque<>(); private RichMedia currentRichMedia = null; private ReentrantLock reentrantLock;
public DefaultRichMediaPresentingDelegate() { PWLog.noise(TAG, "new DefaultRichMediaPresentingDelegate:" + this); reentrantLock = new ReentrantLock(); }
@Override public boolean shouldPresent(RichMedia richMedia) { PWLog.noise(TAG, "shouldPresent:" + richMedia); if (currentRichMedia == null) { PWLog.noise(TAG, "currentRichMedia is null"); } if (richMedia.isLockScreen()) { PWLog.noise(TAG, "isLockScreen is true"); return true; } try { reentrantLock.lock(); if (currentRichMedia == null) { PWLog.noise(TAG, "show:" + richMedia); currentRichMedia = richMedia; return true; } else { PWLog.noise(TAG, "add to queue:" + richMedia); richMediaQueue.add(richMedia); return false; } } finally { reentrantLock.unlock(); } }
@Override public void onPresent(RichMedia richMedia) { PWLog.noise(TAG, "onPresent" + richMedia); }
@Override public void onError(RichMedia richMedia, PushwooshException pushwooshException) { PWLog.error(TAG, pushwooshException + " richMedia:"+richMedia.toString()); tryShowNextRichMediaThreadSafety(); }
@Override public void onClose(RichMedia richMedia) { PWLog.noise(TAG, "onClose:" + richMedia); tryShowNextRichMediaThreadSafety(); }
private void tryShowNextRichMediaThreadSafety() { try { reentrantLock.lock(); tryShowNextRichMedia(); } finally { reentrantLock.unlock(); } }
private void tryShowNextRichMedia() { if (!richMediaQueue.isEmpty()) { currentRichMedia = richMediaQueue.poll(); PWLog.noise(TAG, "try manual show:" + currentRichMedia); RichMediaManager.present(currentRichMedia); } else { PWLog.noise(TAG, "richMediaQueue is empty"); currentRichMedia = null; } }}사용자 정의 사운드 푸시
Anchor link to- 오디오 파일을 적절한 폴더에 넣으세요. 네이티브 Android 프레임워크의 경우, 파일은
/app/src/main/res/raw폴더에 위치해야 합니다.
2. 알림 채널을 생성하세요.
3. 푸시 메시지를 구성하는 동안 사운드를 선택하세요.

4. 메시지가 속할 알림 채널을 설정하세요. 이렇게 하려면 “Android root params” 필드에 다음을 지정하세요: {"pw_channel": "PUSH NOTIFICATION CHANNEL NAME"} // _여기에 사용자 정의 사운드가 있는 채널의 이름을 지정해야 합니다_
원격 API를 사용하는 경우, /createMessage API 요청 내에서 파라미터를 다음과 같이 설정하세요:
"android_root_params": {"pw_channel": "push"} // 여기에 사용자 정의 사운드가 있는 채널의 이름을 지정해야 합니다. 예를 들어, push.wav 사운드가 있는 알림의 경우 "push"입니다."android_sound": "push" // 여기에는 확장자 없이 파일 이름을 지정해야 합니다.이러한 파라미터를 지정하여 푸시를 보내면, 선택한 사운드가 있는 알림 채널이 Android 8 이상을 사용하는 모든 기기에 생성됩니다.
이제 사용자 정의 사운드로 푸시를 보내려면 해당 사운드와 연결된 채널만 지정하면 됩니다.
사용자 정의 알림 사운드를 위한 Proguard 규칙
Anchor link to앱이 코드 및 리소스 축소를 위해 proguard를 사용하는 경우, 사운드 파일을 그대로 유지하고 외부 라이브러리에서 사용할 수 있도록 하는 것이 중요합니다. build.gradle에 minifyEnabled = true 속성을 사용하는 경우, proguard-rules.pro에 다음 규칙을 추가하세요:
-keep public class your.package.name.R$raw { *;}shrinkResources=true 속성을 사용하여 코드 축소 외에 앱의 리소스를 축소하는 경우, 유지하려는 리소스를 추가로 지정해야 합니다. 이렇게 하려면 아무 이름으로나 새 XML 파일을 만들고 프로젝트의 어딘가(예: res/xml)에 저장한 다음, resources 태그의 tools:keep 파라미터 아래에 리소스 이름을 지정하세요:
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@raw/*"/>Android SDK 메타데이터 플래그 전체 목록
Anchor link to플래그를 설정하려면 application 태그 내의 AndroidManifest.xml 파일에 메타데이터 블록을 추가해야 합니다. 예를 들어, Pushwoosh 애플리케이션 ID를 설정하려면 AndroidManifest.xml 파일에 다음 코드를 추가하세요:
<meta-data android:name="com.pushwoosh.appid" android:value="XXXXX-XXXXX" />| 플래그 | 설명 | 가능한 값 |
|---|---|---|
| com.pushwoosh.appid | Pushwoosh 애플리케이션 ID를 설정합니다. | XXXXX-XXXXX |
| com.pushwoosh.senderid | Firebase 프로젝트 발신자 ID를 설정합니다. | 123456789000 |
| com.pushwoosh.log_level | 로깅 레벨을 설정합니다. 자세한 내용은 로그 레벨 제어를 참조하세요. | NONE / ERROR / WARN / INFO / DEBUG (기본값) / NOISE |
| com.pushwoosh.base_url | Pushwoosh 서버 기본 URL을 재정의합니다. | https://cp.pushwoosh.com/json/1.3/ (기본값) |
| com.pushwoosh.notification_service_extension | 사용자 정의 NotificationServiceExtension. 자세한 내용은 알림 열기 동작 사용자 정의를 참조하세요. | com.myapp.MyNotificationServiceExtension |
| com.pushwoosh.notification_factory | 사용자 정의 NotificationFactory. 자세한 내용은 푸시 알림 사용자 정의를 참조하세요. | com.myapp.MyNotificationFactory |
| com.pushwoosh.summary_notification_factory | 사용자 정의 SummaryNotificationFactory. | com.myapp.MySummaryNotificationFactory |
| com.pushwoosh.multi_notification_mode | true이면 알림이 그룹화됩니다. false이면 마지막으로 받은 알림만 표시됩니다. | true / false (기본값) |
| com.pushwoosh.allow_server_communication | true이면 SDK가 Pushwoosh 서버로 네트워크 요청을 보낼 수 있습니다. | true (기본값) / false |
| com.pushwoosh.handle_notifications_using_workmanager | true이면 WorkManager가 알림을 처리하도록 설정됩니다. | true / false (기본값) |
| com.pushwoosh.notification_icon | 사용자 정의 알림 (작은) 아이콘 리소스 이름. null이면 기본 애플리케이션 아이콘이 사용됩니다. | res/drawable-xxhdpi-v11/notification_small_icon.png / null |
| com.pushwoosh.notification_icon_color | 알림 (작은) 아이콘 배경색. | #FFFFFF |
| com.pushwoosh.allow_collecting_device_data | true이면 SDK가 기기 데이터를 수집하여 Pushwoosh로 보낼 수 있습니다. | true (기본값) / false |
| com.pushwoosh.allow_collecting_device_os_version | true이면 SDK가 기기 OS 버전을 수집하여 Pushwoosh로 보낼 수 있습니다. | true (기본값) / false |
| com.pushwoosh.allow_collecting_device_locale | true이면 SDK가 기기 로케일을 수집하여 Pushwoosh로 보낼 수 있습니다. | true (기본값) / false |
| com.pushwoosh.allow_collecting_device_model | true이면 SDK가 기기 모델을 수집하여 Pushwoosh로 보낼 수 있습니다. | true (기본값) / false |
| com.pushwoosh.in_app_business_solutions_capping | push-unregister 인앱이 하루에 표시될 수 있는 횟수를 제한합니다. | 1 (기본값), 2, …, n |
| com.pushwoosh.start_foreground_service | true이면 PushwooshLocation.startLocationTracking() 호출과 함께 Foreground Service가 시작됩니다. | true / false (기본값) |
| com.pushwoosh.foreground_service_notification_text | ”com.pushwoosh.start_foreground_service” 키에 대해 Foreground Service가 시작될 때 생성되는 알림의 텍스트를 설정합니다. | Work in progress (기본값) |
| com.pushwoosh.foreground_service_notification_channel_name | ”com.pushwoosh.start_foreground_service” 키에 대해 Foreground Service가 시작될 때 생성되는 알림의 채널 이름을 설정합니다. | Foreground service (기본값) |
| com.pushwoosh.trusted_package_names | 지정된 패키지와 Pushwoosh HWID를 공유할 수 있도록 허용합니다. | ”com.mycompany.myapp1, com.mycompany.myapp2” |
TTL(Time-To-Live)을 통해 푸시 알림 삭제하기
Anchor link toTTL(Time-to-Live)을 사용하여 지정된 시간 후에 푸시 알림을 자동으로 삭제하려면 다음 단계를 따르세요:
-
사용자 정의 NotificationFactory를 생성합니다. 자세히 알아보기
-
onGenerateNotification()메서드에서Notification.Builder또는NotificationCompat.Builder클래스를 사용하여 알림을 생성하고setTimeoutAfter메서드를 호출합니다:
public class YourNotificationFactory extends PushwooshNotificationFactory {
@Override public Notification onGenerateNotification(@NonNull PushMessage pushMessage) { Notification.Builder builder = new Notification.Builder(getApplicationContext(), addChannel(pushData));
Notification notification = builder.setContentText(pushData.getMessage()) .setContentTitle(title) .setContentText(text) // 나머지 알림 생성 코드 .setTimeoutAfter(timeout) // 알림이 취소되기 전의 시간(밀리초) .build(); }}피드백 공유하기
Anchor link to여러분의 피드백은 더 나은 경험을 만드는 데 도움이 됩니다. SDK 통합 과정에서 문제가 발생하면 언제든지 알려주세요. 어려움을 겪으시면 주저하지 마시고 이 양식을 통해 의견을 공유해 주세요.