【问题标题】:GCM Cordova Push Notification not working when App not running当应用程序未运行时,GCM Cordova 推送通知不起作用
【发布时间】:2012-10-10 19:18:20
【问题描述】:

应用程序位于 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,所以无法执行脚本(这是一个事件触发器)。是不是这种情况,每个使用插件的人都会有同样的体验。有什么解决方法或解决方法吗?

我做错了什么吗?

【问题讨论】:

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

标签: android cordova push-notification google-cloud-messaging


【解决方案1】:

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

【讨论】:

  • 没有什么比不运行应用程序更好的了。该应用程序将一直在后台运行,或者它的实例将运行。当消息从服务器推送时,应用程序将获得控制权并在 JavaCode 中注册消息。我可以看到使用 JavaCode 的日志记录。该代码还尝试调用 javascript。那时,webview 没有加载。单击通知消息时,应用程序将加载,因此 web 视图。但此时通知事件(JavaCode在收到通知时发起)不会调用。
【解决方案2】:

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

解决方案:

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

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

【讨论】:

  • 这不会解决我的问题,因为我在消息中发送的数据用于在手机上设置警报,用户可能不会重新访问该应用程序。
  • 如果您正在创建自定义插件,那么它将在通知到达(或用户点击通知)时运行。您可以在自定义插件代码中设置警报代码。我想分享我的代码,但我在一家 IT 公司工作,代码受到严格保护。
  • 不幸的是,我现在有很多代码位于 javascript 回调函数中,重写所有内容将是一项艰巨的工作,我根本没有时间。我的解决方案(这不太理想)是在收到推送消息时启动应用程序(如果它没有运行),然后等待五秒钟以使其加载,然后处理推送。有效,但显然用户不会对他们的应用在没有触发的情况下启动而印象深刻。
  • 我也尝试过这种方法。但是对于我的具体要求,这种方法是行不通的。
【解决方案3】:

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

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

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

大卫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多