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

收到消息后,此代码将起作用。但当时,App 没有运行。

当我点击通知消息时,应用程序照常打开,不注册消息事件;从而无法在 JavaScript 中获得控制来处理推送通知。

CORDOVA_GCM_script.js 的代码可在以下位置获得:

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

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

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

编辑2:

我绝对知道问题所在。

从 java 文件中,它在通过单击推送通知消息打开应用程序时触发 javascript 代码。但是当时没有加载WebView,所以无法执行脚本(这是一个事件触发器)。是不是这种情况,每个使用插件的人都会有同样的体验。是否有任何解决方法或解决方法?

我做错什么了吗?

4

3 回答 3

4

如果应用程序未运行,使用 GCM-Cordova 插件将无法正确处理通知。这是因为在插件启动javascript时没有加载WebView。

解决方案:

  • 修改插件代码,在通知到达时将消息数据临时保存。
  • 创建了另一个插件,该插件具有读取此加载数据和清除数据的方法。
  • 在 deviceready 上调用我的自定义插件方法并检查是否有任何数据。
  • 如果有,清除本地存储的数据并调用显示通知消息的方法。

终于能够在两个插件的帮助下解决这个问题 - GCM-Cordova 和自定义插件。

于 2012-11-08T19:01:00.933 回答
3

IvenMS - 我也有同样的问题,所以你不是唯一的。如果我正确理解 praneetloke,推送通知将不适用于当前未运行的 PhoneGap 应用程序。

于 2012-10-29T01:51:02.560 回答
3

我找到了一个简单的解决方案。在 GCMIntentService 中,在发送 javascript 之前检查 webview 是否已加载:

while (GCMPlugin.gwebView == null || GCMPlugin.gwebView.webView == null || !GCMPlugin.gwebView.webView.isEnabled()) {
    // Wait until webView is enabled
}
GCMPlugin.sendJavascript(json);

这对我有用......也许添加超时以防止无限循环是一个不错的选择(它不应该发生但是......)

戴维德

于 2013-02-03T11:19:05.243 回答