google FireBase产品接入 —— FCM

作为google 官方的推送,相比也是很多app离不开的功能,而且会经常用到的,这里总结一下如何集成FCM 以及后面探索一下相关原理。

说明:对于任何google service(统计,推送,广告等等 谷歌服务) 来说,他们都依赖于手机里面的google服务框架这个系统级别的app,同时会依赖 google-services 库,这些东西都会在工程里面去配置,另外,现在所有的服务都集成到firebase这个平台了,所以也要去集成firebase库,这是google 提供给开发者一个对外统一操作者平台,里面可以进行新建工程和配置。

因此,这样来说集成任何一个google服务,都需要分两步走,

  • 第一步集成google service服务,添加firebase到工程中, 参考文章
  • 集成想要的具体服务,并使用相应的api 

第一步:集成firebase ,可以参考 集成Antatly ;
第二步:集成Message:官方网站

1 . 登录网站 ,找到Cloud Message ,选择自己的平台android(或iOS) 如下图:

2. 添加Message的依赖:

    compile 'com.google.firebase:firebase-core:11.0.4'
    compile 'com.google.firebase:firebase-analytics:11.0.4'
    compile 'com.google.firebase:firebase-messaging:11.0.4'

注意:具体的某个服务 如:Message 要和 core 版本号要一致; 

3. 获取Token ,完成注册

您的应用初次启动时,FCM SDK 会为客户端应用实例生成一个注册令牌。如果您希望定位单一设备或创建设备组,则需要通过扩展 FirebaseMessagingService 并重写 onNewToken 来获取此令牌。

本部分介绍如何检索令牌以及如何监控令牌的变更。因为令牌会在初始启动后轮替,所以我们强烈建议您检索最近更新的注册令牌。

注册令牌可能会在发生下列情况时更改:

  • 应用删除实例 ID
  • 应用在新设备上恢复
  • 用户卸载/重新安装应用
  • 用户清除应用数据。

如果需要检索当前令牌,请调用 FirebaseInstanceId.getInstance().getInstanceId()

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

这是 官网提供的api 16的代码,不同的版本代码不一样,但这一步都是获取 registerId 注册令牌,如 11.0.4 版本的获取方式就是

 String id = FirebaseInstanceId.getInstance().getToken();

另外,这一步手机需要翻墙,否则获取不到,后面就不用翻墙了。

监控令牌的生成

每当生成新令牌时,都会触发 onNewToken 回调函数, 所以在FirebaseMessageService 重写这个类。

注意:有的版本可能没有这些方法,因为这是针对16的版本,所以知道有这么回事就行了,还有app的重启令牌不会重新生成,当我们在设置界面把app数据清空就会生成一个新的令牌,这其中的原理后面研究一下?

官网参考

4. 接收消息

自己新建一个service 集成 FirebaseMessageService ,重写 onMessageReceiver 即可。并在mainfest进行注册一下;

public class ReceivePushMsgService extends FirebaseMessagingService {

    private static final String TAG = "ReceivePushMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
     
        Log.d(TAG, "From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());

//            if (/* Check if data needs to be processed by long running job */ true) {
//                // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
//                scheduleJob();
//            } else {
//                // Handle message within 10 seconds
//                handleNow();
//            }

        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

    }

以上 1,2, 3, 4 步就是全部的集成步骤。

 

利用Firebase平台进行测试

 输入消息信息,并通过FCM令牌进行精准推送

最后点击发送,然后再日志输出:

04-11 16:32:06.020 11617-11967/com.sjh.firebasedemo D/ReceivePushMsgService: Message Notification Body: 测试推送
04-11 16:32:26.515 11617-11989/com.sjh.firebasedemo D/ReceivePushMsgService: onMessageReceived: {}
    onMessageReceived: com.google.firebase.messaging.RemoteMessage@6567653
04-11 16:32:26.516 11617-11989/com.sjh.firebasedemo D/ReceivePushMsgService: From: 92864427547
    Message Notification Body: 测试推送

 ok ,一切完工。另外,还有其他的定位用户的方法,通过Topic,分组等方式,这些就不一一讲述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章