Swift 如何根据不断更新的状态触发一次通知

Swift 如何根据不断更新的状态触发一次通知,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我正在为SwiftUI的卡车运输公司制作车队管理应用程序,现在每当他们的司机开始开车或停止开车时,我都很难通知雇主。我使用CMMotionActityManager将驱动程序运动更新到firestore db。在雇主方面,我让他们倾听司机议案的最新进展 问题是我在snapshotListener闭包中有雇主的监听代码。这意味着,如果雇主有一个以上的司机,每次一个司机的运动状态发生变化,而不是通知雇主他们的司机运动的最新变化,而是通知他们他们雇用的所有司机过去的所有运动变化 下面是将运动数据发送到

我正在为SwiftUI的卡车运输公司制作车队管理应用程序,现在每当他们的司机开始开车或停止开车时,我都很难通知雇主。我使用CMMotionActityManager将驱动程序运动更新到firestore db。在雇主方面,我让他们倾听司机议案的最新进展

问题是我在snapshotListener闭包中有雇主的监听代码。这意味着,如果雇主有一个以上的司机,每次一个司机的运动状态发生变化,而不是通知雇主他们的司机运动的最新变化,而是通知他们他们雇用的所有司机过去的所有运动变化

下面是将运动数据发送到数据库的函数

    func setMotionUpdates(){
    

    
    let motionDoc =  db.collection("driverData").document(email).collection("resources").document("userLocation")

    if CMMotionActivityManager.isActivityAvailable() {
        
        
        motionManager.startActivityUpdates(to: OperationQueue.main) { (motion) in
          
            
            
            
            if motion!.automotive{
            
                motionDoc.updateData(["isDriving": true, "isStopped" : false])
                
                
            }
            else if motion!.stationary{
                
                motionDoc.updateData(["isStopped": true, "isDriving" : false])

               
            }
            
           
            
    }
        
}
    
}
以下是读取该数据并通知雇主的代码

            db.collectionGroup("resources").whereField("control", isEqualTo: true).addSnapshotListener { (snapshot, err) in
            
           
            
            if err != nil{print("Error fetching motion status: \(err)")}
            
            if ((snapshot?.documents.isEmpty) != nil){print("4")}
            
//获取所有driverLocation文档

            for doc in snapshot!.documents{
              
                let isDriving = doc.get("isDriving") as! Bool
                let isStopped = doc.get("isStopped") as! Bool
                
                if isDriving == false && isStopped == false{
     
                    
                }
                
                else{
//获取驱动程序的名称

                    doc.reference.parent.parent?.getDocument(completion: { (snapshot, err) in
                        
                        if err != nil{print("Error parsing driver name: \(err)")}
                        
                        let firstName = snapshot?.get("firstName") as! String
                        let lastName = snapshot?.get("lastName") as! String
                        
                        self.notifiedDriver = "\(firstName) \(lastName)"
            
                    })
                
                    
//逻辑

                    if isDriving{
                        
                        send(notiTitle: "MyFleet", notiBody: "\(notifiedDriver) is back on the road.")
                        
                        showDrivingToast.toggle()
                        
                    }else if isStopped{

                       send(notiTitle: "MyFleet", notiBody: "\(notifiedDriver) has stopped driving.")
                        
                        showStoppedToast.toggle()
                  
                        
                    }
                }
            }
            
        }

是否需要侦听客户端上的驱动程序更改?如果没有,您可以将云函数与。当文档更新时,您可以设置一个功能,向雇主发送推送通知。

是的,看起来我收到了

我所做的是在数据库中创建一个“通知”布尔字段,该字段将随运动活动更新到db。每当CMMotionActivityManager更新运动状态时,它会将notified设置为false,以及我需要进行的所有其他更新

            motionManager.startActivityUpdates(to: OperationQueue.main) { (motion) in
          
            
            
            
            if motion!.automotive{
            
                motionDoc.updateData(["isDriving": true, "isStopped" : false, "notified": false])
                
                
            }
            else if motion!.stationary{
                
                motionDoc.updateData(["isStopped": true, "isDriving" : false, "notified": false])

               
            }
            
           
            
    }
由于我正在监听雇主端的更新,snapshotListener代码将重新运行,并检查他们是否已经收到关于运动更新的通知

                    if (isDriving == false && isStopped == false) || notified == true{
     
                    
                }

我添加了“| | notified==true”,以检查我从驱动程序数据库接收的通知字段是否为true。如果这是真的,我不会运行通知我的驱动程序的代码。如果为false,我将运行该代码。

是的,我需要监听更改。我想我已经注意到了,但是,核实雇主是否已经通知的逻辑是令人困惑的。目前,如果我的司机正在驾驶,每次我打开应用程序时,我都会收到关于司机的运动状态的通知,该状态在几天前就已经设置好了。我希望这样,在第一次更新运动状态时,我会在当前时间收到通知,以后再也不会收到通知。