フリーダムの日記(旧)

IT の技術的なことを中心に書いています。

【Titanium Advent Calendar 2011:二十五日目】SalesForce Toolkitについて

【はじめに】
この記事は、@astronaughtsさん企画のTitanium Advent Calendar 2011 : ATND向けに書いています。今回、すばらしい企画を立ててくれた@astronaughtsさんに感謝します。
Titaniumは、最近使いはじめたばかりですが、現在は、SalesForceアプリ開発をしています。Marketplaceから出ているSalesForce Toolkitを利用した開発をしていたのですが、幾つか動作しない機能があったりと、色々と苦労した点を紹介したいと思います。

SalesForceについて】
すでにご存知の方も多いとは思います。
Salesforce - セールスフォース・ドットコム
何かと話題の多いSalesForceですが、最近は、Heroku( http://heroku.com/ )を買収したことが有名でしょうか。Rubyの作者であるまつもとゆきひろ氏が「Rubyチーフアーキテクト」に就任しています。

SalesForce Toolkit】
今回の本題ですが、SalesForce Toolkitは、Salesforce.comのOAuth 2.0の仕組みを利用しています。詳しい内容については、Salesforce.comのOAuth 2.0を参照してください。

アプリ側では、loginの認可後に発行されたアクセストークンを利用して、Salesforce側からデータを取得します。アクセストークンの有効期限が切れた場合は、リフレッシュトークンを利用して、再度有効なアクセストークンを取得します。が、このリフレッシュトークンを利用してアクセストークンを取得する機能が動作しなく、かなり困りました。

Console上では、以下のようなメッセージが表示され、動かなくなります。

DbDotCom.REST.OAuth.refreshToken: 5Aep861GOxOe7rOs7A1z2Tsu4MweeRuYUH7SDBbwdzpDz1y8MW5rs6NG0NY9cX59syHGe.o16xJgg%3D%3D

retry: undefined

e: Error Domain=ASIHTTPRequestErrorDomain Code=3 "Authentication needed" UserInfo=0xa27ea40 {NSLocalizedDescription=Authentication needed}

XHR status: 401

[ERROR] In the error handler looking for a 401, and have a 401

[ERROR] Handleing the 401 error...

そこで、RESTの呼び出しが401で失敗したら,自前でリフレッシュトークンを利用して、有効なアクセストークンを取得して、Titaniumのプロパティーを書き換えるように実装しました。実は、このTitaniumのプロパティーについても知らなくて、今回色々と勉強になりました。

var oauthData = Ti.App.Properties.getString("oauthData_preference");
Ti.App.Properties.setString('oauthData_preference', JSON.stringify(j));
FDC.ForceOAuth.setOAuthData(j);

と、プロパティーの使い方を知りました。
実は、自前で実装後にこのTitanium Salesforce moduleについて、pomu0325さんがpomu0325: Titanium Salesforce module(SalesForce Toolkit for Appcelerator)の使い方 (2)と紹介しているのを発見しました。パッチも提供されておりますので、こちらを見ていただいた方が早いかと思います。pomu0325さん大変ありがとうございます。

もう一つは、アプリを起動後にhttps://login.salesforce.com/という、Salesforceのログイン画面を表示します。なぜか、このログイン画面が、シミュレータでは、表示されるが、実機(iPhone4)では、表示されないという問題もありました。原因は、Titanium の WebView を使用しているのですが、WebViewの指定がモジュール側でなく、アプリ側で、var dummy = Ti.UI.createWebView({});と指定することで対応できました。

【最後に】
今回、勢いでTitanium Advent Calendar 2011 : ATNDに申し込んでしまいました。はじめは、何を記事にしようか最後まで迷いましたが、会社の後輩が、Salesforceのモジュールで苦労したことで、いいんじゃないですかと言ってくれたので、なるほどと思い、この話題にさせていただきました。
また、今回の開発では、会社の後輩をはじめ、同様にSaleforce関連で開発をしている他の会社の方々にも色々と協力をしていただきありがとうございました。今後は、会社の業務もありますが、これを機会に自分でもアプリをどんどん開発していきたいと思います。

今後ともよろしくお願い致します。