Android 即使使用不同的折叠键,GCM 也会崩溃

Android GCM collapse even if with different collapse keys

我正在使用 this lib 使用不同的折叠键发送两条不同的消息,但在我的设备上我收到了第一条,然后第二条从第一条过来。

我想在设备上的 Android 通知 header 中将两者分开。

郑重声明,我正在使用 this Phonegap plugin 接收推送通知。

这是我的代码:

    $gcmApiKey = 'api key here';
    $deviceRegistrationId = 'device regid here';
    $numberOfRetryAttempts = 5;

    $collapseKey = '1';
    $payloadData = ['title' => 'First Message Title', 'message' => 'First message'];

    $sender = new Sender($gcmApiKey);
    $message = new Message($collapseKey, $payloadData);

    $result = $sender->send($message, $deviceRegistrationId, $numberOfRetryAttempts);

    // Sending Second message
    $collapseKey = '2';
    $payloadData = ['title' => 'Second Message Title', 'message' => 'Second Message'];

    $sender = new Sender($gcmApiKey);
    $message = new Message($collapseKey, $payloadData);

    $result = $sender->send($message, $deviceRegistrationId, $numberOfRetryAttempts);

如果我没理解错的话,你的问题是第一个通知在显示后被第二个通知取代了。

如果是这样的话,你的错误不在PHP这边,而是你的Java代码。

如果显示通知,请调用此方法:

NotificationManager.notify(int id, Notification notification)

很有可能,您在每次调用此方法时都将 id 参数设置为相同的值。

id 的效果是系统将只显示一个具有相同 ID 的通知 - 最新的。使用与以前相同的 id 的典型用例是更新以前的通知。

如果要显示多个通知,需要每次设置不同的id。您可以使用随机数或更好的方法,但可以使用先前定义的内容 ID。

GCM 折叠键有不同的效果:

When you define a collapse key, when multiple messages are queued up in the GCM servers for the same user, only the last one with any given collapse key is delivered.

这意味着,例如,如果您的 phone 已关闭,您将只会收到一条具有相同折叠键的消息。如果您的 phone 在您发送第二个通知之前收到第一个通知,它不会执行任何操作。

使用 PhoneGap 插件进行设置

该插件的文档非常混乱,但如果我们查看源代码,我们会发现这个未记录的功能:

int notId = 0;
try {
    notId = Integer.parseInt(extras.getString("notId"));
}
mNotificationManager.notify((String) appName, notId, mBuilder.build());

这意味着,如果您将负载更改为,例如:

$payloadData = ['title' => 'First Message Title', 'message' => 'First message', 'notId' => mt_rand()];

您的通知不会相互替换。