我正在尝试将推送通知添加到 Google App Engine 服务器,但我遇到了一个奇怪的问题,即设备只接收每秒一次的推送通知。
我已经设置了一个推送队列来在后端发送通知。每个实例的第一个请求创建一个后台线程,该线程将推送和发送它们排队。然后每个推送请求将请求添加到队列中,等待推送发送,然后使用代码 200 表示成功或代码 500 表示失败。这是我的后台线程代码:
void doSendThread() {
// Open certificate (certificate is a class URL var)
InputStream cert = certificate.openStream();
// Connect to Apple Push service (password and apnsManager are class vars)
AppleNotificationServer appleServer = new AppleNotificationServerBasicImpl(cert, password, ConnectionToAppleServer.KEYSTORE_TYPE_PKCS12, "gateway.push.apple.com", 2195);
apnsManager = new PushNotificationManager();
apnsManager.initializeConnection(appleServer);
// Send loop
while (true) {
// Wait for a bit
Thread.sleep(500);
// Check for new pushes in queue (pushQueue is a class ArrayDequeue var)
while (!pushQueue.isEmpty()) {
// Get next push data (PushData is a custom class that holds the push notification state)
PushData data = pushQueue.poll();
// Send data (the HTTP request thread stops waiting when data.done is true)
sendPushData(data);
data.done = true;
}
}
// There's also some feedback checking stuff here which I've left out
...
}
void sendPushData(PushData) {
try {
// Get tokens
Logger.getLogger(PushManager.class.getName()).log(Level.INFO, "Sending push...");
List<Device> devices = Devices.asDevices(data.tokens);
// Create payload
PushNotificationPayload payload = PushNotificationPayload.complex();
if (data.text.length() > 0)
payload.addAlert(data.text);
if (data.badge > 0)
payload.addBadge(data.badge);
if (data.sound.length() > 0)
payload.addSound(data.sound);
// Go through devices and send each push
for (Device dev : devices) {
// Send payload and don't close the connection
PushedNotification pn = apnsManager.sendNotification(dev, payload, false);
// Check for error (HTTP thread returns 500 if data.error is true)
if (!pn.isSuccessful())
data.error = true;
// Log error
if (pn.getException() != null)
Logger.getLogger(PushManager.class.getName()).log(Level.SEVERE, "Push error: " + pn.getException().getMessage());
}
} catch (Exception e) {
Logger.getLogger(PushManager.class.getName()).log(Level.SEVERE, "Push error: " + e.getMessage());
e.printStackTrace();
disconnect(); // <- Disconnects the apnsManager and shuts down the thread, the next push request will create a new thread and reconnect
data.error = true;
}
}
在 GAE 上进行日志记录很困难,因为只有在实例关闭后日志才会通过后台线程,但如果我使用应用程序发送 5 次推送然后关闭实例,这就是我的日志:
W 2014-01-13 13:41:18.028 [s~*****chat/push-notification-worker.373021320690690677].<stderr>: log4j:WARN No appenders could be found for logger (javapns.communication.Connecti
W 2014-01-13 13:41:18.028 [s~*****chat/push-notification-worker.373021320690690677].<stderr>: log4j:WARN Please initialize the log4j system properly.
W 2014-01-13 13:41:18.028 [s~*****chat/push-notification-worker.373021320690690677].<stderr>: log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more inf
I 2014-01-13 13:41:19.222 com.*****apps.*****Server.Push.PushManager sendPushData: Sending push...
I 2014-01-13 13:41:23.027 com.*****apps.*****Server.Push.PushManager sendPushData: Sending push...
I 2014-01-13 13:41:23.663 com.*****apps.*****Server.Push.PushManager sendPushData: Sending push...
I 2014-01-13 13:41:24.225 com.*****apps.*****Server.Push.PushManager sendPushData: Sending push...
I 2014-01-13 13:41:24.790 com.*****apps.*****Server.Push.PushManager sendPushData: Sending push...
I 2014-01-13 13:42:25.022 com.*****apps.*****Server.Push.PushManager disconnect: Shutting down push manager...
...所以看起来它正在发送所有 5 个,但我只收到第二个和第四个通过设备。真正奇怪的是,每次推送实际上发送 2 次推送,因为我有 2 台设备(因此实际上向 Apple 发送了 10 条推送通知),并且它要么同时接收消息,要么不接收消息,而不仅仅是一个。