Cordova - 关闭通知将丢失其中的数据

Posted

技术标签:

【中文标题】Cordova - 关闭通知将丢失其中的数据【英文标题】:Cordova - Dismissing a notification will lose the data inside it 【发布时间】:2015-03-08 20:40:54 【问题描述】:

在使用 ionic 框架和 ngCordova 插件进行开发时,我在 android 上使用 cordova 时遇到了不好的行为。 使用 PushPlugin 插件,我能够使用 GCM 接收通知。 当应用程序处于后台并收到通知时,我可以在不进入应用程序的情况下将其关闭,但是,当我启动应用程序时,我不知道收到的新数据(并已关闭) 有没有办法保留数据?我需要它,因为它不仅是一个通知,还有我稍后需要在 UI 上显示的数据。

【问题讨论】:

你在哪个平台有这个问题?在 ios 上它是这样工作的,但在 android 上,我认为即使它被解除,你也应该能够获得推送。 很高兴知道它在 IOS 中是如何工作的,我不知道。但在我的情况下,我在 Android 中尝试它。我开始研究一个角度来挖掘 java 代码并使用 localStorage 作为我的应用程序的接口,但也许因为它与 ios 相同,所以我应该做不同的事情。 在 android 上,应用程序获取推送消息并显示它,因此您可以查看插件代码并进行一些更改以在接收到推送数据时对其进行持久化。但这将涉及以本机方式存储它们(如 sqlite 数据库),然后使用另一个插件来获取通知,这并不容易 【参考方案1】:

很遗憾,这是不可能的。如果用户单击通知,您可以执行一些代码。如果用户关闭它,您的应用永远不会知道。

我将如何构建该功能是拥有一个包含用户需要查看的所有信息的数据库。当用户看到信息(通过打开通知或其他方式)时,调用服务器并将该内容标记为已读。

这样您就可以在应用启动时调用您的服务器以获取内容列表以显示给用户。如果点击通知,您可以将它们直接带到该数据,然后点击服务器并将其标记为“已查看”,或其他任何内容。

希望有帮助,祝你好运!

【讨论】:

这是我想到的一个选项,但让人感觉“延迟”,因为用户知道数据已收到,现在当他打开应用程序时,他需要等待几秒钟直到他得到再次数据。也许,可以从android访问localStorage吗?我知道 android 编码(我实际上是在 ionic 中重新编写我的应用程序以便同时拥有两个平台 - android 和 ios),也许我可以在 gcmIntentService 中编写一些代码来访问我的 webView 的 localStorage? 是的,你可以通过调用类似的方法访问本地存储:window.localStorag 我没有时间编辑我的最后一条评论,所以这里是:是的,您可以通过调用类似的方法访问本地存储: var newData = window.localStorage.yourVariable; “Angular”方法是使用他们的包装器 $window,因为它内置了 Promise。您需要在控制器或服务中包含 $window 作为依赖项。它可能看起来像这样:.factory('dataService', function ($q, $window) return newData = $window.localStorage.yourVariable; ); 您在谈论如何从角度处理 localStorage。我知道,这就是我存储数据的方式。我想知道是否可以从 android gcm 服务中访问相同的 localStorage? 哦,我明白你在说什么。您应该能够访问本地存储。您在 window.localStorage 对象中存储的任何内容实际上都存储在 SQLLite 数据库文件中:data/data//app_database/file_0.localstorage。我假设您可以从 gcm 服务中访问它。希望有帮助!这是我找到该路径的地方:wpcertification.blogspot.com/2012/07/…【参考方案2】:

如果应用程序在后台,您可以通过修改插件以缓存来自服务器的内容来实现此行为。这样,即使通知被驳回,您也会收到消息。阅读我的answer 修改插件。

通过添加PushPlugin.sendExtras(extras) 修改此function,无论应用程序处于前台还是后台,都将发送数据。

protected void onMessage(Context context, Intent intent) 
    Log.d(TAG, "onMessage - context: " + context);
    Bundle extras = intent.getExtras();
    if (extras != null)
    
        if (PushPlugin.isInForeground()) 
            extras.putBoolean("foreground", true);
        
        else 
            extras.putBoolean("foreground", false);
            if (extras.getString("message") != null && extras.getString("message").length() != 0) 
                createNotification(context, extras);
            
        
        // call sendExtras always
        PushPlugin.sendExtras(extras);
    

【讨论】:

以上是关于Cordova - 关闭通知将丢失其中的数据的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 应用程序的 API 服务器 CORS 白名单

如何在 Cordova 到达并且应用程序关闭时处理推送通知

cordova、Firebase、FCM 插件 - 在 iOS 的通知栏中不显示通知

cordova ios 位置定位 通知 怎么去掉

无法获得缺少的 gcm 推送通知

在 iOS 中使用 PushPlugin for Cordova 清除单个通知