6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

国産MBaaSのKiiCloudをXamarin.Formsから使用する

Last updated at Posted at 2015-12-17

この記事は、Xamarin Advent Calendar 2015 の18日目の記事です
ここではXamarin.Formsとkii Cloud SDKを組み合わせて、
モバイルバックエンドサービス(MBaaS)を利用したクロスプラットフォーム開発をご紹介します。

Kii Cloudとは

公式HP
kii株式会社が提供する国産のBaaSです。
モバイルアプリ開発に欠かせないことの多いサーバー機能をサービスとして提供しています。

Kii Cloudが提供するMBaaS機能

いわゆるMBaaSとしての機能は一通り備えています。
加えて、IoTデバイス向けにもSDKを提供していたり、分析、A/Bテストといったシーンでも活用することができます!くわしくはこちら

  • ユーザ管理
  • データ管理
  • プッシュ通知
  • 位置情報
  • サーバー拡張機能
  • アプリ分析
  • A/Bテスト
  • モノ管理
  • Kii Game Cloud

対応しているプラットフォーム

  • Android
  • iOS
  • HTML5(JavaScript)
  • Unity

上記はSDKが提供されているプラットフォームです。
これ以外にもREST APIが用意されていますので頑張ればなんでもできます。
あ・・・気付きました?
Xamarin、対応してないですよね。
安心してください。使えます!詳細は後ほど。
国産なので日本語のリファレンスが非常に充実しています!

料金

  • Kii Cloud 利用登録:無料
  • ストレージ:1GBまで無料
  • APIリクエスト:月間100万APIコールまで無料
  • プッシュ通知:月間100万プッシュ通知まで無料

・・・成功するまでは無料ですね!
もちろん大規模向けのプランもあります。

使い方

それでは実際にKii Cloudで開発者登録をして、
Xamarin.Forms上でユーザ登録、データの保存までを行ってみましょう。

1. Kii Cloudへの登録

こちらから開発者登録ができます。
名前、メールアドレス、パスワードが必要です。
登録が完了すると、下記画面が表示されます。
DevRegister.PNG

今回は「Create App」を選択しましょう。

2. kiiCloud アプリの作成

「Create App」を選択すると、アプリ作成画面が表示されます。
AppCreate.PNG

①アプリ名を入力します。
 ここで入力するアプリ名はKii側での管理に使用するものです。
 アプリのバンドル等とは関係のないもので構いません。
 今回は「Xamarin.Forms.KiiTutorial」とします。
②サーバーのロケーションを選択します。
 今回は「Japan」とします。
③プラットフォームを選択します。
 今回は「Android, iOS」を選択します。

では「Create Your App」を選択して、アプリを作成しましょう。

3. Kii Cloud SDKのダウンロード

「Create Your App」を選択すると、SDKのダウンロード画面が表示されます。
SDKDownload.PNG

Xamarin向けのSDKは提供されていませんが、代わりにUnity向けSDKをダウンロードします。
unity-cloud-sdk-3.1.1.unitypackage(2015.12.17現在)がダウンロードできます。
このunitypackageのなかに含まれる下記DLLを引っこ抜きます!

  • KiiCloudStorageSDK.dll
  • JsonOrg.dll

UnitypackageをUnity経由で解凍して上記DLLだけ取り出すのが手間だったので、
SDK単体で配信してもらえないか中の人に聞いてみました。
http://community-jp.kii.com/t/kiicloudstoragesdk-dll/441
結果はダメとのことでしたが、質問から回答まで12時間という即レスをいただきました。
合わせて、オープンソースでこんなのあるよとご紹介を頂きました。感謝。
Unityを介さずUnityPackageを解凍するツール
使い方はこちらをご参照ください。
開発者communityは中の人も丁寧迅速にサポートしていますので、困ったらぜひ活用してみてください。

さて、ダウンロードが完了したら、Finishを選択しましょう。
そうすると、アプリ一覧画面が開きます。
AppMaster.PNG

今後ログインすると、この画面が表示されます。
アプリを選択し、詳細画面を開いてみましょう。
AppDetail.PNG
現在のユーザ数やObject数などが表示されています。
作ったばかりなのでまだ0ですね。

では、Xamarin側に入っていきましょう!

4. プロジェクトの作成

Xamarin.Forms PCLで作っていきます。
Xamarin Advent Calenderも18日目なので、詳細は割愛します。
Blank App(Xamarin.Forms Portable)で新規プロジェクト作成します。
今回は「XamarinKiiTutorial」としました。

プロジェクトテンプレートが開いたら、PCL側に
UnityPackageから取得した下記DLLを参照追加します。
SDKImport.PNG

続いて、SDKのInitializeを行い、SDKを使用する準備を行います。
下記ファイルを作成し、アプリ起動時に呼び出すInitializeメソッドを定義します。

KiiService.cs
using System;
using System.IO;
using System.Threading.Tasks;
using KiiCorp.Cloud.Storage;

namespace XamarinKiiTutorial
{
    public static class KiiService
    {
        private const string APPID = "********";
        private const string APPKEY = "********";
        private const Kii.Site SITE = Kii.Site.JP;
        
        public static bool kiiInitialize()
        {
            try
            {
                Kii.Initialize(KiiServiceObject.APPID, KiiServiceObject.APPKEY, KiiServiceObject.SITE);
                return true;
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

先ほど作成したアプリのAPPIDとAPPKEYを埋め込みます。
※APPIDとAPPKEYの取得方法はこちら
このメソッドをアプリ起動時に一度呼び出せばOKです。
これでPCL側からSDKを使用する準備ができました。

5. ユーザ登録/ログイン

Kii Cloud Storage SDKはUnity向けに構成されており、コールバックを渡すタイプのAPIになっています。

//User登録
public void Register (string password, KiiUserCallback callback)
//KiiUserCallback
public delegate void KiiUserCallback (KiiUser user, Exception e)

これだとasync/await演算子が使えず可読性が下がるので、Taskを返すタイプのAPIとしてラップします。
先ほど作成したKiiService.csクラスに、ユーザ登録、ログイン用のメソッドを追加していきます。

KiiService.cs
        public static Task<KiiUserResponse> KiiUserRegisterAsync(string username, string password)
        {
            KiiUser.Builder builder;
            builder = KiiUser.BuilderWithName(username);
            KiiUser user = builder.Build();

            var tcs = new TaskCompletionSource<KiiUserResponse>();
            user.Register(password, (KiiUser registeredUser, Exception e) => { tcs.TrySetResult(new KiiUserResponse(user, e)); });
            return tcs.Task;
        }

        public static Task<KiiUserResponse> KiiUserLoginAsync(string username, string password)
        {
            var tcs = new TaskCompletionSource<KiiUserResponse>();
            KiiUser.LogIn(username, password, (KiiUser user, Exception e) =>{tcs.TrySetResult(new KiiUserResponse(user,e));});
            return tcs.Task;
        }

レスポンスクラスを定義します。

KiiUserResponce.cs
using System;
using KiiCorp.Cloud.Storage;

namespace XamarinKiiTutorial
{
    public class KiiUserResponse
    {
        public KiiUser user { get; set; }
        public Exception e { get; set; }

        public KiiUserResponse(KiiUser User , Exception e)
        {
            this.user = User;
            this.e= e;
        }
    }
}

呼び出し側は以下のように使用します。

Login.xaml.cs
        private async void _Regist_Clicked(object sender, EventArgs e)
        {
            var res = await KiiService.KiiUserRegisterAsync(_UserName.Text, _Password.Text);
            if (res.e != null)
            {
                await this.DisplayAlert("Registration failed", res.e.ToString(), "OK");
                return;
            }
            App.LoginUser = res.user;
            await this.Navigation.PushAsync(new CreateObject());
        }

        private async void _Login_Clicked(object sender, EventArgs e)
        {
            var res = await KiiService.KiiUserLoginAsync(_UserName.Text, _Password.Text);
            if (res.e != null)
            {
                await this.DisplayAlert( "SignIn failed", res.e.ToString(),"OK");
                return;
            }
            App.LoginUser = res.user;
            await this.Navigation.PushAsync(new CreateObject());
        }

呼び出し側はawait演算子を用いて、同期っぽい書き方で非同期処理を記述することができます!

6. データの保存

KiiCloudでは、データスコープがいくつか存在します。

  • Application Scope : アプリ全体で共有するデータ
  • Group Scope : 特定のグループで共有するデータ
  • User Scope : ユーザ単位のデータ
  • Thing Scope : IoT単位のデータ

kiiCloudのデータ管理には、Bucket、Objectという概念があり、ObjectにはJSONもしくはファイルを格納できます。詳細はリファレンスガイドに任せて、今回はApplication Scopeにデータを書き込んでみます。

まずこれまでと同様にKiiService.csにデータ作成メソッドを追加しましょう。

KiiService.cs
        public static Task<KiiObjectResponse> KiiObjectCreateAsync(KiiObject obj)
        {
            var tcs = new TaskCompletionSource<KiiObjectResponse>();
            obj.Save((KiiObject savedObj, Exception e) => { tcs.TrySetResult(new KiiObjectResponse(savedObj, e)); });
            return tcs.Task;
        }

呼び出し側は以下のように使用します。
下記はApplication Scopeに"XamarinKiiTutorial" Bucketを作成し、その中にObjectを作成しています。
Objectの中に下記JSONを設定しています。

{ "username" : "{前画面で入力したユーザ名}" }
CreateObject.xaml.cs
        private async void _CreateObject_Clicked(object sender, EventArgs e)
        {
            KiiObject obj = Kii.Bucket("XamarinKiiTutorial").NewKiiObject();
            obj["username"] = App.LoginUser.Username;

            var res = await KiiService.KiiObjectCreateAsync(obj);
            if (res.e != null)
            {
                await this.DisplayAlert("KiiObject creation failed", res.e.ToString(), "OK");
                return;
            }
        }

それでは、実際に動かしてみましょう!

7. 動作確認

シンプルにユーザ登録・ログイン画面とObject作成画面だけ用意しました。

まずユーザ登録・ログイン画面です。
SignUp.PNG
ユーザとパスワードを入力してサインアップします。
SignUpSucceed.PNG
ユーザ登録成功が返却されました。kiiの管理画面を見てみましょう。
kiiUserCreated.PNG

ユーザ数が 1 になっていますね!

続いて、Objectを作成してみましょう。
object_create.PNG
Object作成ボタンをタップします。
ObjectCreateSucceed.PNG
Object作成成功が返却されました。kiiの管理画面を見てみましょう。
kiiObjectCreated.PNG

Application Scopeの"XamarinKiiTutorial" Bucketに Objectが生成され、指定したKey-Valueが格納されています。
今回ObjectのIDを指定していないので、UUIDが発行されていますが、明示的にObjectIDを指定して作成することもできます。

まとめ

今回、Xamarin.FormsからKii Cloud SDKを使用する方法をご紹介しました。
Xamarin.iOS,Xamarin.AndroidからKii Cloudを使用するTODOアプリもあります。

Unity用のSDKですが、少しラップをしてあげるとXamarinでも使いやすくなります!
本当はPush通知とかもやりたかったのですが、また別の機会に。
今回のサンプルはこちらにおいています。
興味がわいた方はぜひ触ってみてください。

6
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?