MilkcocoaでBaaSを体験!~バックエンドの仕組みと使い方~

第6回iOS(Swift)でも簡単リアルタイム通信! Milkcocoa iOS SDKを使ってみよう!

はじめに

前回まででMilkococoaをサーバ側で利用するためのMilkcocoa Node.js SDKの概要や、SDKを使ったアプリケーション実装方法などを紹介してきました。

今回はiPhoneやiPad上で動作するiOSとの連携が出来るMilkococoa iOS SDKを紹介したいと思います。前回、IoTという単語が出てきていましたが、IoT領域ではスマートフォン連携も需要が高くなっていますので覚えておいて損は無いと思います。

Milkcocoa iOS SDK

これまでに紹介したMilkcocoaのSDKは全てJavaScript向けのSDKでした。今回は、冒頭に述べたようにiPhoneとの連携を図るために、iOSアプリケーション構築用言語の一つであるSwift向けのSDKを紹介します。他のBaaSサービスもiOS向けのSDKがありますが、この時期(2015年3月時点)にSwiftに対応しているのは珍しいのではないでしょうか。

Milkcocoa iOS SDKはまだ開発版で、Milkcocoaの機能のうちsendメソッドしか対応出来ていません。Webアプリケーションの一つのパーツとしてiOSを使う場合や簡単な連携を行う場合に活用できます。

なお、今回はあくまで、Milkcocoa iOS SDKの話になるため、Swift自体については深くは触れません。Swiftについては超初心者向けSwift解説、勉強会レポート【スライド付】などを参考にしてください。

SDKの取得方法

Milkcocoa iOS SDKは開発途中でまだ公開されていませんが、株式会社テクニカルロックスターズに問い合わせをすることで限定的に使う事ができます。

contact AT mlkcca.com(⁠⁠AT」「@」に変更)まで連絡をして、SDK利用を希望していることをお伝えください。

本記事の対象

以下のような方が今回の対象となります。

  • 筆者と同じように、Web制作者だけどiOS開発やSwiftにチャレンジしてみたい方
  • 簡単にiOSとWebでリアルタイム通信をしたいと思っている方

開発環境

今回のMilkcocoa iOS SDKを紹介するうえで簡単なサンプルを作りますが、サンプルを作った際の筆者の環境を紹介します。

  • Mac OS X 10.10 Yosemite
  • Xcode 6.2
  • iOS 8.2
  • Milkcocoa JavaScript SDK 0.2.8(通常のブラウザJavaScriptのSDK)
  • Milkcocoa iOS SDK(テストユーザ[1]⁠)

Swiftプロジェクトの始め方

この節はWebアプリケーションがメインでiOSアプリケーション制作が初めてという方向けです。iOSアプリケーションを作成したことがある人は読み飛ばしてください。

iOSの統合開発環境であるXcodeをお使いのMacにインストールしてください。

まず始めに、Xcodeを起動します。

図1 Xcodeを起動
図1 Xcodeを起動

Create a new Xcode projectを選択しましょう。

作成するアプリケーションの種類を選択します。Single View Applicationを選択して次に進みます。

図2 Single View Applicationを選択
図2 Single View Applicationを選択

Product Nameの項目に、任意のアプリケーションのプロダクト名を設定します。

LanguageはSwiftにして進めます。

図3 各項目を設定する
図3 各項目を設定する

プロジェクトファイルの保存場所を指定してCreateを選択すると、プロジェクトが作成されます。

図4 プロジェクトが作成される
図4 プロジェクトが作成される

このような画面が表示されれば問題ないです。

図5 このような画面が表示されれば問題ない
図5 このような画面が表示されれば問題ない

SwiftとMilkcocoaのHello World

それでは実際に作って行きたいと思います。前回までと同様にio-xxxxxxxというMilkcocoaのアプリIDを取得しておきましょう。

SDKの確認

株式会社テクニカルロックスターズに連絡をするとMilkcocoa.frameworkというiOS向けのライブラリが提供されます。

図6 Milkcocoa.frameworkというiOS向けのライブラリが提供される
図6 Milkcocoa.frameworkというiOS向けのライブラリが提供される

このファイルがMilkcocoa iOS SDKのコアになりますので、大事に保管しましょう。

Web側の実装

まずはWeb側を作って行きたいと思います。io-xxxxxxとなっているアプリIDの部分だけ各々のものに書き換えてください。

app.html
01:<!doctype html>
02:<html lang="ja">
03:<head>
04:    <meta charset="UTF-8">
05:    <title>simple chat!</title>
06:    <script src="http://cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
07:    <script>
08:        var milkcocoa = new MilkCocoa("https://io-xxxxxx.mlkcca.com/");
09:        var iosDS = milkcocoa.dataStore('ios');
10:
11:        function clickEvent(){
12:            iosDS.send({msg:'hello! iOS! I am JS'});
13:        }
14:
15:        iosDS.on('send',function(data){
16:            console.log('receive:',data.value.msg);
17:        });
18:    </script>
19:</head>
20:<body>
21:    <button name="button" onClick="clickEvent()">send!</button>
22:</body>
23:</html>

基本的に今までのMilkcocoaの説明と同様です。Milkcocaのメソッドの詳細はドキュメントをご確認ください。

  • 6行目:MilkcocoaのSDKをcdnから読み込みます。
  • 8行目:Milkcocoaアプリケーションに接続します。
  • 9行目:iosというデータストアにアクセスします。
  • 11~13行目:iosデータストアに対してsendメソッドを実行するclickEvent()を設定します。
  • 15~17行目:iosデータストアに対するsendイベントonメソッドで監視します。sendメソッドが実行されたタイミングで16行目が実行されます。
  • 21行目:clickEvent()を発火するボタンを設置します。

画面的にはsend!とだけ書かれたwebページになります。

図7 ⁠send!」とだけ書かれたwebページ
図7 「send!」とだけ書かれたwebページ

コンソールにconnectedと表示されていればMilkcocoaとの接続に成功しています。

図8 ⁠connected」と表示されていればMilkcocoaに接続されている
図8 「connected」と表示されていればMilkcocoaに接続されている

iOS側(Swift)の実装

Milkcocoa.frameworkの読み込み準備

Xcodeのプロジェクトの設定でBuild Phases⁠左上の)New Copy Files PhaseCopy Filesの項目を表示させます(環境によってはデフォルトでCopy Filesの項目が表示されている場合もあるかもしれません⁠⁠。

図9 順に項目を選択する(サムネイルでは表示が崩れます。ご了承ください。)
図9 順に項目を選択する

Copy Filesの部分にMilkcocoa.frameworkをドラッグ&ドロップ(または)で追加します。モーダルが表示されるので、Copy items if neededにチェックを入れてFinishを選択します。

また、Destinationの項目はFrameworksにしておきます。

図10 順に設定する(サムネイルでは表示が崩れます。ご了承ください。)
図10 順に設定する

Copy items if neededのチェックを入れることでプロジェクトのフォルダ内にもMilkcocoa.frameworkのファイルがコピーされます。

図11 読み込み前
図11 読み込み前
図12 読み込み後
図12 読み込み後

左側のフォルダツリーにMilkcocoa.frameworkが表示されていることを確認しましょう。

図13 ⁠Milkcocoa.framework」が表示されていることを確認
図13 「Milkcocoa.framework」が表示されていることを確認

この左側のフォルダツリーに表示されているMilkcocoa.frameworkをドラッグ&ドロップでLink Binary With Librariesに追加します。

図14 ⁠Milkcocoa.framework」をドラッグ&ドロップで「Link Binary With Libraries」に追加(サムネイルでは表示が崩れます。ご了承ください。)
図14 「Milkcocoa.framework」をドラッグ&ドロップで「Link Binary With Libraries」に追加

これでライブラリを読み込む準備が整いました。

ViewController.swiftへの記述

次はViewController.swifに実際のSwiftコードを記述していきます。

図15 実際のSwiftコードを記述する
図15 実際のSwiftコードを記述する

以下のように書き換えてください。io-xxxxxxは先ほどのWeb側と同様のアプリIDにしましょう。

ViewController.swift
01:import UIKit
02:import Milkcocoa
03:
04:class ViewController: UIViewController {
05:    let milkcocoa = Milkcocoa(url:"https://io-xxxxxx.mlkcca.com")
06:
07:    override func viewDidLoad() {
08:        super.viewDidLoad()
09:        let dataStore = milkcocoa.dataStore("ios")
10:
11:        dataStore.on("send", { data in
12:            println(data.value["msg"].asString!)
13:        })
14:
15:        dataStore.send(["msg":"hello! JS! I am iOS"])
16:    }
17:
18:    override func didReceiveMemoryWarning() {
19:        super.didReceiveMemoryWarning()
20:    }
21:
22:}

基本的に先ほどのapp.htmlでのJavascriptコードとほぼ同様の解説になります。

  • 2行目:Milkcocoa ios SDKを読み込みます。
  • 5行目:Milkcocoaアプリケーションに接続します。
  • 9行目:iosというデータストアにアクセスします。
  • 11~13行目:iosデータストアに対するsendイベントonメソッドで監視します。データストアに対してsendメソッドが実行されたタイミングで12行目が実行されます。
  • 15行目:iosデータストアに対してsendメソッドを実行します(アプリケーションが起動したタイミングで実行となります⁠⁠。

実行して確認

この状態で左上の三角形のBuildボタンを押すと、ビルドが実行されてビルドターゲットに指定してあるデバイス(今回の画面だとiPhone 6)のエミュレータが起動します。

図16 iPhone 6のエミュレータが起動(サムネイルでは表示が崩れます。ご了承ください。)
図16 iPhone 6のエミュレータが起動

コンソールにwebsocket is connectedと表示されたら、Milkcocoaとの接続に成功です。

Web側とiOS側の連携を確認

それでは先ほど作ったWebページとiOSアプリケーションの両方のコンソールを観られる状態にして、iOSアプリケーションを起動してみます。

お互いのコンソールにメッセージの送受信がリアルタイムに行われているのが分かると思います。

図17 お互いのコンソールにメッセージの送受信がリアルタイムに行われている(サムネイルでは表示が崩れます。ご了承ください。)
図17 お互いのコンソールにメッセージの送受信がリアルタイムに行われている

さらに、Web側で実装したsend!ボタンを押すことでメッセージが送れている様子が分かると思います。

図18 Web側で実装した「send!」ボタンを押すことでメッセージが送れている(サムネイルでは表示が崩れます。ご了承ください。)
図18 Web側で実装した「send!」ボタンを押すことでメッセージが送れている

iOSアプリの色をWebから制御してみる

少し応用的な処理をしてみたいと思います。見た目でリアルタイム通信を感じられるようにiOSアプリケーションの画面の色をWebから操作してみます。

Web側の実装

先ほど作成したapp.htmlを微修正します。

app.html
01:<!doctype html>
02:<html lang="ja">
03:<head>
04:    <meta charset="UTF-8">
05:    <title>simple chat!</title>
06:    <script src="http://cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
07:    <script>
08:
09:        var milkcocoa = new MilkCocoa("https://io-xxxxxx.mlkcca.com/");
10:        var iosDS = milkcocoa.dataStore('ios');
11:
12:        function clickEvent(color){
13:            iosDS.send({
14:                msg:'hello! iOS! I am JS',
15:                color: color
16:            });
17:        }
18:
19:        iosDS.on('send',function(data){
20:            console.log('receive:',data.value.msg);
21:        });
22:    </script>
23:</head>
24:<body>
25:
26:<button name="button" onClick="clickEvent('red')">red</button>
27:<button name="button" onClick="clickEvent('green')">green</button>
28:<button name="button" onClick="clickEvent('yellow')">yellow</button>
29:
30:</body>
31:</html>

最初のapp.htmlから変更した部分の解説をします。

  • 12~17行目:clickEvent()が実行されたら引数であるcolorの値をsendメソッドcolorというキー名で送信しています。
  • 26~29行目:red、green、yellowのそれぞれの色を送るためのボタンを3つ設置します。

このような感じで3つのボタンが表示されるページが出来ます。

図19 3つのボタンが表示されるページ
図19 3つのボタンが表示されるページ

iOS側の実装

こちらも先ほどのViewController.swiftを修正します。

ViewController.swift
01:import UIKit
02:import Milkcocoa
03:
04:class ViewController: UIViewController {
05:    let milkcocoa = Milkcocoa(url:"https://io-ci1s1iu9p.mlkcca.com")
06:
07:    override func viewDidLoad() {
08:        super.viewDidLoad()
09:        let dataStore = milkcocoa.dataStore("ios")
10:
11:        dataStore.on("send", { data in
12:            println(data.value["msg"].asString!)
13:            //送信された色によって背景色を変更する
14:            var color = data.value["color"].asString!
15:            if color == "red" {
16:                self.view.backgroundColor = UIColor.redColor()
17:            }else if color == "green"{
18:                self.view.backgroundColor = UIColor.greenColor()
19:            }else if color == "yellow"{
20:                self.view.backgroundColor = UIColor.yellowColor()
21:            }else if color == "white"{
22:                self.view.backgroundColor = UIColor.whiteColor()
23:            }
24:        })
25:
26:        dataStore.send(["msg":"hello! JS! I am iOS","color":"white"])
27:    }
28:
29:    override func didReceiveMemoryWarning() {
30:        super.didReceiveMemoryWarning()
31:    }
32:
33:}

if文などが入ってきますが、SwiftのコードはJavaScriptなどに文法が似ているので読むことは可能だと思います。

  • 14~23行目:sendイベントで受信したcolorの値によって背景色を変更しています。
  • 26行目:アプリケーション起動時にsendメソッドを実行しますが、その際にcolorの値としてwhiteを送信しています。

実行して確認

先ほどと同じようにiOSアプリケーションをエミュレータでビルドしましょう。その状態でWebページ上の色のボタンを押すとiOSアプリケーションの画面色がリアルタイムに変化するのが分かると思います。

図20 Webページ上の色のボタンを押すとiOSアプリケーションの画面色がリアルタイムに変化する(サムネイルでは表示が崩れます。ご了承ください。)
図20 Webページ上の色のボタンを押すとiOSアプリケーションの画面色がリアルタイムに変化する

実機でのアプリケーション実行の仕方は今回は紹介していませんが、実機でもちゃんと動作します。

図21 実機でも動作する(サムネイルでは表示が崩れます。ご了承ください。)
図21 実機でも動作する

まとめ

このような感じでMilkcocoaを使うことでiOSとWebの連携をカンタンにすることができました。

Webエンジニアである筆者にとって、iOSとWebの連携は当初は凄く難しいイメージがあったのですが、Milkcocoaはその敷居を格段に下げてくれました。Milkcocoaを初めて触って数分でWebチャットアプリを作ったときにも感じましたが、やはりシンプルで分かり易いというのはライブラリやサービスでは重要な要素だと思います。

説明が無くても直感的に分かるシンプルさが筆者がMilkcocoaが好きな理由です。それと、ユーザへの対応も丁寧にしてくれるという点もあり、凄く応援しています。

最後になりますがiOS SDKは開発途中なので、興味のある方はcontact AT mlkcca.com(⁠⁠AT」「@」に変更)まで連絡をよろしくお願いします。また、情報が少ないと思いますので、FacebookでMilkcocoaのユーザーグループがありますのでこちらで質問などを投げかけると答えが見つかりやすくなるかもしれません。

おすすめ記事

記事・ニュース一覧