我已经构建了一个 ionic 应用程序,现在我想向其中添加聊天功能。 我正在研究可用于实现聊天的不同技术。 我考虑使用应用程序同步,到目前为止我唯一关心的是,如果我可以看到哪些用户在消息发送事件时不在线,那么我可以发送推送通知。
或者,应用程序同步是否可以开箱即用地处理此问题并发送通知?
感谢您的帮助
最佳答案
嘿,这是一个很好的问题。简而言之,AppSync SDK 不处理开箱即用的状态跟踪,但您可以自己实现此功能,无需太多麻烦。
我想到的一种方法是创建一个 DynamoDB 表“ActiveUsers”。在表上启用 DynamoDB TTL ( https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html )(使用一些“时间戳”属性)并使用一些唯一的用户属性(例如用户名或 userId)作为表的分区键。
然后从 AppSync 创建一个 Mutation.ping 突变,以进行如下所示的 PutItem 调用:
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
"userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username)
},
"attributeValues" : $util.dynamodb.toMapValuesJson({
timestamp: $util.time.nowEpochSeconds() + 300 # some amount of time
})
}
然后,您可以从您的客户端每隔 N 秒、在启动时或基于某些其他标准调用该突变。在用户连接良好的情况下,让应用程序调用另一个突变 Mutation.goOffline,以便在应用程序关闭时从 DynamoDB 中删除记录。如果用户没有良好的连接,因此客户端无法发送 Mutation.goOffline 突变,DynamoDB TTL 可以为我们进行清理。
要推送更新(当有人上线或离线时)到连接的客户端,您可以使用此指令 @aws_subscribe(mutations: ["publishActiveChange"]) 进行订阅 Subscription.onActiveChange 。然后还定义 Mutation.publishActiveChange 突变并让它返回用户 ID 和用户的事件状态。为了完成这个图,您将创建一个调用 lambda 函数的 DynamoDB 流,该函数调用 Mutation.publishActiveChange 突变,无论在 DynamoDB 中删除或(新)创建对象,都会发布消息。
您也可以订阅 ping 和 goOffline 突变,而不用担心 DynamoDB 流和 lambda 函数,但这种方法不会在客户端设备时发布订阅在调用 goOffline 之前先离线。 TTL 仍然有效,但设备必须通过后续查询得到通知。根据您的要求,这工作得很好,并且具有不太复杂的优点。
另一件需要考虑的事情是,DynamoDB TTL 不能保证立即发生,但实际上表现良好(几分钟内)。但是,非常大的表可能会出现一点滞后。
关于push-notification - AWS appsync 和推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047273/