Swift 4 Firebase онлайн-обновление статуса - PullRequest
0 голосов
/ 07 мая 2018

Я создаю приложение чата. У меня есть поля в каждой пользовательской таблице, которые позволяют проверить, если пользователь онлайн. Я использую только ссылку на базу данных, чтобы получить isOnline статус и обновлять его, когда обновляется. Я видел, что приложения обновляют онлайн-статус автоматически, когда пользователь открывает или сворачивает приложение. Как я могу это сделать? Нужен ли мне какой-нибудь слушатель или любая инфраструктура может помочь мне обновить мой код)) Что-то вроде ReactiveCocoa / ReactiveSwift ...

P.S извините за кириллический текст в поле isOnline ) это означает, что Online / Offline enter image description here

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

При запуске приложения вы можете обновить пользователя онлайн в AppDelegate

Обновление пользователя онлайн

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()
        // status parameter indicate user Online
        if Auth.auth().currentUser != nil {
            OnlineOfflineService.online(for: (Auth.auth().currentUser?.uid)!, status: true){ (success) in

                print("User ==>", success)

            }
        }
        return true
    }

Обновление пользователя в автономном режиме

func applicationWillTerminate(_ application: UIApplication) {
        if Auth.auth().currentUser != nil {
            OnlineOfflineService.online(for: (Auth.auth().currentUser?.uid)!, status: false){ (success) in

                print("User ==>", success)
            }
        }
 }

Сервис онлайн и оффлайн обновлений Firebase

import UIKit
import FirebaseDatabase

struct OnlineOfflineService {
    static func online(for uid: String, status: Bool, success: @escaping (Bool) -> Void) {
        //True == Online, False == Offline
        let onlinesRef = Database.database().reference().child(uid).child("isOnline")
        onlinesRef.setValue(status) {(error, _ ) in

            if let error = error {
                assertionFailure(error.localizedDescription)
                success(false)
            }
            success(true)
        }
    }
}

Также вам необходимо позаботиться о подключении пользователя к сети. Если пользовательское сетевое соединение отключено, просто позвоните OnlineOfflineService с параметрами

0 голосов
/ 02 марта 2019

Я знаю, что это старый вопрос, но если вы хотите установить значение online / offline в false, когда пользователь закрывает приложение, используйте .onDisconnectSetValue():

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()

    setInactivityObservers()

    return true
}

func setInactivityObservers() {
    guard let user = Auth.auth().currentUser else { return }

    // get user branch of database
    let ref = Database.database().reference()
    let usersRef = ref.child("Users")
    let userRef = usersRef.child(user.uid)

    // set "isOnline" branch to true when app launches
    userRef.child("isOnline").setValue(true)

    // set value to false when user terminates app
    userRef.child("isOnline").onDisconnectSetValue(false)
}
0 голосов
/ 07 мая 2018

Первый

Database.database().isPersistenceEnabled = true

Тогда управляй "присутствием"

let presenceRef = Database.database().reference(withPath: "disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnectSetValue("I disconnected!")

Тогда, когда пользователь отключен

presenceRef.onDisconnectRemoveValue { error, reference in
  if let error = error {
    print("Could not establish onDisconnect event: \(error)")
  }
}

И, наконец, для определения статуса

let connectedRef = Database.database().reference(withPath: ".info/connected")
connectedRef.observe(.value, with: { snapshot in
  if snapshot.value as? Bool ?? false {
    print("Connected")
  } else {
    print("Not connected")
  }
})

Теперь все в порядке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...