最近一直在做海外项目。涉及到推送功能。于是使用到了firebase.
firebase是Google推出的一个云端服务,并且它完全免费。
官方:https://firebase.google.com/features/ 。当然,由于是涉及海外的,所以,你懂的,要搬***。
firebase的功能有很多种,包含,推送通知,云存储,活动监视,远程部署等等。请注意:
手机中的Google Play Service的版本信息需要>=FireBase SDK的版本,否则FireBase将无效。
在firebase上可以看到用户weizhi位置:如下图(公司app)
同时你也可以使用FireBase进行LogEvent追踪,可以看到用户的偏好操作行为
具体代码:
public class Firebase { private static Firebase instance; private Context context; private FirebaseAnalytics mFireInstance; public Firebase(Context context) { this.context = context; } public static Firebase getInstance(Context context) { if (instance == null) { instance = new Firebase(context); } return instance; } private FirebaseAnalytics getFirebaseAnalytics() { if (mFireInstance == null) { try { mFireInstance = FirebaseAnalytics.getInstance(context); } catch (Exception e) { } } return mFireInstance; } public void logEvent(String category, String action) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putString("action", cutStringIfNecessary(action)); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, String action, String label) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putString(validateKey(action), cutStringIfNecessary(label)); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, String action, long value) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putLong(validateKey(action), value); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, String action, double value) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putDouble(validateKey(action), value); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, long value) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putLong("value", value); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, double value) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); Bundle bundle = new Bundle(); bundle.putDouble("value", value); firebaseAnalytics.logEvent(validateKey(category), bundle); } public void logEvent(String category, Bundle values) { FirebaseAnalytics firebaseAnalytics = instance.getFirebaseAnalytics(); firebaseAnalytics.logEvent(validateKey(category), values); } private String cutStringIfNecessary(String v) { if (!TextUtils.isEmpty(v) && v.length() > 100) { return v.substring(0, 100); } return v; } private String validateKey(String key) { if (!TextUtils.isEmpty(key)) { if (!Character.isLetter(key.charAt(0))) { key = "K" + key; } if (key.length() > 40) { key = key.substring(0, 40); } for (int i = 0; i < key.length(); i++) { if (!Character.isLetterOrDigit(key.charAt(i)) && key.charAt(i) != '_') { key = key.replace(key.charAt(i), '_'); } } } return key; } //设置是否开启数据收集功能 public void setAnalyticsCollectionEnabled(boolean enabled) { instance.getFirebaseAnalytics().setAnalyticsCollectionEnabled(enabled); } public void setMinimumSessionDuration(long milliseconds) { instance.getFirebaseAnalytics().setMinimumSessionDuration(milliseconds); } public void setUserId(String userId) { instance.getFirebaseAnalytics().setUserId(userId); } public void setSessionTimeoutDuration(long milliseconds) { instance.getFirebaseAnalytics().setSessionTimeoutDuration(milliseconds); } public void setUserProperty(String name, String value) { instance.getFirebaseAnalytics().setUserProperty(name, value); } /*获取Appinsranceid 参数*/ public void getAppInstanceId(final getAppInstanceIdListener appInstanceIdListener) { instance.getFirebaseAnalytics().getAppInstanceId().addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Tasktask) { if (appInstanceIdListener != null) { try { appInstanceIdListener.setAppInstanceId(task.getResult()); } catch (RuntimeExecutionException e) { appInstanceIdListener.setAppInstanceId(""); } } } }); } public interface getAppInstanceIdListener { void setAppInstanceId(String appInstanceId); }
在需要的时候,直接调用:Firebase.getInstance(getApplicationContext()).logEvent("xxx", "xxx");
使用Firebase进行推送。
首先需要再Firebase后台添加一个应用,然后下载Google-service.json文件,添加到应用中。如图
最后一步,运行项目,就可以看到firebase的统计了。
FireBase云推送是完全免费的,它的配置信息如下图所示:
其中打?是可选项。 值得注意的是下图:
自定义的数据是key-value 。 这两个值配置好后,会在应用用获取,具体实现:
1.需要使用两个service分别继承 :FirebaseMessagingService和FirebaseInstanceIdService
FirebaseMessagingService
dataMap就是我们在Firebase云推送上配置的key-value的值。得到值后就可以进行相应的处理了
FirebaseInstanceIdService:
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIIDService"; @Override public void onCreate() { super.onCreate(); FirebaseMessaging.getInstance().subscribeToTopic("xxx"); } /** * Called if InstanceID token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the InstanceID token * is initially generated so this is where you would retrieve the token. */ // [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. sendRegistrationToServer(refreshedToken); } // [END refresh_token] /** * Persist token to third-party servers. ** Modify this method to associate the user's FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server. Log.e("id", token); Log.e("id===========", token); } }
FirebaseMessaging.getInstance().subscribeToTopic("xxx") xxx这个值可以自定义,通过这个值可以在后台配置curl命令,然后在自己后台实现实时推送。
好了,关于推送就说到这了。下篇会讲到remoteConfig.谢谢!!