Cordova - 从Push Plugin java文件中检索本地存储

时间:2015-10-26 15:24:05

标签: java android cordova local-storage phonegap-pushplugin

我正在使用Cordova编写移动应用程序。我正在使用Push Plugin实现推送通知。该应用程序适用于所有平台,但目前我正在Android和Windows上进行测试。

在一个特定的javascript文件中,我保存一个值,在localstorage中调用它为“category”:

localStorage.setItem("category", JSON.stringify(categoryarray));

现在,在发送推送通知时,该类别对于决定是否显示通知至关重要。如果用户订阅了该特定类别,则显示通知,否则不显示。为此我只创建一个条件并检查用户是否订阅了通知中包含的类别(但这与问题的重点无关)。当应用程序运行时,可以在javascript中处理此条件。当应用程序未运行时,将在java代码中处理:

else {
            extras.putBoolean("foreground", false);

            // Send a notification if there is a message
            if (extras.getString("message") != null && extras.getString("message").length() != 0) {
                createNotification(context, extras);
            }
        }

现在我想从该实例的本地存储中获取当应用程序未运行时推送通知的值(并且能够检查是否应该显示通知)。

我进入了这个链接:Android Service reads localStorage?

但它似乎是针对Android本机代码(对webview的引用)。除此之外,我还没有真正理解它是如何工作的,而且如果它适用于我的问题。

你有什么建议?我该怎么办?

编辑:我最初没有意识到Push插件java代码不会使用Cordova应用程序编译。因此,编辑可从Cordova目录中检索的代码实际上是无用的。除非,某人仍可以提出建议,否则我知道这是一个无法回答的问题。将不得不重新尝试为此目的创建API并处理谁在服务器端接收哪个通知! (我采用这种方法的原因是因为我没有设法为通知目的创建API)

1 个答案:

答案 0 :(得分:0)

  

我最初没有意识到Push插件java代码不会使用Cordova应用程序编译。因此,编辑可从Cordova目录中检索的代码实际上是无用的。除非有人仍能提出建议,否则我知道这是一个无法解决的问题。

这不是真的,编译Cordova应用程序时会编译Cordova插件代码。所有Cordova插件都提供了本地源代码,当您运行cordova build(或cordova run <platform>)时,该代码会被编译到应用程序中。

如果您想在客户端完全解决这个问题(而不是管理用户在后端订阅的类别,而只是在用户订阅了某个类别时发送通知),您可以将PushPlugin扩展为管理类别订阅。

粗略草图:

PushNotification.js中,添加订阅频道的方法:

PushNotification.prototype.subscribeToChannel(successCallback, errorCallback, channel) {
    cordova.exec(successCallback, errorCallback, "PushPlugin", "subscribeToChannel", [{channel: channel}]);
}

PushPlugin.java中抓住subscribeToChannel函数中的execute操作:

public boolean execute(String action, JSONArray data, CallbackContext callbackContext) {
...
    if ("subscribeToChannel".equals(action)) {
        //get the attached data
        JSONObject jo = data.getJSONObject(0);
        String channel = (String) jo.get("channel");
        addChannelToSubscriptions(channel);
    }
...
}

public void addChannelToSubscriptions(String channel) {
    //store as a list in a sharedpreferences list
}

然后,当收到通知时,您可以检查该频道是否是已订阅的频道。

// Send a notification if subscribed to the channel
if (extras.getString("channel") != null && isSubscribedTo(extras.getString("channel"))) {
    createNotification(context, extras);
}

public boolean isSubscribedTo(String channel) {
    //see if the channel is in the shared preferences.
}

就我个人而言,我认为在后端管理订阅更容易,以便在应用中管理订阅,您必须为您支持的每个平台实施此逻辑。在Javascript中添加webservice调用会更容易。作为另一种选择,如果您不想在后端处理订阅逻辑,您可以查看像Parse这样的服务,其中订阅频道的概念已内置到服务中。