跳到内容

关于 Pushwoosh Android SDK 的常见问题解答

Android 推送令牌和 HWID 是什么样子的?

Anchor link to

Android 设备推送令牌的长度不同(小于 255 个字符),并以 APA91b 开头,例如:

APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq

令牌通常在 APA91b 前面包含一个以冒号分隔的前缀,例如:eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...

Pushwoosh 使用 UUID 作为 HWID,即随机生成的 32 位字母数字字符串:123e4567-e89b-12d3-a456-426655440000

如何获取我的 Android 设备推送令牌?

Anchor link to

您可以在控制台日志中获取您的 Android 设备推送令牌。请使用 Android Studio 中的 logcat 工具。

打开位于 %USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.batmonitor.bat,将您的设备连接到 PC,并在 Android 设置中允许 USB 调试。在设备上运行您的应用程序。找到 /registerDevice,查找您设备的推送令牌,以便稍后在“测试设备”中使用。

显示 Android Studio 中 logcat 输出以及推送令牌注册信息的屏幕截图

哪些权限是必需的,哪些是可选的?

Anchor link to

当在 Android 设备上安装时,应用程序将请求与 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 to

Pushwoosh 在收到来自 FCM 的 “NotRegistered” 响应后,会从数据库中清除已取消订阅的 Android 设备,这可能在第二次尝试联系特定设备后才会返回。这意味着您必须向一个已取消订阅的设备发送 2 次推送,才能将其从数据库中移除。

以下是 FCM 文档中描述的最常见情况:

  1. 您的订阅者卸载了应用程序。
  2. Pushwoosh 向 FCM 服务器发送一条消息。
  3. FCM 服务器将消息发送到您用户的设备。
  4. 设备上的 FCM 客户端收到消息并检测到您的应用程序已被卸载;检测细节取决于应用程序运行的平台。
  5. 设备上的 FCM 客户端通知 FCM 服务器应用程序已被卸载。
  6. FCM 服务器将注册 ID 标记为待删除。
  7. Pushwoosh 向 FCM 发送另一条消息。
  8. FCM 返回一条 NotRegistered 消息。
  9. 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 to

在 Android Lollipop 中,图标被更改为仅显示白色。因此,如果您在 AndroidManifest.xml 文件中选择 targetSdkVersion >= 21,Android 将只使用图标的 alpha 通道。
更多关于此行为的信息请参阅 Android 文档

系统会忽略操作图标和主通知图标中的所有非 alpha 通道。假设这些图标将仅为 alpha 通道。系统以白色绘制通知图标,以深灰色绘制操作图标。这超出了 Pushwoosh SDK 的控制范围

1. 根据 Android 指南创建通知图标。根据文档,系统将忽略所有颜色。

2. 将图标命名为 pw_notification.png 并将其放入 res/drawable 文件夹中。Pushwoosh SDK 将使用此图标作为通知的默认图标。

3. 或者,您可以使用远程 API 并将 "android_icon" 参数值设置为图标图像(不带文件扩展名)。

将 Pushwoosh SDK 与其他 FCM 服务一起使用

Anchor link to

您可以将 Pushwoosh 与其他使用 FCM 进行推送消息传递的 SDK 一起使用。为此,请创建一个路由器服务以在服务之间分发事件。首先,在主 Pushwoosh 模块旁边添加 pushwoosh-firebase 依赖项:

build.gradle
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)) {
//this is a Pushwoosh push, SDK will handle it automatically
PushwooshFcmHelper.onMessageReceived(this, remoteMessage)
} else {
//this is not a Pushwoosh push, you should handle it by yourself
dispatchNonPushwooshMessage(remoteMessage);
}
}
private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) {
// Implement your push handling logics here
}
}

在您的 AndroidManifest.xml 中注册路由器:

AndroidManifest.xml
<service
android:name=".FirebaseMessagingRouterService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

将 Pushwoosh 与 LeakCanary 或 AppMetrica 库一起使用

Anchor link to

当您集成 LeakCanary、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

如果您想在应用程序内执行特定操作时移除不相关的推送,可以使用以下方法:

MainActivity.java
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;
//cancel pushes only with a specific flag
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 集成过程中遇到任何困难,请通过此表单与我们分享您的想法。