Firebase如何知道特定客户端是否脱机?

时间:2018-01-17 14:22:08

标签: firebase firebase-authentication firebase-cloud-messaging

我正在使用raspberry pi和Firebase开发设备/产品......

系统流程如下:用户在我的网站上购买设备,她可以使用相同的凭据登录移动应用程序。

目前,我依赖于一些如何生成的uniuqe id放入设备,以便从设备和设备与Firebase实时数据库进行数据交互...

现在我需要知道设备是在线还是离线。答案应该是可能的两个解决方案。因为我想通知用户:“您的设备处于脱机状态”...

1-关于当前代码(依赖于唯一ID):如果可能,我该如何实现。

2-更改系统到基于用户:如果我实现这个我必须考虑系统。设备没有显示输入也没有键盘。例如,当用户更改密码时会发生什么?

谢谢..

1 个答案:

答案 0 :(得分:3)

你想要的是onDisconnect

当您的设备启动时,您需要设置onDisconnect来更改其状态,甚至开火:

var lastOnlineRef = firebase.database().ref("devices/1234/lastOnline");
lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);

var isOnlineRef = firebase.database().ref("devices/1234/isOnline");
isOnlineRef.onDisconnect().set(false);

对于用户来说,我并不完全确定我理解。如果您使用以下路径将您的设备与您的UID隔离开来:/devices/UID它们独立于用户而存在。

对于您的用户,您只需创建所有设备的列表:/users/UID/devices

{
    1234: 1234,
    5678: 5678
}

然后在您的应用中,您首先获取他们的设备列表,然后创建对它们的引用。

在Angular中看起来像:

// in the ts
public userDevices = this.db.list('/users/UID/devices').valueChanges();

public getDeviceObservable(deviceId: string) {
    return this.db.object('/devices/' + deviceId).valueChanges();
}

//in the template
<div *ngFor="let deviceId of userDevices | async">
    <ng-container *ngIf="getDeviceObservable(deviceId) | async as device">
    {{ device | json }}
    </ng-container>
</div>

在模板中放置一个getObservable并不是最好的做法,你也可以在组件中做到这一点,但这与switchMap等完全相同。