GCM Cordova推送通知在应用程序未运行时无法正常工作

7
该应用程序使用PhoneGap开发。我正在使用https://github.com/marknutter/GCM-Cordova的推送通知功能。
我已经实现了整个功能,并且直到昨天一切正常。但是,当我昨天检查应用程序时,推送通知在应用程序未运行时无法正常工作。所有通知都会在我的设备上接收,点击消息可以打开应用程序,但是JavaScript部分不会接收到消息通知处理的控件。
文件GCMIntentService.java中的代码:
JSONObject json;
json = new JSONObject().put("event", "message");

json.put("message", extras.getString("message"));
json.put("link", extras.getString("link"));

Log.v(ME + ":onMessage ", json.toString());

GCMPlugin.sendJavascript( json );
// Send the MESSAGE to the Javascript application

当收到消息时,此代码将起作用。但此时,应用程序并未运行。

当我点击通知消息时,应用程序像往常一样打开,但没有注册消息事件;因此无法在JavaScript中获得控件以处理推送通知。

CORDOVA_GCM_script.js的代码可以在以下位置找到:

https://github.com/marknutter/GCM-Cordova/blob/master/assets/www/CORDOVA_GCM_script.js

注意:当应用程序运行时,它可以正常工作。

编辑: 通知有时会运行。JavaScript 随机获取消息事件。

编辑2:

我确实知道问题所在。

从 Java 文件中,它在通过单击推送通知消息打开应用程序时触发 JavaScript 代码。但是此时 WebView 尚未加载,因此无法执行脚本(这是一个事件触发器)。如果是这种情况,则使用该插件的每个人都会遇到相同的问题。是否有任何解决方法或修复方法?

我做错了什么吗?


推送通知的重点在于它在您的应用程序未运行时在后台运行。因此,如果您的应用程序未运行,在这种情况下,它是一个WebView,我认为它不会从本机端接收任何内容,因为JVM不会在后台运行WebView,这就解释了为什么您的JS部分在应用程序未运行时不运行。您必须考虑在接收推送通知时将通知数据存储在共享首选项或其他地方;每次启动应用程序时检查它,以便您可以对其做出反应。 - praneetloke
这是一个常见的实现,我没有发现其他人报告的任何问题,这让我感到困惑。 - IvenMS
3个回答

4
使用GCM-Cordova插件时,如果应用程序未运行,则通知不会正确处理。这是因为在插件初始化javascript时WebView尚未加载。
解决方案: 1. 修改插件代码以将消息数据保存为临时数据。 2. 创建另一个带有读取已加载数据和清除数据方法的插件。 3. 在deviceready上调用自定义插件方法并检查是否有数据。 4. 如果有数据,则清除本地存储的数据并调用显示通知消息的方法。
最终,使用两个插件 - GCM-Cordova和自定义插件成功解决了此问题。

2
这对我来说并不能解决问题,因为我在消息中发送的数据用于在手机上设置闹钟,用户可能不会重新访问应用程序。 - BallisticPugh
如果您正在创建自定义插件,那么它将在通知到达(或用户单击通知)时运行。您可以在自定义插件代码中设置警报代码。我想分享我的代码,但我在一家IT公司工作,代码受到严格保护。 - IvenMS
很不幸,我现在有很多代码坐在JavaScript回调函数里面,重写所有东西将是一项重大的工作,而我根本没有时间。我的解决方案,虽然不太理想,但是是在接收到推送消息时启动应用程序(如果它没有运行),然后等待五秒钟让它加载,然后处理推送。这个方法可以工作,但显然用户不会对他们的应用程序在没有触发的情况下启动感到满意。 - BallisticPugh
我也尝试过这种方法。但对于我的特定需求,这种方法不适用。 - IvenMS

3
我找到了一个简单的解决方案。 在GCMIntentService中,在发送JavaScript之前,只需要检查webview是否已经加载:
while (GCMPlugin.gwebView == null || GCMPlugin.gwebView.webView == null || !GCMPlugin.gwebView.webView.isEnabled()) {
    // Wait until webView is enabled
}
GCMPlugin.sendJavascript(json);

这对我有用...也许在代码中添加超时时间是一个不错的选择,以防止无限循环(虽然不应该发生...)

Davide


3

IvenMS - 我也遇到了同样的问题,所以你并不是唯一一个。如果我正确理解praneetloke的话,Push通知在PhoneGap应用程序当前未运行时将无法工作。


没有不运行应用程序的情况。该应用程序将始终在后台运行,或其实例将运行。当消息从服务器推送时,应用程序将获得控制并在Java代码中注册消息。我可以通过JavaCode看到日志记录。该代码还尝试调用JavaScript。此时,WebView未加载。单击通知消息时,应用程序将加载,因此WebView也将加载。但是在那时,通知事件(在接收通知时由JavaCode初始化)将不会被调用。 - IvenMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接