2016-09-25 2 views
0

사용자가 채팅을 열 때마다 사용자의 온라인 상태를 추가하려고합니다. ChatVC에서Firebase 채팅이 사용자의 온라인 상태를 설정합니다.

public static func getFirebaseOnlineStatus(userRef: String) -> FIRDatabaseReference{ 
    return FIRDatabase.database().reference() 
      .child("meta") 
      .child(userRef) 
      .child("last_seen") 
} 

private func userIsOnline() { 

    // Firebase make this user online 
    firebaseLastSeen = Constants.getFirebaseOnlineStatus(SMBUser.getCurrentUser().getId()) 
    firebaseLastSeen.setValue("Online") 
} 

private func observerUserOnline(){ 
     firebaseLastSeen.observeEventType(.Value, withBlock: { snapshot in 
      print(snapshot.value) 
      self.userIsOnline() 
      }, withCancelBlock: { error in 
       print(error.description) 
     }) 
    } 

이 논리는 내가 다음 observerUserOnline()을 제거하는 경우 때문에 때마다 같은 값 변경, 내가 다시 Online에 값을 변경하고있어, 나에게 아주 나쁜 것 같다 값이 Online (last_seen)으로 업데이트되지만 2-3 초 후에 사용자가 해당 채팅에서 온라인 상태 인 경우에도 time(unix format)으로 변경됩니다.

이 문제를 해결하는 더 좋은 방법이 있습니까?

답변

4

게시 - 구독 패턴을 사용할 수 있습니다. 게시 - 구독 패턴이 무엇인지 이해해 봅시다. - 회원님의 사이트에

메시지의 보낸 사람이, 라는 출판사, 특정 수신기, 전화 가입자에게 직접 전송되는 메시지 프로그램, 대신의 지식없이 클래스로 게시 한 메시지의 특성을하지 않는 메시징 패턴 어떤 가입자가있을 수 있습니다. 마찬가지로 구독자는 하나 이상의 클래스에 대해 관심을 표명하고 어떤 발행자가있는 지 알고 있지 않은 채 명의 관심있는 메시지 만 수신합니다.

출처 : 다음

Wikipedia는 예 RabbitMQ MQTT Adapter을 사용하고 있습니다 :

"/ 주제/사용자는"주제에 사용자 A의 응용 프로그램을 구독/화제 "주제에 대한 사용자 B의 응용 프로그램/user-b "온라인/오프라인 상태를 주제"/ topic/presence "에 게시합니다. 백엔드 서버에 "/ topic/presence"에 가입 할 프로그램을 만듭니다. 사용자 A가 다음 사용자 A. 모든 친구들에게이 방법을 업데이트를 게시 말할 수에서 모든 업데이트를 제공하는 경우, 사용자 B는 방법에 게시를 위해 여기를

   User A    User B   PresenceListener 

Subscribe  /topic/user-a  /topic/presence /topic/presence 

Publish   /topic/user-b  /topic/presence friend list 

진짜 문제는 사용자 A의 온라인/오프라인 업데이 트를 받게됩니다 "오프라인". 한 가지 경우는 인터넷이 여전히 활성화 된 상태에서 사용자가 앱을 닫으면 앱이 서버에 '오프라인'상태를 게시 할 수 있지만 인터넷이 작동을 멈추면 어떻게됩니까?

"마지막 유언장"(lwt)을지나갑니다. 클라이언트가 오프라인 상태이며 더 이상 게시 할 수 없기 때문에

LWT messages are not really concerned about detecting whether a client has gone offline or not (that task is handled by keepAlive messages). LWT messages are about what happens after the client has gone offline. 

LWT 메시지는 클라이언트를 대신하여 브로커가 게시 될 메시지를 정의하는 데 활용 될 수있다.

출처 : http://tuanpm.net/what-is-mqtt/ 존재 서비스에 비슷한와 샘플 소스 코드에 대한

, 당신은 https://github.com/AppLozic/Applozic-Android-SDK

Github에서 사용할 수 우리의 Applozic 채팅 SDK 코드를 체크 아웃 할 수 있습니다
관련 문제