【问题标题】:Cordova - Retrieve local storage from Push Plugin java filesCordova - 从推送插件 java 文件中检索本地存储
【发布时间】:2015-10-27 08:00:11
【问题描述】:

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

在一个特定的 javascript 文件中,我在本地存储中保存了一个名为“类别”的值:

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)

【问题讨论】:

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


    【解决方案1】:

    我最初并没有意识到 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 中,在execute 函数中捕获subscribeToChannel 操作:

    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 中添加 Web 服务调用会更容易。作为另一种选择,如果您不想在后端处理订阅逻辑,您可以查看像 Parse 这样的服务,其中内置了订阅频道的概念。

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2011-11-24
      • 2021-09-02
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多