The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

iOSでSlackのWebSocket疎通まで

やること

iOSからSlackのWebSocketを使ってメッセージのやり取りをできる状態にする

事前準備

redirect urlを用意せずにモバイルアプリ単体でアクセストークンを取得するのは無理っぽいのでとりあえずテスト用のを使う

手順

  1. Web APIrtm.startを使ってWebSocket Message ServerのURLを取得する(30秒しか有効期間がないので毎回取得が必要)
  2. 取得したURLを使ってWebSocketのコネクションをはる

超適当なサンプル

  1. 適当にXcodeでプロジェクトを作成
  2. Podfileに以下を記載(cocoapods 1.0以上)
target 'プロジェクト名' do
  use_frameworks!

  pod 'Alamofire', '~> 3.4'
  pod 'Starscream', '~> 1.1.3'
end
  1. $ pod install
  2. ViewControllerを以下のように書く(accessTokenのところにaccessTokenを入れる)
import Alamofire
import Starscream

class ViewController: UIViewController, WebSocketDelegate {
  var socket: WebSocket?
  let accessToken = "xxx"

  override func viewDidLoad() {
    super.viewDidLoad()

    let URL = "https://slack.com/api/rtm.start?token=\(accessToken)"

    Alamofire.request(.POST, URL, encoding: .JSON)
      .responseJSON { [weak self] response in
        print(response.request)  // original URL request
        print(response.response) // URL response
        print(response.data)     // server data
        print(response.result)   // result of response serialization

        if let JSON = response.result.value {
          print("JSON: \(JSON)")
          print("url:", JSON["url"])

          if let urlString = JSON["url"] as? String {
            self?.socket = WebSocket(url: NSURL(string: urlString)!)
            self?.socket?.delegate = self
            self?.socket?.connect()
          }
        }
    }
  }

  // MARK: WebSocket Delegate
  func websocketDidConnect(socket: WebSocket) {
    print("did connect")
  }

  func websocketDidDisconnect(socket: WebSocket, error: NSError?) {

  }

  func websocketDidReceiveMessage(socket: WebSocket, text: String) {
    print("message:", text)
  }

  func websocketDidReceiveData(socket: WebSocket, data: NSData) {
    print("data:", data)
  }
}

動かして以下が表示されればOK

did connect
message: {"type":"hello"}