IBM Cloud Functions
IBM Cloud FunctionsはIBMが提供するサーバーレスの機能でいわゆるFaaSと呼ばれるものになります。ベースとなっている技術はApacheのOpenWhiskなので、すでにOpenWhiskを使ったことがある方でしたら、新しい知識は不要でそのままご利用頂けます。また、そういった状況からIBM Cloud Functionsで作成した処理も手離れが良く、ベンダーロックインしづらいものになります。
今回は、IBM Cloud Functionsで作成したアクションをiOSアプリから呼び出す実装を行っていきたいと思います。
1. IBM Cloud Functions
アクションの作成
先ずはFunctionsにアクションを作成します。 IBM Cloud へログインし、メニューからFunctionsを選択します。

IBM Cloud Functionsでのサーバーレスアプリの開発は、二つのステップに分かれます。
(1)アクションの作成
(2)トリガーやAPIによる呼び出しの設定
まず、実行させたい処理に合わせてコードを記述します。このコードは「アクション」としてIBM Cloud Functionsに登録します。
次に、登録したコードを呼び出す条件を設定します。外部のイベントやHTTPリクエストを条件とすることで、アクションの実行を自動化できます。
なお、IBM Cloud Functionsのアプリは「GUI」「CLI」どちらのユーザーインタフェースを利用しても開発できますが、ここでは、GUIを用いた開発の方法を解説します。
Functionsの開始画面中央にある「作成の開始」ボタンをクリックして始めます。

「アクションの作成」リンクをクリックします。開いた画面で「アクション名」に任意 の 名 前(こ こ で は「Hello Dojo」)を 入 力 し ま す。「パ ッケージを囲む」はそのままにして、「ランタイム」で開発する言語やバージョン(ここでは「Node.js 10」)を選び、「作成」をクリックします。

画面中央のエディタでコードを編集できます。コードを編集してアクションを開発するときに、気を付けなければならない点が三つあります。
- アクションが呼び出されると、まず「main」関数が実行されるため、main関数が必須。
- アクションへの入力および出力はともに「JSON」形式。データ構造は自由に指定できる。
- IBM Cloud Functionsではアクションが呼び出されるたびにインスタンスが作成され、処理が完了するとインスタンスは破棄される。よって、アプリはステートレスに記述する。

右側に結果のウィンドウが表示され、「Hello World」のメッセージが確認できます。

次にコードを書き換えてみましょう。
アクションが呼び出されたときに「パラメーター」を渡すことが可能です。次のように、コードを書き換えて「保存」ボタンをクリックします。
「name」というパラメーターが渡された場合に、出力を変更するようなコードを追加しています。
function main(params) {
if (params.name) {
return { message: params.name };
}
return { message: ‘Hello Dojo’ };
}

アクションに渡すパラメーターを設定します。
右上の「入力の変更」をクリックし、次のようにJSON形式でパラメーターを入力します。「Taiji」の部分は各自好きな名前に置き換えてください。
「適用」ボタンをクリックし、再度「起動」ボタンをクリックします。
パラメーターが反映され、結果のメッセージが変わりました。

2. iOSアプリの作成
iOS SDKのダウンロード
先ずはSDKをこちらからダウンロードします。
この SDK にはボイラープレート Xcode プロジェクトが含まれています。
ダウンロードしたファイルの中からプロジェクトファイルへアクセスします。
この記事を書いている時点では:
starterapp-0.3.0.zipを展開し、作成されたstarterapp-0.3.0の中へ移動します。
依存関係ファイルの取得
ダウンロードしたプロジェクトファイルの中には、PodfileとCartfileが2つとも用意されています。お好きな方でファイル取得を行って下さい。
CocoaPods の場合: pod install
を実行し、結果の Xcode ワークスペースを開きます。
Carthage の場合: carthage update
を実行します。 これにより、Carthage/Build/iOS/Cloud Functions.framework が作成されます。 Xcode を開き、そのファイルを Cloud Functions iOS スターター・アプリのターゲットの「組み込みバイナリー」セクションに追加します。
ViewController.swift を変更
ViewController.swift を開いて、これらの 2 行を編集します。 これらの値はIBM Cloud Functionsの画面のエンドポイントメニューから確認ができます。


let WhiskAppKey: String = “ご自身のAPIキー”
let WhiskAppSecret: String = “ご自身のAPIシークレット”
動作確認
プロジェクトを実行して、セットアップを検証します。 iPhone シミュレーターで”「タップ」”をクリックすると、現在日付が表示されます。

自分で作成したアクションを呼び出す
先ほど作成した、自作のアクション「Hello Dojo」を呼び出してみます。
それに伴い、スマホ画面の文言なども変更してみましょう。
ViewController.swift を編集
39行目あたりにある以下のコードを編集します。デフォルトではOpenWhiskのシステムユーティリティのアクションを呼ぶようになっていますが、こちらを自分で作成したアクションの情報へ変更します。
特に名前空間を設定していない場合、IBM Cloud Functionsでの名前空間(Name Space)は、「組織名+アンダーバー+スペース」です。例えば、組織名が「fillgapapp01@fillgap.jp」でスペースが「dev」だとすれば、namespaceは「fillgapapp01@fillgap.jp_dev」となります。
名前空間についてはこちらの記事もご参照下さい。
let MyNamespace: String = "whisk.system"
let MyPackage: String? = "utils"
let MyWhiskAction: String = "date"
↓ ↓ ↓ ↓ ↓
let MyNamespace: String = “fillgapapp01@fillgap.jp_dev”
let MyPackage: String? = “”
let MyWhiskAction: String = “Hello Dojo”
次にボタンクリック時の処理を変更します。「whiskButtonPressed(sender: AnyObject)」関数内部のコードを以下のように修正します。
ここでは私の名前である「Taiji」を設定していますが、ご自身の名前などを設定して下さい。
if let currentLocation = currentLocation {
MyActionParameters = [“latitude”: currentLocation[0].coordinate.latitude as AnyObject, “longitude”: currentLocation[0].coordinate.longitude as AnyObject]
MyActionParameters = [“latitude”: currentLocation[0].coordinate.latitude as AnyObject, “longitude”: currentLocation[0].coordinate.longitude as AnyObject]
}
↓ ↓ ↓ ↓ ↓
MyActionParameters = [“name”: “Taiji” as AnyObject]
次に結果表示処理の部分を変更します。「displayOutput(reply: [String:AnyObject])」関数内部のコードを以下のように修正します。
if let date = reply[“date”] as? String{
self.outputText.text = “The date is \(reformatDate(dateStr: date))”
}
↓ ↓ ↓ ↓ ↓
if let name = reply[“message”] as? String{
self.outputText.text = “My name is \(reformatDate(dateStr: name))”
}
これでコードの修正は全て完了です。続いて初期表示画面の文言を修正します。
Main.storyboardを編集
初期表示に設定している文言を「Tap me」から「What's your name?」へ修正します。パラメーターに設定した自分の名前を返す処理なので、このようにしていますが、文言はお好きな表現に変えていただいてOKです。

3. アプリを実行する
Xcodeからアプリケーションを実行します。
無事、自分で作成したアクションが呼び出されました。
