プロジェクトの作成
Appcelerator社が提供している「Appcelerator Cloud Services 」( 以下、ACS)は、モバイル端末向けアプリケーションで使用可能なサーバ側機能をWeb API経由で利用できるクラウドサービスです。前回 は、Titanium Studioを使ってサンプルプロジェクト「Kichen Sink(ACS版) 」を動かしてみました。今回は、それを参考にしながらログイン機能の部分を自分で作ってみましょう。
まず、Titanium Studioで新規に「Titanium Mobile Project」を作成します。本稿の例では、プロジェクト名は「MyFirstApp」に、テンプレートは「Tabbed Application」を選択しました。「 Automatically cloud-enable this application」にチェックを入れてACSとの連携を有効にしておくことを忘れないようにしましょう。
図1 ACS連携の有効化を忘れないように
続いて、「 C:\Users\USERNAME\Appdata\Roaming\Titanium\modules\ commonjs\ti.cloud \2.0.1\」フォルダ(「 C:\Users\USERNAME\」の部分はご自分の環境のユーザフォルダのパスに置き換えてください)にある「ti.cloud.js」と「packages.json」の2つのファイルをプロジェクトのResourcesフォルダにコピーします。ここまでの手順は前回の例と同様です。
Tabbed Applicationテンプレートを使ってプロジェクトを作成した場合、初期状態では図2 のようなUIの構成になっています。2つのタブに、同じWindowオブジェクトをタイトルを変えて配置している形です。今回はこれを少し修正して、Tab1にログイン/ログアウト用のウィンドウを、Tab2にユーザの新規追加用のウィンドウを配置する図3 のような形のアプリにしてみます。対象はAndroidスマートフォンとし、コード簡略化のためにiOSやタブレット端末は考慮しないことにします。
図2 Tabbed ApplicationテンプレートのデフォルトのUI構成
図3 MyFirstAppのUI構成
ログイン/ログアウト処理の実装
ACSとの連携が必要になるのは、ログイン/ログアウトを行うLoginWindow.jsと、ユーザの新規追加を行うAddWindow.jsの2箇所です。まずログイン処理ですが、ユーザ名とパスワードを入力して[ログイン]ボタンをクリックしたらTitaniumのACS用APIを呼び出してログインを実施するようにします。肝となるログインボタンの処理は次のようになります。
Cloud.Users.login({
login: 'gihyo',
password: 'gihyopass'
}, function (e) {
if (e.success) {
var user = e.users[0];
login.value = password.value = '';
alert('ID: ' + user.id + ' でログインしました。');
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
});
ログインを実施するために使うメソッドはTitanium.Cloud.Users.login()メソッドです。このメソッドのloginパラメータにユーザ名を、passwordパラメータにパスワードを渡すことでログイン処理が実行されます。ログインに成功すれば(コールバック関数のパラメータをeとすると)e.successにはtrueが、失敗すればfalseが設定されます。e.users[0]にはユーザの情報が格納されているため、ここからユーザIDやユーザ名などの情報を取得することができます。
続いてログアウトですが、ログアウトはTitanium.Cloud.Users.logout()メソッドを用いて次のように行います。logout()メソッドはパラメータを受け取らず、現在ログイン中のユーザに対してログアウト処理を実行して、成功すればe.successにtrueが、失敗すればfalseが設定されます。
Cloud.Users.logout(function (e) {
if (e.success) {
alert('ログアウトしました。');
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
});
以上を踏まえて、LoginWindow.jsは次のように作成しました。冒頭の「var Cloud = require('ti.cloud');」でti.cloudモジュールのAPIを読み込んでいます。ACSを利用する場合にはこの処理は必ず必要です。
function LoginWindow(title) {
var Cloud = require('ti.cloud'); // ACS用モジュールの読み込み
var self = Ti.UI.createWindow({
title:title,
backgroundColor:'white'
});
var content = Ti.UI.createScrollView({
top: '20dp',
contentHeight: 'auto',
layout: 'vertical'
});
self.add(content);
// ユーザ名入力フィールド
var username = Ti.UI.createTextField({
hintText: 'ユーザ名',
top: '10dp', left: '10dp', right: '10dp',
height: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
autocapitalization: Ti.UI.TEXT_AUTOCAPITALIZATION_NONE,
autocorrect: false
});
content.add(username);
// パスワード入力フィールド
var password = Ti.UI.createTextField({
hintText: 'パスワード',
top: '10dp', left: '10dp', right: '10dp',
height: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
passwordMask: true
});
content.add(password);
// ログインボタン
var loginButton = Ti.UI.createButton({
title: 'ログイン',
top: '10dp', left: '10dp', right: '10dp', bottom: '10dp',
height: '44dp', width: '200dp',
});
content.add(loginButton);
// ログイン処理
loginButton.addEventListener('click', function() {
Cloud.Users.login({
login: login.value,
password: password.value
}, function (e) {
if (e.success) {
var user = e.users[0];
login.value = password.value = '';
alert('ID: ' + user.id + ' でログインしました。');
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
});
});
// ログアウトボタン
var logoutButton = Ti.UI.createButton({
title: 'ログアウト',
top: '10dp', left: '10dp', right: '10dp', bottom: '10dp',
height: '44dp', width: '200dp',
});
content.add(logoutButton);
// ログアウト処理
logoutButton.addEventListener('click', function() {
Cloud.Users.logout(function (e) {
if (e.success) {
alert('ログアウトしました。');
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
});
});
return self;
};
module.exports = LoginWindow;
ユーザの新規追加処理の実装
ユーザの追加はTitanium.Cloud.Users.create()メソッドを使って行います。このメソッドには以下のようなパラメータを渡します。
username - ユーザ名
email - メールアドレス
password - パスワード
password_confirmation - 確認用パスワード
first_name - 名前
last_name - 姓
このうち、ユーザ名/メールアドレスのいずれかと、パスワード、確認用パスワードは必須であり、その他は省略可能です。その他にタグ(tags)やロール(role) 、写真ID(photo/photo_id)などを設定することもできます。
次の例では、ユーザ名、パスワード、確認用パスワード、姓、名前を渡してcreate()を呼び出しています。
Cloud.Users.create({
username: 'gihyo',
password: 'gihyopass',
password_confirmation: 'gihyopass',
last_name: 'Giyho',
first_name: 'Taro'
}, function (e) {
if (e.success) {
var user = e.users[0];
alert('ユーザを登録しました。現在ID: ' + user.id + ' でログイン中です。');
username.value = password.value = confirmPassword.value = firstName.value = lastName.value = '';
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
button.show();
});
ユーザの追加に成功するとe.successにtrueが、失敗するとfalseが設定されます。作成されたユーザのオブジェクトはe.users[0]に格納されているので、ここからユーザIDやユーザ名などの情報を取得できます。なお、ユーザIDはユーザを追加した際に自動で設定されるものです。
これを踏まえて、AddWindow.jsは次のように作成しました。
function AddWindow(title) {
var Cloud = require('ti.cloud'); // ACS用モジュールの読み込み
var self = Ti.UI.createWindow({
title:title,
backgroundColor:'white'
});
var content = Ti.UI.createScrollView({
top: '10dp',
contentHeight: 'auto',
layout: 'vertical'
});
self.add(content);
// ユーザ名入力フィールド
var username = Ti.UI.createTextField({
hintText: 'ユーザ名',
top: '10dp', left: '10dp', right: '10dp',
height: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
autocapitalization: Ti.UI.TEXT_AUTOCAPITALIZATION_NONE,
autocorrect: false
});
content.add(username);
// パスワード入力フィールド
var password = Ti.UI.createTextField({
hintText: 'パスワード',
top: '10dp', left: '10dp', right: '10dp',
height: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
passwordMask: true
});
content.add(password);
// 確認用パスワード入力フィールド
var confirmPassword = Ti.UI.createTextField({
hintText: 'パスワードの確認',
top: '10dp', left: '10dp', right: '10dp',
height: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
passwordMask: true
});
content.add(confirmPassword);
// 姓入力フィールド
var lastName = Ti.UI.createTextField({
hintText: '苗字',
top: '10dp', left: '10dp', right: '10dp',
hseight: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED
});
content.add(lastName);
// 名前入力フィールド
var firstName = Ti.UI.createTextField({
hintText: '名前',
top: '10dp', left: '10dp', right: '10dp',
hseight: '40dp',
borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED
});
content.add(firstName);
// ユーザ追加ボタン
var button = Ti.UI.createButton({
top: '10dp', left: '10dp', right: '10dp', bottom: '10dp',
height: '44dp', width: '200dp',
title: '追加',
});
content.add(button);
// ユーザの追加処理
button.addEventListener('click', function() {
Cloud.Users.create({
username: username.value,
password: password.value,
password_confirmation: confirmPassword.value,
last_name: lastName.value,
first_name: firstName.value
}, function (e) {
if (e.success) {
var user = e.users[0];
alert('ユーザを登録しました。現在ID: ' + user.id + ' でログイン中です。');
username.value = password.value = confirmPassword.value = firstName.value = lastName.value = '';
}
else {
alert((e.error && e.message) || JSON.stringify(e));
}
button.show();
});
});
return self;
};
module.exports = AddWindow;
MyFirstAppの実行例
タブを構成するApplicationTabGroup.jsは次のようになります。
function ApplicationTabGroup(Window1, Window2) {
//create module instance
var self = Ti.UI.createTabGroup();
//create app tabs
var win1 = new Window1('ログイン/アウト');
var win2 = new Window2('ユーザの追加');
var tab1 = Ti.UI.createTab({
title: 'ログイン/アウト',
icon: '/images/KS_nav_views.png',
window: win1
});
win1.containingTab = tab1;
var tab2 = Ti.UI.createTab({
title: 'ユーザの追加',
icon: '/images/KS_nav_ui.png',
window: win2
});
win2.containingTab = tab2;
self.addTab(tab1);
self.addTab(tab2);
return self;
};
module.exports = ApplicationTabGroup;
ApplicationTabGroupのコンストラクタにはタブに表示する2つのウィンドウ(ここではLoginWindowとAddWindow)を渡せばいいので、app.jsは次のようになります。
//bootstrap and check dependencies
if (Ti.version
ここまでできたら、MyFirstAppをAndroid端末かエミュレータにインストールして実行してみましょう。最初は図4 のようにログイン/ログアウトタブが表示されます。ユーザの追加タブは図5 のようになっています。ここで任意のユーザ情報を入力して[追加]ボタンをクリックすると、ユーザが作成されて図6 のように表示されます(ユーザの作成に失敗するとエラーが表示されます) 。
図4 ログイン/ログアウト画面
図6 ユーザ追加画面
図6 ユーザの追加に成功
ユーザを追加した場合、自動的にそのユーザでログインしたいる状態になります。ログイン/ログアウトタブに戻って、[ログアウト]ボタンをクリックすると、ログアウト処理が実行されて図7 のように表示されま。再び、今作成したユーザ名とパスワードでログインしてみましょう。ログインに成功すれば図8 のように表示されるはずです。
図7 ログアウトに成功
図8 ログインに成功
さて、この時点でACSのMy Apps ページにはMyFirstAppが自動的に登録されているはずです。そこから管理画面にアクセスして、Usersの情報を表示させると、図9 のようにアプリで追加したユーザが正しく登録されていることを確認できます。
図9 ACSの管理画面でもユーザ情報を確認できる