ラベル iPad の投稿を表示しています。 すべての投稿を表示
ラベル iPad の投稿を表示しています。 すべての投稿を表示

2012年8月23日木曜日

Force.com SDK for iOS最新版

今週の月曜日から仕事でいじってました。

GitHubからzipで落としてもダメなのは以前と同じ。ちゃんとgitでcloneしてから./install.shしましょう。

今度のリリースでローカル・キャッシュなども加わったので、その辺もぜひ試してみたいんだけど、とりあえず会社の案件では用がないので保留…この週末にでも個人用アプリで試してみますべ。

で、新しいテンプレートですが…今度こそARCとかStoryboardに対応しているのでは?と3mmぐらい期待したのですが、してません。まぁARC無くても困らないんだけど、先週この案件に向けて下調べしていたViewはStoryboardが前提だったのでちょっと苦労しました。でも、まぁnibの方が素直というかイマイチ挙動を把握し切れていないSegueよりもわかりやすいので決定的な不利にはならないのですが。あと、今まで手動でやらなきゃいけなかった設定(Linkerのオプションとかライブラリの選択)が不要になっているのは少し楽。

今回の案件は「クラウド上のデータをiPad上に表示し、ユーザの操作を収集してクラウド上に上げる、てな案件のデモ版を作る」というものです。ViewControllerの数は5つ、Force.comは全部custom objectで6 objects、親子関係4世代とその横に親子関係2世代が参照関係でつながっているという単純なものです…と文字で説明しても「何のこっちゃ?」だと思いますが、一応勤務先の案件なのでご勘弁を。

ところで、このぐらいの規模のデモアプリ、他の人はどんな感じで作業しているんでしょうかね。

私の場合はざっとこんな感じ:

  • 月曜
    • SDKを新規インストールしてテンプレートプロジェクト作成
    • nibで要求仕様通りの画面構成を実装してNavigationBarなどが邪魔しないことを確認
    • Force.comで必要なデータベースを定義して一番基本的なデータがiOSアプリのUITableView上に表示されるところまで。ほぼ定時。
  • 火曜日
    • Tableからタップして表示されるUIPageViewControllerまわりの実装
    • ModelControllerとModelViewの役割分担がいまいちわかりにくくて試行錯誤
    • Force.comのデータを少し調整
    • ほぼ定時ぐらいで全データが表示されるようになり、全画面がとりあえず見られるような状態に
  • 水曜日
    • iPadからのpush側を実装。謎のデータ消失や重複が出たものの、ModelControllerをすっきり整理することで解消。正常操作と異常操作のマトリクスを作って動作をチェック、細かいところを直したり、ミリセカンド単位で収集しているはずのデータが秒単位だったのでForce.comの項目を18.0から15.3に変更したり。だいたい定時で動作確認も終わり

と、こんな感じでした。年寄りだから遅いのは勘弁してくださひ。

そういえば先月会社のお金でObjective-cの講習会に出たのですが、これが大変役に立ちました。特にメモリ関係で悩んだりハマったりすることが激減して、さくさく(当社比)書けるようになった…ような気がします。c言語とはなんだかんだで20年以上の付き合いになりますが、objective-cになっても変わっていねーなー、というのが正直なところ。

ああ、それでもやっぱりnilと[NSNull null]の混同で何カ所かハマりました。とほほ。

--

余談ですが、今日はFlexBuilderの作業。SuicaってかFeliCaをIDカードとして使ってForce.comに問い合わせをしたりメールを送ったり、という実装をしていました。

あー肩凝った、ってか疲れた。「あれ、ActionScriptって配列の要素の数はcountだっけlengthだっけ?」と悩んだりしているせいだとおもうんですけどねorz 明日はiPadアプリのアイコンなどを作ってお化粧する予定です。

まぁ何だかんだで、なかなか楽しい日々を送っております。はい。

2012年8月16日木曜日

SplitViewControllerで右へのSwipeが効かない

iPad用のデモアプリをMaster-Detailテンプレートから作っていて、Swipe Gesture Recognizerを貼った。実機で試すと右へのSwipeが認識されない。

1時間ぐらいバインド先や順番を変えてみるなど試行錯誤するものの結果は変わらない。

試しにSingle Viewで試すとうまく認識される。

ググったら、Stack Overflowで同じ現象に悩んでいる人が見つかった。

結論:iOS 5.1のバグでした。

デモアプリはSplitViewControllerを使わない方向で作ることにした。単純なView上にTableとViewを並べるという原始的解決法。UITableViewControllerが使えないと何かとめんどくさいけど、そこは根性でカバーしますよ。とほほ。

2012年5月6日日曜日

Native iOSアプリをChatterの「いいね!」に対応

■FourChatter絶賛改良中■

Chatter上の文言をサクっと検索する倉橋屋謹製アプリFourChatterを改良してます。今更ですが。主な改良のポイントは以下の2点:
  1. iPad対応
  2. 「いいね!」の実装
iPad対応は、同じGUIそのままならそんなに苦労はないけれど、このFourChatterは「iPhoneの向きを変えるだけでキーワードを切り替えて検索できる」ってのがウリです(電車の中ではちょっと恥ずかしいけどね)。が。iPadで向きを変えるのは結構ウザい。というよりも、五十肩の私にはしんどい。というわけで、Segmented Controlを導入しました。

…iPhone版もこれでいいんじゃね? Segmented Controlなら4つに限らなくても良いんじゃない??という声もありますが。


■「いいね!」の実装■

Chatterの「いいね!」はFeedLikeというオブジェクトを使ってます。NewsFeedまたはFeedCommentへのto one relationshipになっていて

  • CreatedByID - 「いいね!」をクリックしたユーザのID
  • FeedItemID - 「いいね!」の対象となるNews Feed ID
  • FeedEntityID - 「いいね!」の対象となるFeedまたはCommentのID
  • InsertedById - このオブジェクトを作ったユーザのID
もともとFeedEntityIDはなかったと思うけど、最近FeedCommentへの「いいね!」がサポートされたことにともなって追加された、ような気がします。


■まず「いいね!」はこんな感じ■

SFRestRequest *requestInsert;

NSString *fId = [feed objectForKey:@"Id"];

NSDictionary* dic = [NSDictionary 
    dictionaryWithObjectsAndKeys:fId, @"FeedItemId", nil];

requestInsert = [[SFRestAPI sharedInstance] 
    requestForCreateWithObjectType:@"FeedLike" fields:dic];
[[SFRestAPI sharedInstance] send:requestInsert delegate:self];

これでOK。実行結果は例によって以下が呼び出されます。

- (void)request:(SFRestRequest *)request didLoadResponse:(id)jsonResponse ;
- (void)request:(SFRestRequest*)request didFailLoadWithError:(NSError*)error ;
- (void)requestDidCancelLoad:(SFRestRequest *)request ;
- (void)requestDidTimeout:(SFRestRequest *)request ;

要するに「いいね!」をしたいfeedのidを"FeedItemId"にセットしたNSDictionaryを用意して、それをFeedLikeとしてinsertするだけです。


■いいね!を取り消すには■

上記で作ったFeedLikeを削除します。最初、SELECTで該当するFeedItemIDとCreatedByIDを持つFeedLikeを検索しようとしたのですが、FeedLikeは直接fetchできないというエラーが出ました。ので、NewsFeedをfetchする時に、一緒にFeedLikesもfetchしておきます。

NSString *strQuery = [NSString stringWithFormat:
     @"SELECT Id, (SELECT Id, CreatedById From FeedLikes) 
       From NewsFeed Where Id = '%@' Limit 1", fId];

で、FeedLikesの中から自分のUser IDと同じCreatedByIdを持つFeedLikeを探し出して消します。

fId = (NSString *)[feedLike objectForKey:@"Id"];
requestDeleteLike = [[SFRestAPI sharedInstance] 
    requestForDeleteWithObjectType:@"FeedLike" objectId:fId];
[[SFRestAPI sharedInstance] send:requestDeleteLike delegate:self];

とても簡単。なお、自分以外のユーザの「いいね!」を消せるかどうかは試してません。

2012年3月28日水曜日

iPhone対応Force.comアプリをiPadでも


■iPhoneアプリをiPad対応に■

Force.com iOS SDKのnativeテンプレートは、iPhone / iPad両方に対応しています。

ただ、iPad版はMaster / Detailが前提。しかし私の作ったFourChatterはChatterがソースなもんで必ずしもきっちりMaster / Detailがあるわけではなくテンプレートのままの形態では動かすことができません。というわけで、当初はdisabledしてました。

しかしそのままというのも何だし、このところまったく開発が止まってしまっているのも何なので久しぶりに手をいれてiPad対応にしてみることにしました。


■経緯■

新しくiPad用のStoryboardを作り、プロジェクトに登録。 iPhone用のStoryboardを別ウィンドウで開いておいて、見比べながらviewをぽちぽち置いていく地味な作業を約30分。とりあえず、iPad上でもRoot Viewが動くようになりました。

で、StoryboardにCommentViewを追加したら…見事にハマりました。

…ってか、このブログハマってばっかりだよなorz


■症状■

症状としては、RootViewだけでは動いていたのにCommentViewをStoryboardに追加しただけでRootViewすら出てこなくなりました。SIGABRTです。そこから約2時間、Assembler上をシングルステップで追いかけてみましたが、どーにも見つかりません。念のためiPhoneで試してみると、動きます。 まぁこの場合、動かなかったら泣きますけどね。


■解決■

最終的な原因は、テンプレートのAppDelegate.mにありました。ここで「iPadだったらsplitViewをどうたら」という処理をしています。そうです、そんなものはとっくの昔に消しちまいました。ということで、この辺をコメントアウトして無事動くようになりました。

で…リリースしようと思ったんですが…FourChatterのウリは「iPhoneの向きを変えるだけでさくっとキーワードを切り替えてChatterを検索できる」っていうところにあります。しかし、iPadをぶんぶん回すとバカみたいという問題があります。私のiPad(初代)は回転ロックしちゃってるしね…。

というわけで、やっぱりiPhoneにはiPhone、iPadにはiPadに向いたGUIがあるよなぁ…というのが結論です。

さて、どうしましょう。タブで切り替えるか、任意の個数のキーワードを登録してタップで切り替えられるようにするか…。ただ任意の個数ってことになると「Four」Chatterっていうアプリ名が意味不明になるわな(4方向のfourです)。

--

でも今四十肩が痛くて新しいGUIのあるべき姿、みたいなことが考えられない。

…これを「四十肩ぐらいでw 言い訳にも程があるww」と思ったヒトは、本当の四十肩の怖さを知らないのだよ。寝返り打つたびに目が覚めるし、何かにつまずいてうっかり手を撞こうものならその場にしゃがみ込むほど痛いし。消炎鎮痛剤効かないし。今も何もしてないのに痛いし。

……以下、記事本体よりも長くなりそうなので省略。とにかく痛いのだ。

この記事を、とび職なのに四十肩でも仕事を休まなかった亡父に捧げます。

四十肩には効かないけど便利なので愛用

2011年10月8日土曜日

iOSアプリ開発ツール


■趣味プログラミング■

長らく自営業で土日も趣味だか仕事だかわからないような状態でMacに向かっていたのですが、せっかくサラリーマンになって土日はしっかり休めるのだからと30年ぶりぐらいに趣味のプログラムを再開しております。

で、iOSアプリなんかをじわじわ書いています。昔はiPhoneアプリといえばXcodeでobjective-cで書くしかありませんでした。しかし、私はどうもこのobjective-cというヤツが苦手でした。メモリ管理みたいな足回りの処理を書きたくねぇ、ってかいうか頭悪いから書けないorz

そんなこんなで、もっとラクのできるツールはないか探してみました。

条件としては:
  • ラク
  • メモリリークで苦しむのはいや
  • できればAndroid / iOSクロスプラットフォーム
  • できればAppStoreで公開したい
  • Force.com/Database.comを比較的楽に使える
  • WYSIWYGなGUI build toolがある
てな感じで。


■Flash Builder 4.5■

ラクと言えば一番ラク。通常のFlashより使えるGUI部品が少なかったりメモリ消費大きいけど「とりあえず15分でforce.comから取ってきたデータを表示するアプリ書け」って言われても不可能ではない。

ただ、やっぱり重い。なるべくラクをして生きていきたい私としては、ごく初歩的なアプリですら重くなってしまう環境はカンベンしていただきたい。


■混迷■

この辺から何故か「どうせならAndroidとiPhoneクロスプラットフォーム」を目指すようになりまして。


■PhoneGapとTitanium Mobile■

TitaniumはHTML5+JavaScriptのWebアプリをラップしてスタンドアローンアプリにしてくれるツール、Titanium MobileはJavaScript+CSSっぽい言語でソースを書くとネイティブコードを吐いてくれるツール…っていう定義で良いのかしら。

どっちのツールもGUI Builderがない。ただし、PhoneGap+jQueryについては、Dreamweaver CS 5.5でGUIを使えるようになったし、この当時重視していたクロスプラットフォームという条件を無視すれば、PhoneGap+DashCodeという選択肢もある。

しかし、どっちも(少なくともこの時点では)例えば変数名を間違えた状態でもそのままビルドできてしまい、コンパイル系言語でおなじみの「そんな変数ねえよ」っていうエラーが出てくれない。実はPhoneGapのチュートリアル、それで半日ツブしてしまいまして…試して見たらTitaniumも同じだったので、「これは私にはムリだ」と離脱。そういうのを防ぐためにもTestってものがあるんですが、私はテストコード上でも同じ間違いをするという奇跡的なボケをかます持ち主なのでダメです。

とりあえずヒトに頼まれたアプリを1本リリースしてみたもののしんどくて見事に挫折しました。


■DashCode■

これはもちろんiOS専用のツールなんですが、HTML5+JavaScript+CSSでほとんとネイティブと見た目変わらないWebアプリを作ることができて、上記PhoneGapを使ったり、ちょっとしたラッパを使えばAppStoreで売り出すようなネイティブアプリも作れる。

DashCodeはApple製の専用開発ツールでEclipse系と違ってサクサク動くし細かいところに気が利いていて使いやすい。Eclipseの見た目も使用感も嫌いな私としてはまさに手に馴染むツール。iOSアプリを書く上でできないことはほとんどない。言語もJavaScriptなのでメモリリークの心配いらないし、何より一番得意な言語なので少なくとも言語習得の負荷がないのはありがたい。

ただ、Force.comにアクセスするためのコードは自分で書かなければいけない。私はやっぱりデータベース系アプリ屋なので、クラウド上に置いたリレーショナルデータベースをあれこれいじりたい。そうなった場合、制約はあるもののWebアプリやFlashアプリとの連携を考えるとForce.com / Database.comへのアクセスがラクにできた方が良い。

そんなわけでDashcodeのお勉強も現在は保留中です。


■で結局Xcode■

Xcodeでobjective-cでiPhoneアプリ書いてます。最初の条件は忘れてくださいははははは。

悩んでいる最中にSalesforceからiOS用SDKが正式にリリースされたことが決定打になりました。OAuthに対応しているし、queryもさくっと書けてNSArray of NSDictionary(おお懐かしい、WebObjects的に)に落ちるので、扱いもラク。タイポもちゃんとコンパイラが拾ってくれるw

何より現在のXcode 4.1ではRhapsodyやWebObjects 4の頃とは違い、操作上のへんな制約も減ってSeaser2のひがさん的な意味で「流れるように」作業ができる。繰り返しになるけど、Eclipseのどうももっさりした動作とへんな色使いとずんぐりしたGUIが好きになれない自分としてはXcodeは違和感なく操作ができて手に馴染みます。
 objective-cも付き合ってみればそんなに悪いやつじゃないしw

まぁしかし一つのFrameworkを手足のように操作できるようになるのは簡単なことではないので、テキストだらけの地味な画面を相手に遊んでます。

入門書はXcode4に対応しているやつが良いってんでとりあえず左の書籍を買ってみました。開発の流れを把握しやすい作りになっていてわかりやすいです。入門書の役割はこの「作業の流れを知る」ってことだと思ってます。ググれば何でも調べられるこのご時世、ピンポイントで知りたいAPI情報などはいくらでも探すことができますが、初心者が一番最初に越えるべき壁はツールに慣れることですからね。


■追記(2011/10/30)■

上記iOS用SDKは、Xcode 4.1 + iOS5では動きません。起動しても1回目はスプラッシュが出た後でSalesforce認証画面の後白い画面に変わりそのまま、2回目以降はスプラッシュ出た後にクラッシュします。


■追記(2011/11/06)■

Xcode 4.2にしたら動くようになりました。よかったよかった。