JIVER ?

* 간단히 채팅기능을 구현할 수 있도록 도와주는 채팅 솔루션 플랫폼

# JIVER 기능
* 일반적으로 카카오톡에서 사용 되는 기능 대부분을 지원
* 채널 개설 (1:1 부터 1:N 채널 모두 제한없이 사용)
* 익명 채팅 구현가능 ( 우리쪽에서 개발하기 나름 )
* 파일 업로드  ( 자이버에 업로드 후 링크 전달 )
* 안드로이드 , IOS , 유니티 , 웹(private) 플랫폼 지원
* 이전 채팅 내용 모두 저장
* 월 이용자 2천명까지 무료
* 대시 보드를 통해 이용 추이 파악 가능
* 어드민 페이지를 통한 채널 관리 가능 (채널 관리자 설정 가능)

# JIVER 구현 방법
* JIVER SDK를 사용하기 위해서는 IgawCommon 라이브러리 연동이 필요합니다. 

* 발급받은 JIVER App ID를 AndroidManifest.xml에 등록합니다.

* JIVER SDK의 초기화를 진행합니다.

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Jiver.IGAWInit(this, new Jiver.IGAWInitListener() {
        @Override
        public void initialized(String appKey, String userId) {
            Jiver.init(appKey);
        }
    });
    // other setup code
}
```

* JIVER에서 표시할 사용자 정보를 입력합니다.
* 
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Jiver.IGAWInit(this, new Jiver.IGAWInitListener() {
        @Override
        public void initialized(String appKey, String userId) {
            Jiver.init(appKey);
            Jiver.login(userId, USER_NICKNAME);
        }
    });
    // other setup code
}
```

* 접속할 채널을 입력합니다.

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Jiver.IGAWInit(this, new Jiver.IGAWInitListener() {
        @Override
        public void initialized(String appKey, String userId) {
            Jiver.init(appKey);
            Jiver.login(userId, USER_NICKNAME);
            Jiver.join(CHANNEL_URL);
        }
    });
    // other setup code
}
```

* JIVER 이벤트 핸들러를 등록합니다.

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Jiver.IGAWInit(this, new Jiver.IGAWInitListener() {
        @Override
        public void initialized(String appKey, String userId) {
            Jiver.init(appKey);
            Jiver.login(userId, USER_NICKNAME);
            Jiver.join(CHANNEL_URL);
            Jiver.setEventHandler(new JiverEventHandler() {
                @Override
                public void onConnect(Channel channel) {
                    // JIVER 채널에 정상적으로 접속된 경우
                }

                @Override
                public void onError(int code) {
                    // JIVER 잘못된 APP_ID 등 복구 불가능한 에러가 발생한 경우
                }

                @Override
                public void onMessageReceived(Message message) {
                    // 일반 채팅 메시지를 받은 경우
                }

                @Override
                public void onSystemMessageReceived(SystemMessage systemMessage) {
                    // 시스템 메시지를 받은 경우
                }

                @Override
                public void onBroadcastMessageReceived(BroadcastMessage broadcastMessage) {
                    // 관리자 메시지를 받은 경우 
                }

                @Override
                public void onFileReceived(FileLink fileLink) {
                    // 파일을 받은 경우
                }

                @Override
                public void onAllDataReceived(Jiver.JiverDataType type, int count) {
                    // Jiver에서 모든 데이터를 수신한 경우. notifyDataSetChanged()를 이용하여 ListView를 업데이트 할 수 있음.
                }

                @Override
                public void onMessageDelivery(boolean sent, String message, String data, String id) {
                    // 정상적으로 메시지가 발송되었는지 확인.
                }

                @Override
                public void onReadReceived(ReadStatus readStatus) { 
                    // 읽음 상태 표시 메시지를 받은 경우 
                }

                @Override
                public void onTypeStartReceived(TypeStatus typeStatus) { 
                    // 타이핑 상태 표시 메시지를 받은 경우 
                }

                @Override
                public void onTypeEndReceived(TypeStatus typeStatus) { 
                    // 타이핑 상태 표시 메시지를 받은 경우 
                }

                @Override
                public void onMessagingStarted(MessagingChannel messagingChannel) { 
                    // Jiver.startMessaging()이 성공적으로 호출된 경우
                }

                @Override
                public void onMessagingUpdated(MessagingChannel messagingChannel) {
                    // Jiver.inviteMessaging()이 성공적으로 호출된 경우
                }

                @Override
                public void onMessagingEnded(MessagingChannel messagingChannel) { 
                    // Jiver.endMessaging()이 성공적으로 호출된 경우
                }

                @Override
                public void onMessagingHidden(MessagingChannel messagingChannel) {
                    // Jiver.hideMessaging()이 성공적으로 호출된 경우
                }

            });
        }
    });
    // other setup code
}
```

* 접속 하기

```java
Jiver.connect();
```

* 접속 끊기

```java
@Override
protected void onDestroy() {
    super.onDestroy();
    Jiver.disconnect();
}
```

* 메시지 보내기

```java
private void send(String message) {
    Jiver.send(message);
}
```
* 필요한 데이터와 함께 보내기

```java
private void sendWithData(String message, String data) {
    Jiver.sendWithData(message, data);
}
```

# 팁 ( TIP )
* 이전 메시지 가져오기

```java
// 마지막 50개의 메세지를 로드한 후 JIVER 채널에 접속합니다.
Jiver.queryMessageList(Jiver.getChannelUrl()).prev(Long.MAX_VALUE,50,new MessageListQuery.MessageListQueryResult(){
    @Override
    public void onResult(List<MessageModel>messageModels){
        for(MessageModel model:messageModels){
            mJiverChatAdapter.addMessageModel(model);
        }
        mJiverChatAdapter.notifyDataSetChanged();
        
        // 마지막 쿼리의 Max Timestamp를 기준으로 새롭게 도착한 메시지를 접속과 동시에 로드합니다. 
        Jiver.connect(mJiverChatAdapter.getMaxMessageTimestamp());
    }
        
    @Override
    public void onError(Exception e){
    }
});

```
> 리턴 받은 MessageModel 형태의 데이터는 Message로 강제 형변환 하여 사용할 수 있다.