2017-08-07 76 views
0

如何在设备使用移动数据时禁用接收推送通知?
它需要保存用户的流量和金钱。
我对此有一个建议。 需要注册BroadcastReceiver这将跟踪CONNECTIVITY_CHANGE如果WiFi关闭呼叫InstanceID.deleteToken()但我不确定这种方法。 也许有一些方法可以做到这一点? 在此先感谢!当设备仅连接到WiFi时接收FCM

+1

您可以使用广播接收器来确定网络类型并使用FirebaseMessaging.getInstance()取消注册。unsubscribeFromTopic(“yourTopic”);' –

回答

1

当你带wifi连接使用,您可以通过https://developers.google.com/instance-id/reference/server#create_a_relation_mapping_for_an_app_instance

注册新的火力点这个话题。FirebaseMessaging.getInstance()subscribeToTopic( “新闻”);

而且当您使用移动网络时: FirebaseMessaging.getInstance()。unsubscribeFromTopic(“news”);

或者,也许你可以使用这个:

Thread thread = new Thread(() -> { 
      try { 
       FirebaseInstanceId.getInstance().deleteInstanceId(); 
      } catch (Exception e) { 
       Log.e("ERROR", Log.getStackTraceString(e)); 
       RxBus.getInstance().post(new OffPushError()); 
      } 
    }); 

thread.start();

1

您的方法(取消Wifi注销并重新注册时,Wifi开启)可能会导致意外的行为。那么我不知道你正在进行的项目的性质,但大部分时间它会影响。

假设Wifi关闭,您取消注册,然后一条消息被服务器推送到设备(您的设备将不会是它们中的一个,因为它没有注册),然后您的Wifi进入并注册新的令牌,您以前的消息将不会传送到您的设备。这是一般消息的情况(例如发送给所有设备)。

但是您的设备也会在您的服务器上丢失历史记录(同样,这取决于您的项目)。

一个可能的解决方案可能是:当Wifi下线并且您想要限制蜂窝网络(意味着蜂窝网络开启)时,您可以向您的服务器发送一条消息,指示设备处于脱机状态。当你的服务器想要发送消息时,它会检查设备的状态。当Wifi继续发送消息说你在线。

+0

是的,您是对的,取消注册设备不是好的解决方案。大概我应该审查项目的概念,并删除这个“功能” – user2650128