[iOS] SendBirdでメッセージや画像をタイムラインに貼る!

はじめに

こんにちは。最近は朝のコーヒーが欠かせない田宮です。今朝は追加でコンソメスープを飲んできました。 さて、この前書いた記事では、iOSのサンプルプロジェクトをつくって、SDK を導入し、SendBird 公式サンプルからいろいろコピーしてきて、SendBirdのオープンチャット画面を実現するところまでやりました。

[iOS] SendBirdを使ってみた! | Developers.IO

今回は、API Document を見ながら、いろいろ動かしてみたいと思います。

3つ試してみた

1.チャットに書き込む

SendBird.sendMessage("test from code")

これでチャットにメッセージを書き込めます。

override func viewDidAppear(animated: Bool) {
        self.startSendBird()
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue()) { () -> Void in
            let formatter = NSDateFormatter()
            formatter.dateFormat = "HH:mm"
            let now = NSDate()
            let message = formatter.stringFromDate(now) + "入室しました ノシ"
            SendBird.sendMessage("\(message)")
        }
    }

前回の記事のコードに追記してきます。 オープンチャット画面に遷移したタイミングで、こんなふうに書いておくと、チャット部屋に入室したことを自動的に書き込まなくてもOKな仕 組みを簡単に提供出来るかと思います。

貼り付けた画像_2016_02_23_16_53

機能を実装した様子はこちらです。

2.写真をアップロードする

// UIImageをNSDataに変換
let imageFileData = UIImagePNGRepresentation(UIImage(named: imageName)!)
// 画像データをアップロード
SendBird.uploadFile(imageFileData, type: "image/png", hasSizeOfFile:UInt(imageFileData!.length), withCustomField: "") { (fileInfo:SendBirdFileInfo!, error:NSError!) -> Void in

    }

ファイル SendBird が用意している外部サーバにアップロードされます。 この時点では、アップロードされるのみで、タイムライン上に画像は表示されません。

3. 写真ファイルをタイムラインに貼る

let imageFileData = UIImagePNGRepresentation(UIImage(named: imageName)!)
SendBird.uploadFile(imageFileData, type: "image/png", hasSizeOfFile:UInt(imageFileData!.length), withCustomField: "") { (fileInfo:SendBirdFileInfo!, error:NSError!) -> Void in
    //画像データをアップロード後返ってくる fileInfo を、後述の sendFileUrl() に渡す
    self.sendFileUrl(fileInfo.url, name: fileInfo.name, type: fileInfo.type, sizeOfFile: fileInfo.size, customField: "")
    }

(1)でファイルアップロード後に得られるファイル情報を、以下のsendFileUrl()に渡します。

func sendFileUrl(url: String, name: String, type: String, sizeOfFile: UInt, customField: String) {
        let fileInfo: SendBirdFileInfo = SendBirdFileInfo.init(url: url, name: name, type: type, size: sizeOfFile, customField: customField)
        SendBird.sendFile(fileInfo)
    }

ファイルのURLや各種情報を受け取り、画像をタイムラインに貼ります。

応用例

internal func uploadAppropriateImages() {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "HH"
        let now = NSDate()
        let hour = Int(formatter.stringFromDate(now))
        var imageName = ""

        if hour > 18 || hour < 6 {    // 18時から6時は夜の画像
            imageName = "night"
        } else if hour < 9 {         // 6時から9時は朝の画像
            imageName = "morning"
        } else {
            imageName = "day"         // それ以外は昼の画像
        }

        let imageFileData = UIImagePNGRepresentation(UIImage(named: imageName)!)
        SendBird.uploadFile(imageFileData, type: "image/png", hasSizeOfFile:UInt(imageFileData!.length), withCustomField: "") { (fileInfo:SendBirdFileInfo!, error:NSError!) -> Void in
            self.sendFileUrl(fileInfo.url, name: fileInfo.name, type: fileInfo.type, sizeOfFile: fileInfo.size, customField: "")
        }
    }

    internal func sendFileUrl(url: String, name: String, type: String, sizeOfFile: UInt, customField: String) {
        let fileInfo: SendBirdFileInfo = SendBirdFileInfo.init(url: url, name: name, type: type, size: sizeOfFile, customField: customField)
        SendBird.sendFile(fileInfo)
    }

ルームに入室した時間帯によって、イメージ画像をタイムラインに貼るコードがこちらです。

uploadAppropriateImages()を、ひとまずviewDidAppear()の中から呼ぶと良いでしょう。

Simulator_Screen_Shot_2016_02_23_16_51_44

このようになります。

おまけ

Simulator_Screen_Shot_2016_02_23_16_52_46

ちなみに、画像のURLを確認してみますと、どうやら AWS の S3 にアップされているようですね。

まとめ

今回は、どのようにしてメッセージや画像をタイムラインに貼る事ができるかを見てきました。 次回は、複数端末間でチャットしている様子と、Tipsなどをお伝えできればと思います。