如何使用 Flutter 在 iOS 上拥有持久的徽章图标

Posted

技术标签:

【中文标题】如何使用 Flutter 在 iOS 上拥有持久的徽章图标【英文标题】:How to have persistent badge icon on iOS using Flutter 【发布时间】:2019-04-22 15:05:44 【问题描述】:

是否可以使用flutter在打开和关闭应用程序后将通知徽章保留在应用程序图标上?例如:用户的徽章值为 6,打开应用阅读一条消息,关闭应用,徽章现在读取为 5。

如何实现此功能? (专门找ios解决方案,如果有小贴士也有兴趣听听android端)

【问题讨论】:

我觉得可以通过Shared Preferences来实现。您可以使用布尔值来指示是否已阅读消息,然后在新消息打勾或用户已阅读消息时遍历首选项。 我的问题是如何让iOS在应用打开后不释放任何徽章而不是消息的确切实现。 据我所知,徽章计数只能从服务器端发送通知。我们正在尝试相同的结果,但没有收到带有其他(标题和正文)数据的 iOS 应用程序的徽章计数。如果您的问题解决了,您可以在这里重播吗? 【参考方案1】:

实现此目的的一种方法是使用flutter_app_badger 包,它允许您使用updateBadgeCount 函数设置应用程序徽章。诀窍是,当您的应用程序处于前台时,您需要至少调用一次此函数,然后再将应用程序置于后台或关闭。一种方法是在小部件树顶部的一个小部件中扩展 WidgetsBindingObserver 并覆盖 didChangeAppLifecycleState

class HomeScreen extends StatefulWidget 
  @override
  State<StatefulWidget> createState() => _HomeScreenState();


class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver 

  @override
  void initState() 
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  

  @override
  void dispose() 
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) 
    switch (state) 
      case AppLifecycleState.resumed:
        print("app in resumed");

        if (PushNotificationsManager.appBadgeSupported) 
          FlutterAppBadger.updateBadgeCount(14);
        

        break;
      case AppLifecycleState.inactive:
        print("app in inactive");

        break;
      case AppLifecycleState.paused:
        print("app in paused");

        break;
      case AppLifecycleState.detached:
        print("app in detached");

        break;
    
  

应用程序徽章不会自行保留,这就是为什么每次应用程序处于前台时您都需要至少调用一次此函数,而当AppLifecycleState 更改时,在didChangeAppLifecycleState 中执行此操作的好地方。如果您像上面一样在AppLifecycleState.resumed 状态下调用updateBadgeCount,您还需要在应用启动时调用updateBadgeCount 一次(如果有的话,您可以在 PushNotificationsManager 等类的 init 函数中执行此操作,否则只需在您的一个小部件初始化函数中执行此操作即可)。

您也可以将updateBadgeCount 置于AppLifecycleState.inactiveAppLifecycleState.paused 等其他状态,这在大多数情况下都可以使用,但请注意这一点,因为如果应用程序在未触发非活动或暂停状态的情况下关闭/终止,那么应用程序徽章将不会更新,因为没有调用updateBadgeCount 函数。

为了完整性:当您的应用程序关闭或在后台时,您可以使用 Apple 推送通知服务更新您的应用程序徽章。在有效负载中包含徽章编号,如here 所示。然后当用户打开您的应用程序时,上面的代码将执行,并且徽章编号将再次更新,以便当用户关闭应用程序或应用程序进入后台时,徽章编号将“保留”用户所见。

更多关于WidgetsBindingObserver 以及如何检测应用程序是否在前台/后台here。

【讨论】:

以上是关于如何使用 Flutter 在 iOS 上拥有持久的徽章图标的主要内容,如果未能解决你的问题,请参考以下文章

How To - 带有持久子屏幕的 Flutter Drawer

如何使用flutter和kotlin在应用程序之外拥有小部件?

iOS 如何通过加密存储持久数据?

用于测试的 Flutter ios 构建

如何在 Flutter 中使用路由制作持久抽屉?

来看看这是什么,Flutter学习(上)