菜鸟教程小白 发表于 2022-12-11 19:50:49

ios - iOS 上的 Firebase 离线功能


                                            <p><p>我使用 Firebase 离线功能,特别是我使用它来确定用户上次在线或在线的时间。在测试的过程中,遇到了这样一个问题,如果我注销了,Disconnect功能不起作用,虽然我没有取消Disconnect功能。我明白在注销之前,我可以自己发送这个数据,但是这个功能的意义会从盒子里消失。告诉我如何解决这个问题?</p>

<p>这个函数决定了用户的事件,我在<code>MainTabBarController</code>中调用它(它被用作根 Controller )</p>

<pre><code>func setupLastSeenActivity() {
      DispatchQueue.main.async {
            let realmManager = RealmManager()
            guard let currentUserID = realmManager.getCurrentUser()?.id else { return }
            DispatchQueue.global(qos: .background).async {
                let ref = Database.database().reference().child(MainGateways.users.rawValue).child(currentUserID)
                let userSearchLocationRef = Database.database().reference().child(UserSearchLocationKeys.userSearchLocationModel.rawValue).child(currentUserID)

                let parameters =
                ref.updateChildValues(parameters, withCompletionBlock: { (error, ref) in

                })

                userSearchLocationRef.updateChildValues(parameters, withCompletionBlock: { (error, ref) in

                })

                let disconnectParameters = as

                ref.onDisconnectUpdateChildValues(disconnectParameters, withCompletionBlock: { (error, ref) in
                  guard let _error = error else { return }
                  debugPrint(_error.localizedDescription)
                })

                userSearchLocationRef.onDisconnectUpdateChildValues(disconnectParameters, withCompletionBlock: { (error, ref) in
                  guard let _error = error else { return }
                  debugPrint(_error.localizedDescription)
                })
            }
      }
    }
</code></pre>

<p><code>FirebaseAuthManager</code></p> 的注销功能

<pre><code>func logOut(completion: (() -&gt; Void)?) {
      DispatchQueue.main.async {
            do {
                let pushNotificationManager = PushNotificationManager()
                pushNotificationManager.unregisterPushNotification()
                pushNotificationManager.removeTokenWhenLogOut(success: nil)
                // Observers
                FIRFriendsDatabaseManager.shared.observeNewFriend(false, success: nil, fail: nil)
                FIRFriendsDatabaseManager.shared.observeFriendRemoved(false, success: nil, fail: nil)
                let firChatCardManager = FIRChatCardManager()
                firChatCardManager.syncChatCardModels(false)

                FacebookManager.logOut()
                Database.database().reference().removeAllObservers()

                let firebaseGeneralDatabaseManager = FirebaseDatabaseGeneralManager()
                firebaseGeneralDatabaseManager.logOut()
                try Auth.auth().signOut()
                let realmManager = RealmManager()
                realmManager.logOut()
                let appManager = AppManager()
                appManager.logOut(isDeleteAccount: false, completion: completion)
            } catch {
                debugPrint(error.localizedDescription)
            }
      }
    }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我做了一个统计连接设备数量的云函数,如果连接设备数量为0,那么我设置值isOnline = false 并设置lastSeenTimeStamp</p>

<pre><code>const functions = require(&#39;firebase-functions&#39;);
const admin = require(&#39;firebase-admin&#39;);

module.exports = functions.database.ref(&#39;userOnlineDevices/{userID}/{onlineSystemModelID}&#39;)
    .onWrite(event =&gt; {

      const snapshot = event.data;
      const userID = event.params.userID;
      const onlineSystemModelID = event.params.onlineSystemModelID;

      const currentData = event.data.current;
      const previousData = event.data.previous;

      console.log(&#34;currentData.val()&#34;, currentData.val(), &#34;previousData.val()&#34;, previousData.val());

      if (currentData.val() &amp;&amp; !previousData.val()) {
            // value created

            const checkUserRef = admin.database().ref(&#34;users&#34;).child(userID);
            const checkUserRefPromise = checkUserRef.once(&#34;value&#34;, function(checkUserRefSnap, error) {
                if (error) {
                  return console.log(&#34;created checkUserRefPromise error&#34;, error);
                }
                if (checkUserRefSnap.val()) {
                  const checkUserID = checkUserRefSnap.val()[&#34;id&#34;];
                  if (checkUserID == null) {
                        return console.log(&#34;checkUserID == null&#34;)
                  } else {
                        console.log(&#34;checkUserID&#34;, checkUserID)
                  }

                  const recentActivityTimeStamp = Math.floor(Date.now() / 1000);
                  const userRef = admin.database().ref(&#34;users&#34;).child(userID);
                  const userRefPromise = userRef.update({
                        &#34;isOnline&#34;: true
                  });

                  const userSearchLocationModelRef = admin.database().ref(&#34;userSearchLocationModel&#34;).child(userID);
                  const userSearchLocationModelRefPromise = userSearchLocationModelRef.update({
                        &#34;isOnline&#34;: true,
                        &#34;recentActivityTimeStamp&#34;: recentActivityTimeStamp
                  });

                  return Promise.all();
                } else {
                  return console.log(&#34;checkUserRefSnap.val() == null&#34;)
                }
            });

            return Promise.all();
      } else if (!currentData.val() &amp;&amp; previousData.val()) {
            // value removed
            const checkUserRef = admin.database().ref(&#34;users&#34;).child(userID);
            const checkUserRefPromise = checkUserRef.once(&#34;value&#34;, function(checkUserRefSnap, error) {
                if (error) {
                  return console.log(error);
                }

                if (checkUserRefSnap.val()) {
                  const checkUserID = checkUserRefSnap.val()[&#34;id&#34;];
                  if (checkUserID == null) {
                        return console.log(&#34;checkUserID == null&#34;)
                  } else {
                        console.log(&#34;checkUserID&#34;, checkUserID)
                  }

                  if (userID) {
                        const removedTimeStamp = new Date() / 1000;
                        const userRef = admin.database().ref(&#34;users&#34;).child(userID);
                        const userRefPromise = userRef.update({
                            &#34;isOnline&#34;: false,
                            &#34;lastSeenTimeStamp&#34;: removedTimeStamp
                        });

                        const userSearchLocationModelRef = admin.database().ref(&#34;userSearchLocationModel&#34;).child(userID);
                        const userSearchLocationModelRefPromise = userSearchLocationModelRef.update({
                            &#34;isOnline&#34;: false,
                            &#34;lastSeenTimeStamp&#34;: removedTimeStamp
                        });

                        return Promise.all();
                  } else {
                        return console.log(&#34;removed, userID == null&#34;);
                  }
                } else {
                  return console.log(&#34;removed, checkUserRefSnap.val() == null&#34;);
                }
            });

         return Promise.all();
      } else {
            // updated
            const checkUserRef = admin.database().ref(&#34;users&#34;).child(userID);
            const checkUserRefPromise = checkUserRef.once(&#34;value&#34;, function(checkUserRefSnap, error) {
                if (error) {
                  return console.log(error);
                }

                if (checkUserRefSnap.val()) {
                  const checkUserID = checkUserRefSnap.val()[&#34;id&#34;];
                  if (checkUserID == null) {
                        return console.log(&#34;checkUserID == null&#34;)
                  } else {
                        console.log(&#34;checkUserID&#34;, checkUserID)
                  }

                  const recentActivityTimeStamp = Math.floor(Date.now() / 1000);
                  const userRef = admin.database().ref(&#34;users&#34;).child(userID);
                  const userRefPromise = userRef.update({
                        &#34;isOnline&#34;: true
                  });

                  const userSearchLocationModelRef = admin.database().ref(&#34;userSearchLocationModel&#34;).child(userID);
                  const userSearchLocationModelRefPromise = userSearchLocationModelRef.update({
                        &#34;isOnline&#34;: true,
                        &#34;recentActivityTimeStamp&#34;: recentActivityTimeStamp
                  });

                  return Promise.all();
                } else {
                  return console.log(&#34;updated checkUserRefSnap.val() == null&#34;);
                }
            });

            return Promise.all();
      }
    });
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iOS 上的 Firebase 离线功能,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44472968/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44472968/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iOS 上的 Firebase 离线功能