如果应用程序进入后台模式,则会触发 Ondisconnect

Posted

技术标签:

【中文标题】如果应用程序进入后台模式,则会触发 Ondisconnect【英文标题】:Ondisconnect is fired if app goes to background mode 【发布时间】:2018-01-09 21:39:03 【问题描述】:

我有以下代码:

func OnlineStatus(userID: String)
        handle = Auth.auth().addStateDidChangeListener  (auth, user) in
            if let user = user 
                // User is signed in.
                self.UID = user.uid

                self.connectedRef.observe(.value, with:  snapshot in
                    if let connected = snapshot.value as? Bool, connected 
                        // print("############################ Connected")
                        self.ref.child(self.UID!).child("OnlineStatus").setValue("ON")
                     else 
                        // print("############################ Not connected")
                        self.ref.child(self.UID!).child("OnlineStatus").setValue("OFF")
                    
                    self.ref.child(self.UID!).child("OnlineStatus").onDisconnectSetValue("OFF")
                )
            
            

该函数将在 viewWillAppear 中触发。这个想法是建立一个简单的存在系统。由于某种原因,当我将应用程序发送到后台而不是让我的 iPhone 进入睡眠状态时,onDisconnect 会被触发。我实际上希望只有当用户注销或失去互联网连接时,在线状态才会关闭。我的代码或设置有什么问题?

【问题讨论】:

检测注销和连接丢失,见***.com/questions/39169447/…和***.com/questions/41661137/… 【参考方案1】:

onDisconnect 事件会在客户端与 Firebase 数据库服务器断开连接时触发,并且会在您的应用进入后台时发生。从 Firebase 的角度来看,用户在火车上驶入隧道与他们的手机进入休眠状态没有区别。在这两种情况下,客户端和服务器之间的连接都会断开,因此onDisconnect() 会触发。

您通常最终会使用 .info/connectedonDisconnect() 来设置用户上次出现时间的值,同时使用 onAuthStateChanged() 设置正在登录的用户的状态标志。然后显示用户列表,首先显示已登录的用户,按他们最近的活跃时间排序。

【讨论】:

如何管理 .info/connected 永久监听?当我将手机置于飞行模式时,它不会被触发。把它打包在 appdelegate 的某个地方有意义吗? 手机操作系统努力工作以确保最长的电池寿命。他们这样做的一种方法是在用户不积极使用应用程序时积极关闭应用程序之间的连接。所以如果.info/connectedfalse,而app是后台的,很有可能是正确的,app和服务器的连接被切断了。

以上是关于如果应用程序进入后台模式,则会触发 Ondisconnect的主要内容,如果未能解决你的问题,请参考以下文章

如何在xcode中在后台重复触发进程

如果应用程序在后台,iOS Swift Timer 不会触发

在后台模式下使用应用程序更改应用程序权限(从常规设置)时出现问题

我已导入 AVFoundation 并将音频添加到我的应用程序,但如果应用程序进入后台模式,音频不会停止

应用程序进入后台后未调用 AFNetworking 成功/失败块

如果应用程序进入后台,UIView 动画将不起作用