【问题标题】:What notification system to use in a chat application?在聊天应用程序中使用什么通知系统?
【发布时间】:2016-10-19 18:00:24
【问题描述】:

我正在使用 Android 中的 Firebase 数据库开发一个聊天应用程序。

我已经完成了核心(聊天和用户列表活动),但我还没有完成通知系统。

我想在使用 Firebase 时实现 Google FCM,但我发现其中有一个漏洞,因为我似乎根本无法处理发送到不在前台的 iOs 应用程序的所有通知。

如在Data notification documentation中找到的

在 iOS 上,FCM 存储消息并仅在应用处于前台并已建立 FCM 连接时传递消息。在 Android 上,客户端应用程序在 onMessageReceived() 中接收数据消息,并可以相应地处理键值对。

即使应用程序在后台,我也需要捕捉数据通知,我特别需要它,因为我想更新应用程序图标上的徽章计数器,让用户知道他有多少未读消息。

我现在正在尝试OneSignal 解决方案即使在后台也可以接收通知,它是免费的并且与 GCM 接口。我很遗憾没有留在 Google,但如果我无法使用 FCM 更新徽章计数,我就不得不另眼相看。

任何考虑将不胜感激。

【问题讨论】:

  • 但 OneSignal 有完全相同的限制,因为这不是 Google 的错,而是 Apple 的设计决定。在 iOS 9 之前,您根本无法在后台处理收到的远程通知。只有在新的 iOS 10 中,Apple 才允许这样做。此外,当通知到达时,系统会自动更新徽章。
  • Receiving Notifications OSHandleNotificationReceivedBlock 当应用收到通知时调用。注意:仅当您的应用处于焦点时才会调用此方法。 如果您需要在您的应用处于后台时调用它,以便在您发送通知时将 content_available 设置为 true。 - 如果 fcm 默认提供此功能,我只需要使用该功能进行徽章计数我可以坚持下去。

标签: android ios notifications


【解决方案1】:

当应用处于后台或由于 FirebaseMessagingService 正在运行而未运行时,使用以下代码从服务器获取徽章。

如果您对在应用图标上显示徽章有任何疑问,请不要发表评论,因为就在昨天我确实在应用图标上显示了徽章。

public class Custom_FirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "FirebaseMsgService";
    //private Activity strPushClickDesti;
    String activityName;

    @Override
    public void zzm(Intent intent) {
        Log.i("uniqbadge", "zzm");
        Set<String> keys = intent.getExtras().keySet();
        for (String key : keys) {
            try {
                 Log.i("uniq", " " + key + " " + intent.getExtras().get(key));
                if (key.equals("badge")) {
                    String cnt = intent.getExtras().get(key).toString();
                    int badgeCount = Integer.valueOf(cnt);
                    Log.i("uniq", " badge count " + badgeCount);
                    ShortcutBadger.applyCount(this, badgeCount);
                    Log.i("uniq", " " + "end");
                }
            } catch (Exception e) {
                Log.i("uniqbadge", "zzm Custom_FirebaseMessagingService" + e.getMessage());
            }
        }

        super.zzm(intent);
    }

【讨论】:

  • zzz() 方法到底是做什么的?
【解决方案2】:

事实上,OneSignal 探索了一个特性来实现这种行为。它是notification payload 中的content-available 值。好消息是 iOS 7 及更高版本原生。所以如果你可以在FCM中自定义payload,是可以的。只需在background modes 中激活remote-notification 并在application(didReceiveRemoteNotification:fetchCompletionHandler:) 中处理徽章更新即可。

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2018-11-14
    • 2017-02-26
    相关资源
    最近更新 更多