iOSアプリからIBM Cloud Functionsのアクションを呼び出す

Taiji
10 min readSep 30, 2019

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を選択します。

Functionsを選択

IBM Cloud Functionsでのサーバーレスアプリの開発は、二つのステップに分かれます。
(1)アクションの作成
(2)トリガーやAPIによる呼び出しの設定

まず、実行させたい処理に合わせてコードを記述します。このコードは「アクション」としてIBM Cloud Functionsに登録します。
次に、登録したコードを呼び出す条件を設定します。外部のイベントやHTTPリクエストを条件とすることで、アクションの実行を自動化できます。

なお、IBM Cloud Functionsのアプリは「GUI」「CLI」どちらのユーザーインタフェースを利用しても開発できますが、ここでは、GUIを用いた開発の方法を解説します。
Functionsの開始画面中央にある「作成の開始」ボタンをクリックして始めます。

作成の開始

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

アクションの作成

画面中央のエディタでコードを編集できます。コードを編集してアクションを開発するときに、気を付けなければならない点が三つあります。

  1. アクションが呼び出されると、まず「main」関数が実行されるため、main関数が必須。
  2. アクションへの入力および出力はともに「JSON」形式。データ構造は自由に指定できる。
  3. 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の画面のエンドポイントメニューから確認ができます。

エンドポイントメニューから「API鍵」をクリック
API鍵欄にあるコロンを挟んで前がキー、後ろがシークレット

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です。

Storyboardから文言を修正

3. アプリを実行する

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

呼び出されたアクションの内容が正しく表示されていることを確認

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Taiji
Taiji

Written by Taiji

Datadog Senior Developer Advocate | Ex-OutSystems Dev Community Advocate | Ex-IBM Dev Advocate | Microsoft MVP | 筑波大学、名城大学非常勤講師 | 記事は個人の見解であり、所属する組織とは関係ありません。

No responses yet

Write a response