2012年10月28日日曜日

Force.com SDK for iOSをStoryboard対応に

Force.com SDK for iOSのテンプレートを簡単にStoryboard対応にする方法をまとめました。以前はRestKitがソースごと提供されていたのでスプラッシュも含めて変更可能だったのですが、今はバイナリとヘッダだけになってしまったので簡単にはいじれません。

そこで、SFAuthorizingViewController.xibはそのまま残して、それ以外をStoryboard対象とします。

1.新しいプロジェクトをテンプレートNative Force.com REST Appから作る

Use Automatic Reference Counting(ARC)チェックはオフで。

2.新しいStoryboardを用意してTableViewControllerを貼る。

Storyboardの名前はStoryboardとします。新しく出来たStoryboardは何も入っていない状態なので、ここにTable View Controllerを貼ります。

3.Table View Controllerの設定

カスタムクラスとしてRootViewControllerを設定し、View ControllerのIdentifierを rootView にします。Storyboard上のPrototype Cells下にあるTable View Cellをクリックし、Identifierを CellIdentifier に変更します。

4.ソースの変更

AppDelegate.mのを以下のものと差し替えます。


- (UIViewController*)newRootViewController {
    UIStoryboard *storyboard 
        = [UIStoryboard storyboardWithName:@"Storyboard" 
                                    bundle:[NSBundle mainBundle]];
    RootViewController *rootVC 
        = [storyboard instantiateViewControllerWithIdentifier:@"rootView"];
    
    UINavigationController *navVC
        = [[UINavigationController alloc] initWithRootViewController:rootVC];
    
    return navVC;
}


5.SFNativeRootViewController.nib削除


残してあっても影響ないので、削除しなくても変わりありませんが。


以上で、OK。iPhone Simulatorを選んでRunするとちゃんとAuthorize画面が出て、認証後Table Viewに進みます。あとはよろしく:-)

2012年10月23日火曜日

iOS開発環境の移行

■証明書.p12を保存しておこう■

旧マシンからの移行はiTunes Connectなどのおかげもあって割と簡単なのですが、重要なことが一つ。

iTunes Connectに公開鍵などを登録しますが、その時に使った証明書.p12を保存しておかないと新しい環境上でプロビジョニングなどを有効にすることができません。

新しいマシンのXcode / Organizer上でプロビジョニング行の一番左に黄色い三角と「valid signing identify not found」の文字が表示されて実機テストが出来なくなってしまいます。

もし保存していなかった場合には、旧マシン上でKeyChainから証明書をダウンロードする必要があります(もし旧マシンが死んじゃった場合にはどーすんだろ…プロビジョニングなどを全部消してやりなおしたという記事は見たことありますけども…)
  1. アプリケーション->ユーティリティ下にあるKeyChainを起動して左下にある「鍵」をクリックします。
  2. 右側に表示される一覧の中から、iTunes Connectへの登録時に使ったApple ID名の秘密鍵を右クリック、「"名前"の証明書を書き出す」を選びパスワードを登録します。
  3. ファイルを適当な場所に保存し、新しいマシンに移し替えます。
  4. 新しいマシンで証明書.p12ファイルをダブルクリックするとKeyChainが起動、パスワードを入力します。
これで証明書が確認されます。Xcode / Organizer上のプロビジョニングがちゃんと有効になっている、はずです。

2012年10月22日月曜日

Titanium studioのLionへのインストール

真っさらのLionにTitanium studio 2.1.2をインストールして起動したら、Permission Deniedエラーが出ました。/Library/Application SupportにTitanium SDKをインストールできない由。

ググると「Library/Application Supportのパーミッション変えろよwww」って悪魔のような回答が英語で山ほど出てくるのですが、それはさすがにセキュリティ的にいけません。

本当は~/Library/Application Support/下にTitanium SDKをインストールするのがLion的な流儀だと思うのですが、Titanium StudioのPreference->Aptana->TitaniumでTitanium SDK Homeを変更しようとしても変更できません。

ということで、妥協Work Aroundですが…自分で/Library/Application Support/Titanium/を作ってやればOKです。

1.Titanium Studioを終了


2.Finderで/Library/Application Supportへ移動

Finderで「ライブラリ」が見えない時には、Finderを選んだ状態でoptionキーを押しながら移動メニューをクリックします。で、見えたら直下のApplication Supportをクリック


3.新しいフォルダを作る

ここに新しいフォルダを作ると管理者パスワードを聞いてきますので、認証します。


4.フォルダの名前を変更する

名称未設定フォルダの名前を Titanium に変更します。この状態では自分自身がTitaniumフォルダのオーナーなので起動したアプリからここに書き込みができます。

これでTitanium Studioを起動すれば、workspaceの設定、Appceleratorアカウントの認証などの後、Titanium SDKが自動的にダウンロードされ、使えるようになるはずです。

いやはや。なお「今更Lionかよ」…という突っ込みはナシの方向で。

2012年10月21日日曜日

Force.com IDE on Eclipse juno

まっさらなMacOS X Lion環境にEclipse junoをインストールし、Install New SoftwareからForce.com IDEを入れようとしたら以下のエラーが出て失敗しました。


Cannot complete the install because one or more required items could not be found.
  Software being installed: Force.com IDE 25.0.0.201206181021 (com.salesforce.ide.feature.feature.group 25.0.0.201206181021)
  Missing requirement: Force.com IDE 25.0.0.201206181021 (com.salesforce.ide.feature.feature.group 25.0.0.201206181021) requires 'org.eclipse.update.ui 0.0.0' but it could not be found


調べたところ、このWork aroundで無事解決しました。

1.HelpメニューからEclipse Market Placeを選択

2.Find:に "EMF Compare"と入力してGO

3.検索結果から "EMF Compare : model comparison and merge"のInstallボタンをクリック

4."EMF Compare ..."を選択し、Nextボタンをクリック

5."I accept..."を選択して、Finishボタンをクリック

6.数秒間"Installing Software"を待って


7."Software Updates"でEclipseをリスタートするか?と聞いてくるのでYes
8.再起動後にForce.com IDEをインストール

今度は無事インストール完了しました。いやはや。

ところで、上の画面コピーが汚い件。

「このウィンドウだけスクリーンショットを取る」みたいなツールを入れてたはずですが、使い方をすっかり忘れてcmd+shift+4に頼ってます。

2012年10月20日土曜日

本気でTitanium mobile / ACS

■クロスプラットフォームでPush Notification必須■

会社でのアプリ開発、当初はobj-cで進めてましたが「Androidは?」という意見が出てきたので、大きな投資なしにクロスプラットフォームでのPush Notificationが使えるTitanium ACSを使うことになりました。

私、基本的にラクにラクに生きていたいのでインターフェースビルダのないツールってのは苦手なんすけど…でもHTML5+JavaScriptのPhoneGapよりJavaScript+NativeのTitaniumの方が大分サクサク動きますし、Sencha TouchほどではないにせよPhoneGapよりMVCをきれいに分離できるので、まぁいいや。

ただ、基本的にデモ程度しか作ったことがないので、ViewをフリップさせるのすらGoogle先生のお世話になりっぱなしです。

例えば、「キーボードが出てきたよ」というイベントや、その時有効な画面サイズを引っ張ってくることができない(obj-cでプラグイン書けば可能)ので、よくある「テキストを入力しようとすると適切な位置にTextFieldが動く…っていうアレを実装するのに一苦労する…というレベルです。

「obj-cなら…」というため息を抑えつつ仕事する今日この頃。

■ACSを使うには■

以前はti.cloud.jsを手動でコピーする等の手順が必要でしたが、最新のSDK 2.1では新規プロジェクトを作る際に「automatically cloud-enabled this application」をチェックすれば自動的にモジュールが読み込まれるようになりました。

ググって出てくる事例は、この辺がちょっと古いものもあるので、「本家ページ」を参照しながら読み進むと良いです。

これでcreateUser, loginまでは何の問題もなく進みます。強いていえば、サンプルのcreateLoginではパラメータとしてemailを渡していないことと、「Create Succsssが返って来ているのにACS Management側で登録されたデータが見えない」と思ったらmanagement画面のモードがDevelopmentでなくProductionになっていた、って2点ぐらいです。

■Chatメッセージを送ってみる■

本家掲載のサンプルを使って、ボタンをクリックするとメッセージを送信するテストをしてみました。なお、ここで一つハマったのは、idsです。usernameでもemailでもなく、user idを指定しなければいけません。

app.jsでログイン処理を書き、以下のコードを適当なwindow.jsに貼ります。


    var button = Ti.UI.createButton({
        top:100,
        width:50,
        height:30,
        title:'送信'
    });
    view.add(button);
    
    button.addEventListener('click', function(e) {
        var ids = ['ここはユーザID'];
        Cloud.Chats.create({
            to_ids: ids.join(','),
            message: 'Good morning'
        }, function (e) {
            if (e.success) {
                for (var i = 0; i < e.chats.length; i++) {
                    var chat = e.chats[i];
                    alert('Success:\\n' +
                        'From: ' + chat.from.first_name + ' ' + chat.from.last_name + '\\n' +
                        'Updated: ' + chat.updated_at + '\\n' +
                        'Message: ' + chat.message);
                }
            } else {
                alert('Error:\\n' +
                    ((e.error && e.message) || JSON.stringify(e)));
            }
        });        
    });


「送信」ボタンをタップすると数秒後「success」のアラートが表示されるはずです。

■ところで■

ACSはRESTベースのサービスです。
別にTitaniumに限定されているわけじゃないんですよね。

nativeだったら今頃は…。でも、このまま進みます

次回いつになるかわかりませんが、お楽しみに。