PusherのChatKitを導入する

#はじめに

チャットアプリを作ろうとすると、
[Firebase Realtime Database]("https://firebase.google.com/docs/database?hl=ja")というサービスを使うと素早く実装できるという記事がたくさんあるんで、
僕はPusherのChatKitというサービスを使ってチャットアプリを作ってみようかなと思います。
いつも通り元の[Doc]("https://pusher.com/docs/chatkit")はこちら

#なぜPusher？
・ある程度なら無料で運用出来る
・有名どころが使用している
・自社サーバーとの連携が可能
主に上記の理由からPusherを選びました。

#SDKのインストール

cocoapod

```
gem install cocoapods
target '<Your Target Name>' do
  pod 'PusherChatkit'
end
```

```
pod install
```
Carthage

```
$ brew update
$ brew install carthage
```
```
github "pusher/chatkit-swift"
```

[公式はこちら]("https://github.com/pusher/chatkit-swift")

#アカウント作成
こちらでアカウント作成
https://dashboard.pusher.com/accounts/sign_up

#インスタンスを作成
<img width="1151" alt="スクリーンショット 2020-02-25 14.28.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322831/eca444ee-066b-ed26-2a03-d55d13c8078f.png">

CredentialsでInstace Locatorを取得
![スクリーンショット 2020-02-25 14.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322831/661a3d23-cff1-9673-a9af-bbb3ad74455a.png)

test用エンドポイントを取得
![スクリーンショット 2020-02-25 14.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322831/3f70eb38-fe43-fcc9-c05c-16f7627c335a.png)


#認証用の設定

```swift
let provider = PCTokenProvider(url: "test用エンドポイント")
// ChatManagerの生成
let manager = ChatManager(instanceLocator: ChatKitInfo.instaceLocation,
            tokenProvider: provider,
            userID: )
```


#Pusherとのコネクションを作る
```swift
self.manager.connect(delegate: ChatManagerDelegateImpl(delegate: self)) { (currentUser, error) in
            if let error = error {
                print("Error sending message: \(error.localizedDescription)")
                onError(error)
                return
            }
            
            self.currentUser = currentUser
            onSuccess()
        }
```

#チャット部屋の購読
```swift
guard let currentUser = self.currentUser else {
    return
}
        
currentUser.subscribeToRoomMultipart(id: id, roomDelegate: self, messageLimit: 0) { error in
    if let error = error {
        print("Error subscribing to room: \(error.localizedDescription)")
        return
     }
    print("Successfully subscribed to the room! 👋")
}
```


#メッセージの送信

```swift
currentUser.sendSimpleMessage(roomID: room.id, text: message) { (messageId, error) in
            if let error = error {
                self.delegate?.onError(error: error)
                return
            }
            
            self.delegate?.onSuccessSendMessage(id: messageId)
        }
```

#メッセージの受信

```swift
extension ChatKitManager: PCRoomDelegate {
    func onMultipartMessage(_ message: PCMultipartMessage) {}
}
```

これで基本的なチャットの機能が使えるようになります。

#PCTokenProviderの生成
最後に認証用のプロバイダーですが、この記事ではテスト用のエンドポイントを使用しています。
しかし、実際に使用するときは自分でサーバーを構築して認証用のエンドポイントを作成する必要があります。
その場合の、PCTokenProviderの生成方法以下になります。

```swift
PCTokenProvider(url: endPoit,
                requestInjector: { request -> PCTokenProviderRequest in
                            // ヘッダー情報などを設定
                            request.addHeaders(headers)
                            return request
                }, retryStrategy: PCDefaultRetryStrategy(maxNumberOfAttempts: 6, maxTimeIntervalBetweenAttempts: 10))
```


Pusherではこれ以外にも既読を点けたり、過去のメッセージを取得したりも出来るのでチャットアプリを作ってみたい方は、Pusherというサービスもあるよとだけ覚えておいていただければと思います。