Alamofireを利用して、Apple TVからKii cloudにアクセスする


BaaSはさまざまなクライアントから簡便に利用できることが魅力、ということでApple TV(tvOS)からKii Cloudにアクセスする方法を試してみました。

手法とサンプルの概要

今回は、簡単なタスク管理アプリを作成する想定でサンプルを実装します。
また、Kii Cloudへのアクセスには、Swiftでは定番のネットワークライブラリであるAlamofireを使用してREST API経由で行います。
※以降の説明は、Alamofireはインストール済みであるものとして記載しています。

 

ログイン

まずは以降の処理の前準備、すなわちアクセストークンの取得も兼ねてログインを行います。
ログイン用のサンプルコードは以下のとおりです。
※ユーザはあらかじめ登録済み(Login name: “user”, Password: “user”)であるとします。
※また、変数appID/appKeyにはそれぞれKii CloudアプリケーションのIDとキーが格納されているものとします。

 let url = "https://api-jp.kii.com/api/oauth2/token"

 let headers = ["X-Kii-AppID": appId,
                "X-Kii-AppKey": appKey,
                "Content-Type": "application/json"]
 
 let param: [String: String] = ["username":"user", "password":"user"]
 
 // リクエストを実行し、json形式でレスポンスを取得
 Alamofire.request(.POST, url, parameters: param, encoding: .JSON, headers: headers).responseJSON { response in 
     // レスポンスからユーザIDとアクセストークンを取得 
     let responseDic = response.result.value as! [String: AnyObject]
     let userId = responseDic["id"] as? String
     let accessToken = responseDic["access_token"] as? String

     // ユーザIDとアクセストークンをUserDefaultsに格納
     NSUserDefaults.standardUserDefaults().setObject(userId, forKey:"userId")
     NSUserDefaults.standardUserDefaults().setObject(accessToken, forKey:"accessToken")
 }

上記の通り、Kiiの公式ドキュメントに記載された形式の通りのリクエストパラメータ・ヘッダをDictionaryに格納して、それらを引数としてrequest:_:parameters:encoding:headers:を実行するだけでOKです。
実行結果(この場合はアクセストークン)は、レスポンスをキャストしたDictionaryから取得します。

また、これ以降に行うObjectへのアクセスで必要となるため、ユーザIDとアクセストークンをアプリ内(この例ではUserDefaults)に保存しておきます。

 

Objectの追加

次にKii Cloud上にObjectを追加します。
基本的にはログインと同様に、あらかじめ生成したパラメータとヘッダを引数としてリクエスト用メソッドを実行するだけですが、ログイン処理とは以下の点が異なります。

  • ヘッダにアクセストークンの情報を付与する必要がある
  • ヘッダに指定するContent-Type
  • リクエストパラメータの中身がKii Cloud上に追加するObjectの値になる

以下の例では、ユーザスコープ内の”task”バケツにObjectを追加する場合を想定しています。
なお、スコープごとにエンドポイントURLが異なるので詳しくはこちらを参照してください。

 // ユーザIDとアクセストークンを取得
 let userId = NSUserDefaults.standardUserDefaults().objectForKey("userId") as! String
 let accessToken = NSUserDefaults.standardUserDefaults().objectForKey("accessToken") as! String

 // バケツ名
 let bucketName = "task"

 let url = "https://api-jp.kii.com/api/apps/\(appId)/users/\(userId)/buckets/\(bucketName)/objects"

 let headers = ["Authorization": "Bearer \(accessToken)",
                "X-Kii-AppID": appId,
                "X-Kii-AppKey": appKey,
                "Content-Type": "application/vnd.\(appId).mydata+json"]
 
 let param: [String: String] = ["title":"鬼退治", "description":"鬼ヶ島にいる鬼を退治する"]
 
 // リクエストを実行し、json形式でレスポンスを取得
 Alamofire.request(.POST, url, parameters: param, encoding: .JSON, headers: headers).responseJSON { response in 
     // レスポンスからObjectIDを取得 
     let responseDic = response.result.value as! [String: AnyObject]
     let objectId = responseDic["objectID"] as? String
 }

これで、Kii Cloud上には以下のようにObjectが追加されます。

登録されたObject

 

OBJECTの取得

最後に、さきほど追加したObjectを取得します。
こちらも基本的にはこれまでのやり方と同様ですが、ログイン処理とは以下の点が異なります。

  • ヘッダにアクセストークンの情報を付与する必要がある
  • ヘッダに指定するContent-Type
  • リクエストパラメータの中身が検索クエリになる
 // ユーザIDとアクセストークンを取得
 let userId = NSUserDefaults.standardUserDefaults().objectForKey("userId") as! String
 let accessToken = NSUserDefaults.standardUserDefaults().objectForKey("accessToken") as! String

 // バケツ名
 let bucketName = "task"

 let url = "https://api-jp.kii.com/api/apps/\(appId)/users/\(userId)/buckets/\(bucketName)/query"

 let headers = ["Authorization": "Bearer \(accessToken)",
                "X-Kii-AppID": appId,
                "X-Kii-AppKey": appKey,
                 "Content-Type": "application/vnd.kii.QueryRequest+json"]
 
 // リクエストパラメータとしてクエリを指定(今回は全件取得)
 let param = ["bucketQuery":
     ["clause":
         ["type":"all"]
     ]
 ]
 
 // リクエストを実行し、json形式でレスポンスを取得
 Alamofire.request(.POST, url, parameters: param, encoding: .JSON, headers: headers).responseJSON { response in 
     // レスポンスからobjectを取得
     let responseDic = response.result.value as! [String: AnyObject]
     let resultObjectArray = responseDic["results"] as! [[String: AnyObject]]
 
     for resultObject in resultObjectArray {
         // object内の値はkey指定により参照
         print(resultObject["title"]!)       // -> 鬼退治
         print(resultObject["description"]!) // -> 鬼ヶ島にいる鬼を退治する
     }

 }

 

まとめ

Apple TV(tvOS)からKii Cloudへのログイン/Object追加/Object取得を行う方法をご紹介しました。

なお、今回の例のようにTraditional Appとして実装する場合、tvOS用に実装したコードは基本的にそのままiOS用として利用できます。