Pushwoosh Android SDK에 대한 FAQ
- Android 푸시 토큰과 HWID는 어떻게 생겼나요?
- Android 기기 푸시 토큰은 어떻게 얻을 수 있나요?
- 어떤 권한이 필수이고 어떤 것이 선택 사항인가요?
- UserID는 어떻게 설정하나요?
- 총 Android 구독자 수는 얼마나 정확한가요?
- Android로 보내는 푸시에 HTML 태그를 사용할 수 있나요?
- Android Lollipop(및 이후 버전)에서 알림 아이콘을 어떻게 설정하나요?
- 다른 FCM 서비스와 함께 Pushwoosh SDK 사용하기
- LeakCanary 또는 AppMetrica 라이브러리와 함께 Pushwoosh 사용하기
- 기기에서 수신된 특정 알림 삭제하기
Android 푸시 토큰과 HWID는 어떻게 생겼나요?
Anchor link toAndroid 기기 푸시 토큰은 길이가 다르며(255자 미만) APA91b로 시작합니다. 예:
APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq
토큰에는 종종 APA91b 앞에 콜론으로 구분된 접두사가 포함됩니다. 예: eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...
Pushwoosh는 HWID로 UUID를 사용합니다. 즉, 32개의 영숫자로 구성된 무작위로 생성된 문자열입니다: 123e4567-e89b-12d3-a456-426655440000
Android 기기 푸시 토큰은 어떻게 얻을 수 있나요?
Anchor link to콘솔 로그에서 Android 기기 푸시 토큰을 얻을 수 있습니다. Android Studio의 logcat 도구를 사용하세요.
%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat에서 monitor.bat를 열고, 기기를 PC에 연결한 후 Android 설정에서 USB 디버깅을 허용하세요. 기기에서 애플리케이션을 실행하세요. /registerDevice를 찾아 나중에 Test Devices에서 사용할 기기의 푸시 토큰을 찾으세요.

어떤 권한이 필수이고 어떤 것이 선택 사항인가요?
Anchor link toAndroid 기기에 설치될 때, 애플리케이션은 Pushwoosh SDK와 관련하여 다음 권한을 요청합니다:
<!-- FCM은 Firebase 서비스에 연결됩니다. --> <uses-permission android:name="android.permission.INTERNET"/>
<!-- 메시지 수신 시 프로세서가 절전 모드로 전환되는 것을 방지합니다. --> <uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- 이 권한은 기기가 네트워크에 액세스할 수 있는지 확인하는 데 사용됩니다. --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 이 앱은 데이터 메시지를 등록하고 수신할 권한이 있습니다. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />저희 SDK는 이미지, 기기 연락처 등에 대한 접근 권한을 요청하지 않습니다.
UserID는 어떻게 설정하나요?
Anchor link to사용자 식별자(UserID)를 설정할 수 있으며, 이는 Facebook ID, 사용자 이름, 이메일 또는 기타 고유한 사용자 ID가 될 수 있습니다. 이를 통해 동일한 사용자와 연결된 여러 기기에서 데이터와 이벤트를 일치시킬 수 있습니다. UserID를 설정하려면 setUserId 메서드를 호출하세요.
예시
Pushwoosh.getInstance().setUserId("testUser");총 Android 구독자 수는 얼마나 정확한가요?
Anchor link toPushwoosh는 FCM으로부터 “NotRegistered” 응답을 받으면 구독 취소된 Android 기기를 데이터베이스에서 삭제합니다. 이 응답은 특정 기기에 두 번째 도달 시도 후에 반환될 수 있습니다. 즉, 구독 취소된 기기를 데이터베이스에서 제거하려면 해당 기기에 푸시를 2번 보내야 합니다.
다음은 FCM 문서에 설명된 가장 일반적인 시나리오입니다:
- 구독자가 앱을 제거합니다.
- Pushwoosh가 FCM 서버로 메시지를 보냅니다.
- FCM 서버가 사용자 기기로 메시지를 보냅니다.
- 기기의 FCM 클라이언트가 메시지를 수신하고 애플리케이션이 제거되었음을 감지합니다. 감지 세부 정보는 앱이 실행되는 플랫폼에 따라 다릅니다.
- 기기의 FCM 클라이언트가 FCM 서버에 앱이 제거되었음을 알립니다.
- FCM 서버가 등록 ID를 삭제 대상으로 표시합니다.
- Pushwoosh가 FCM에 다른 메시지를 보냅니다.
- FCM이 NotRegistered 메시지를 반환합니다.
- Pushwoosh가 사용자 기반에서 푸시 토큰을 제거합니다.
등록 ID가 FCM에서 완전히 제거되기까지 시간이 걸릴 수 있습니다. 따라서 위 7단계에서 보낸 메시지가 클라이언트 앱에 전달되지 않더라도 유효한 메시지 ID를 응답으로 받을 수 있습니다.
Android로 보내는 푸시에 HTML 태그를 사용할 수 있나요?
Anchor link to예, Android에서는 다음 HTML 태그를 사용하여 푸시의 모양을 수정할 수 있습니다:
<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!Hello hi hey</span></i></b></span>이 HTML 태그를 메시지 입력 필드에 넣고 API 요청에서도 사용하세요. 일부 Android 기기는 이러한 HTML 태그를 제대로 처리하지 못할 수 있지만, 대부분의 기기는 서식을 올바르게 표시합니다.
Android Lollipop(및 이후 버전)에서 알림 아이콘을 어떻게 설정하나요?
Anchor link toAndroid Lollipop에서는 아이콘이 흰색으로만 변경되었습니다. 따라서 AndroidManifest.xml 파일에서 targetSdkVersion >= 21을 선택하면 Android는 아이콘의 알파 채널만 사용합니다.
이 동작에 대한 자세한 내용은 Android 문서를 참조하세요.
시스템은 액션 아이콘과 주 알림 아이콘의 모든 비알파 채널을 무시합니다. 이러한 아이콘은 알파 전용이라고 가정하세요. 시스템은 알림 아이콘을 흰색으로, 액션 아이콘을 어두운 회색으로 그립니다. 이는 Pushwoosh SDK의 제어 범위를 벗어납니다.
1. Android 가이드라인에 따라 알림 아이콘을 만드세요. 문서에 따르면 시스템은 모든 색상을 무시합니다.
2. 아이콘 이름을 pw_notification.png로 지정하고 res/drawable 폴더에 넣으세요. Pushwoosh SDK는 이 아이콘을 알림의 기본값으로 사용합니다.
3. 또는 Remote API를 사용하여 "android_icon" 매개변수 값을 아이콘 이미지(파일 확장자 제외)로 설정할 수 있습니다.
다른 FCM 서비스와 함께 Pushwoosh SDK 사용하기
Anchor link toPushwoosh를 푸시 메시징에 FCM을 사용하는 다른 SDK와 함께 사용할 수 있습니다. 그렇게 하려면 서비스 간에 이벤트를 분배하는 라우터 서비스를 만드세요. 먼저, 기본 Pushwoosh 모듈과 함께 pushwoosh-firebase 종속성을 추가하세요:
implementation 'com.pushwoosh:pushwoosh-firebase:6.0.3'라우팅 클래스를 만드세요:
import com.pushwoosh.firebase.PushwooshFcmHelper;
class FirebaseMessagingRouterService : FirebaseMessagingService() {
override fun onNewToken(token: String?) { super.onNewToken(token) PushwooshFcmHelper.onTokenRefresh(token) sendTokenToAnotherService(token) }
override fun onMessageReceived(remoteMessage: RemoteMessage) { if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) { //이것은 Pushwoosh 푸시이며, SDK가 자동으로 처리합니다 PushwooshFcmHelper.onMessageReceived(this, remoteMessage) } else { //이것은 Pushwoosh 푸시가 아니므로 직접 처리해야 합니다 dispatchNonPushwooshMessage(remoteMessage); } }
private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) { // 여기에 푸시 처리 로직을 구현하세요 }}import com.pushwoosh.firebase.PushwooshFcmHelper;
public class FirebaseMessagingRouterService extends FirebaseMessagingService {
@Override public void onNewToken(String token) { super.onNewToken(token); PushwooshFcmHelper.onTokenRefresh(token); sendTokenToAnotherService(token); }
@Override public void onMessageReceived(RemoteMessage remoteMessage) { if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) { //이것은 Pushwoosh 푸시이며, SDK가 자동으로 처리합니다 PushwooshFcmHelper.onMessageReceived(this, remoteMessage); } else { //이것은 Pushwoosh 푸시가 아니므로 직접 처리해야 합니다 dispatchNonPushwooshMessage(remoteMessage); } }
private void dispatchNonPushwooshMessage(RemoteMessage remoteMessage) { // 여기에 푸시 처리 로직을 구현하세요 }}AndroidManifest.xml에 라우터를 등록하세요:
<service android:name=".FirebaseMessagingRouterService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter></service>LeakCanary 또는 AppMetrica 라이브러리와 함께 Pushwoosh 사용하기
Anchor link toLeakCanary, AppMetrica 또는 기타 분석 도구를 통합하면 이러한 라이브러리가 새 프로세스를 시작하여 앱의 새 인스턴스를 만듭니다. 다른 프로세스에서 푸시 알림을 수신할 수 없으므로 java.lang.NullPointerException이 발생합니다.
Application.onCreate() 내에서 registerForPushNotifications를 호출하는 경우, 애플리케이션의 주 프로세스에 있는지 확인해야 합니다. 다음 코드를 사용하여 이 확인을 수행하세요:
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();if (runningAppProcesses != null && runningAppProcesses.size() != 0) { for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) { boolean isCurrentProcess = runningAppProcessInfo.pid == android.os.Process.myPid(); boolean isMainProcessName = getPackageName().equals(runningAppProcessInfo.processName); if (isCurrentProcess && isMainProcessName) {
Pushwoosh.getInstance().registerForPushNotifications(...); break; } }}기기에서 로컬로 수신된 특정 알림 삭제하기
Anchor link to애플리케이션 내에서 특정 작업을 수행할 때 관련 없는 푸시를 제거하려면 다음 접근 방식을 사용할 수 있습니다:
public class MainActivity extends AppCompatActivity {
List<NotificationCreatedEvent> savedPushes = new ArrayList<>();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Pushwoosh.getInstance().registerForPushNotifications();
PushwooshNotificationSettings.setMultiNotificationMode(true);
findViewById(R.id.clear_button).setOnClickListener( v -> { cancelPushes(); });
EventBus.subscribe(NotificationCreatedEvent.class, event -> { try { if (event.getMessage().getCustomData() == null) return;
//특정 플래그가 있는 푸시만 취소합니다 if (new JSONObject(event.getMessage().getCustomData()).getBoolean("cancel")) { savedPushes.add(event); } } catch (JSONException e) { } }); } private void cancelPushes() { NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
if (manager == null) { return; }
for (NotificationCreatedEvent event : savedPushes) { manager.cancel(event.getMessageTag(), event.getMessageId()); } }}피드백을 공유해주세요
Anchor link to여러분의 피드백은 더 나은 경험을 만드는 데 도움이 됩니다. SDK 통합 과정에서 어려움을 겪으셨다면, 이 양식을 통해 의견을 공유해주세요.