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

2014年8月18日月曜日

@autoreleasepool { }

久しぶりのiOSネタ。

ALAssetから引っ張ってきたPNG(スクリーンショット)画像をUIImageViewに表示して、これをボタンで高速でめくっていくと「メモリ足りない」って落ちる現象に遭遇。

ゆっくりページめくりしている時は大丈夫。

【ALAssetからdefaultRepresentationを取得し、その後UIImageに変換してUIImageViewにセットする】だけの簡単な処理だけど、高速でめくるとreleaseする前に次の画像を取ってきてしまうので落ちる。落ちる前に手を止めると、メモリのグラフがガタガタと下がっていく。

一瞬、「めくる速度を制限しようか」という悪魔の声が聞こえたけど、それは最後の手段として取っておくことにした。

でも、__weak試したりnil代入しても状況は変わらない。

最終的には上記【】の処理を@autoreleasepool {}で囲って強制的に掃除したらスクリプトで超高速めくりを実行してもメモリサイズは安定したままで落ちなくなった。

いやはや。

それにしても、どうしてこういう問題は、定時で帰る5分前に発生するのでしょうか。15分ぐらいで解決できたから良いんだけど。

2013年8月25日日曜日

Force.com mobile SDK 2.0 for iOS

【重要なお知らせ】新プロジェクトはコマンドライン

前のバージョンまでは、XcodeのFile->New->New Project...でHyblid Force.com App / Native Force.com REST Appを選べばすぐにプロジェクトができていましたが、2.0ではコマンドラインから作る必要があります。簡単ですけども。

【重要なお知らせ】ARCに対応しました!

Xcode 5はARC対応のプロジェクトしか作れないですし。それにARC、慣れてしまえばそんなに悪いヤツじゃないですよw

■大まかな手順■

  • gitからcloneしてbuild
  • テンプレートをbuild
  • では、新しいプロジェクトを

参考ページは以下。
https://github.com/forcedotcom/SalesforceMobileSDK-iOS

以前より増えた分(テンプレートのbuild)
https://github.com/forcedotcom/SalesforceMobileSDK-iOS/blob/master/build.md

■gitからcloneしてbuild■

まず、適当なディレクトリに移動して、ターミナルから以下のコマンドを実行します。

git clone https://github.com/forcedotcom/SalesforceMobileSDK-iOS.git
回線速度にもよりますが、数十秒程度。終了してプロンプトが出たら、次はgitが作ったプロジェクトの中に異動してビルドします。

    cd SalesforceMobileSDK-iOS/
    ./install.sh

これは回線やマシンの速度の応じてやっぱり数十秒から数分。SSDだと妙に速くて感動です。以前はこれでXcode用のテンプレートが自動的にインストールされていたのですが。

■テンプレートをbuild■

それではテンプレートをbuildします。

    cd build/
    ant 

今度はそれほど時間かかりません。

■では、新しいプロジェクトを■

    cd artifacts/
    cd NativeAppTemplate/ または cd HyblidAppTemplate/
    ./createApp.sh

これでテンプレート生成シェルから使い方が出てきます。

Usage:
createApp.sh
   -t <Application Type> (native, hybrid_remote, hybrid_local)
   -n <Application Name>
   -c <Company Identifier> (com.myCompany.myApp)
   -g <Organization Name> (your company's/organization's name
   [-o <Output directory> (defaults to this script's directory)]
   [-a <Salesforce App Identifier>] (the Consumer Key for your app)]
   [-u <Salesforce App Callback URL] (the Callback URL for your app)]
   [-s <App Start Page> (defaults to index.html for hybrid_local, and /apex/VFStartPage for hybrid_remote)]

では、素直にプロジェクトを作ってみます。com.company / companyはあなたご自身のものを使ってください。蛇足ですが。

    ./createApp.sh -t native -n TestForceMobile20 -c com.company -g company

ほんの一瞬で以下のメッセージが出来て終了します。

Creating app in SalesforceMobileSDK-iOS/build/artifacts/NativeAppTemplate/TestForceMobile20
Successfully created native app 'TestForceMobile20'.

あとは適当なディレクトリにコピーして、.xcodeprojをダブルクリックすればXcodeが起動します。

■プロジェクトについて■

コマンドラインで生成した時に指定しなかった場合にはAppDelegate.mのRemoteAccessConsumerKeyとOAuthRedirectURIを設定します。

生成されたコードはばっちりARC対応です。__weakが邪魔っすね。まだ慣れません。AppDelegate.mは1.xよりはかなり洗練されていて、いじりやすくなりました。例によってStoryboardには対応していませんが、setupRootViewControllerでnibではなくStoryboardから生成されるようにすれば問題ないはずです。

取り急ぎ、以上。

2013年2月10日日曜日

userIdの取得

■userIdを知る■

自分がポストしたデータは表示しない、という処理を実装する場合にuserIdを知る必要があります。

古いForce.com SDKでは

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *userId = [[[app coordinator] credentials] userId];

と書くこともできましたが、今はAppDelegateからSFOAuthCredentialsのインスタンスを見ることができません。最新のSDKで同じ事をする場合には

NSString *userId = [[[[SFRestAPI sharedInstance] coordinator] credentials] userId];

と書けばOKです。

■Xcodeバージョンアップ■

Xcode 4.4で作ったプロジェクトを4.5に持って行ったらエラーの山が出来てしまいました(今更ですが)。結局プロジェクトを修正するのは諦めて、最新のForce.com mobile SDKを入れて新しくプロジェクトを作りました。リソースなどをコピー、AppDelegateなどはソースをにらめっこして必要なところだけをコピーしましたが、ViewControllerについてはそのまま上書きです。その作業中に上記のエラーに遭遇した次第。

あとは「認証中」画面のxibからstoryboardの置き換えが残っています。以前のテンプレートではSFNativeRootViewController.mのsetupAuthorizingViewControllerを書き換えればStoryboardに置き換えるのも簡単だったんですが…app delegate上でオーバーライドするのも面倒くさい。

起動時に一度呼び出されるだけで他の実行には影響のない画面なので、ここはそのままxibで済ませましたm(_ _)m

2012年11月23日金曜日

今日はムービーアプリ

■例によってハマり方面■

お友達からの依頼で、ムービー再生系のiPhoneアプリを作ってます。ムービーアプリなんてSymantec C++以来かもしれない。あまりにも久しぶりなんで、どのFrameworkが最新だかわからないレベルです。MediaPlayer.frameworkですが。

簡単なアプリですがハマったのは以下2点。まぁね…ハマる以前だけどね。

画面真っ黒になるだけで何もでない
▶MPMoviePlayerViewControllerではなくMPMoviePlayerControllerを使っていた。

参考にしたサンプル・コードにはMPMoviePlayerViewControllerって書いてあったのですが、Xcodeの入力予測を使った時に間違ったようです。MPMoviePlayerViewControllerに変えたらムービーのコントローラなどがちゃんと表示されました。でも、ムービー表示領域は真っ黒で「Loading...」が表示されたままです。

Loadingのままで先に進まないし、play直後にfinishしてしまう
▶fileURLWithPathではなくURLWithStringを使っていたorz

困ったときのStackOverFlowさんありがとう。

Storyboard + ARCで作っているけど、Objective-C 2.0をちゃんと勉強した後となっては正直ARCにあんまりメリット感じません。Javaとは言わないけど、せめてC++的にスタックで自動的にお掃除してくれるなら文句ないんですが。

このところ会社ではずっとTitanium mobileをいじってます。JavaScriptなんでメモリの後始末を考えなくて良いという点「だけ」は良いものの、やっぱりネイティブの方が楽です。APIなどが確実に動く(Titaniumはbound関係のAPIで値が返って来なかったりすることが多い)し、何よりInterfaceBuilderが使える。Titaniumだと「画面上に配置したオブジェクトを全部50dp下げる」なんてことが起こると座標をいじらないといけないので面倒くさくていけません。

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年7月3日火曜日

Painless Mobile App Development Webinar


Facebookのタイムラインに新しいWebinarが出てました。しばらくForce.com Mobile SDKをアップデートしていなかったのですが、いろいろ変わっていました。Webinarの中身を紹介します。英語力ほぼ皆無なので聞き違えていたりするところがあればご指摘ください。なお、私の主観的なコメントは黄色で表示しています。

  • Database.comに関して
    • Database.com概要
    • Apexの流し込み
    • workbenchの使い方(SOQL、REST APIのURLの作り方)
  • ここで急におっさんに声が変わって、Mobile SDKの説明に
  • まずMobileSDKの技術要素の説明(Push notification対応してたんだなぁ)
  • Native/Hybrid/HTML5の位置づけ
  • mobile SDKはOpenSourceで開発されている
  • OAuthについての説明
    • 認証不成立時のスライドになぜか日本のファミリーマートが
    • OAuthの各Flowについて
      • UserAgentfFlow/RefreshFlowの動作フロー
  • 実際にXcodeを使ってのデモ
    • SDKのインストールが結構めんどくさいのだけど、そこは省略
      • みんなそこでハマったことがあると思うんだけどなぁ
    • NativeProjectをスタート
    • ハマりやすいRemote Access設定についての説明がわりとしっかり
    • build&run→User-Agent FlowのOAuthがしっかり動作。良かった良かった。
    • ソースを読んでいく
      • やっぱりまだStoryboardには対応していないんですね。
      • view controllerについての説明など。
  • RESTについての説明。
  • 28分頃、オンラインでのSOQLクエリについての説明
  • その下にオフラインのサンプルが出ている。
    • あとで読もうと思う。
    • クエリとJSONの対比。
    • JSONでの戻りの説明。
    • JSONからtableへデータをセット。
  • SmatStoreはオフラインでの動作をサポートするメカニズム
    • SQLiteとJSONベースのdocument store。
    • device level hardware encryption対応
    • SmartStore Phonegap Pluginが用意されている
    • SQLCipherにも対応。
  • HyblidはJASONベースのみ。
    • ブラウザ組み込みSecure SQLのサポートの関係で?
  • 36分あたりからSecureなJASONベースのストレージについて
    • Newton 'Soups'な話がでてきた。懐かしい。
    • 使い方についての説明。
    • サンプルではrequest:didLoadResponseでSoupと同期をとっている。
    • Soapに対するQueryについて説明。
  • 各リソースについて紹介
    • サンプルはこれ。
    • https://github.com/tomgersic/CrumpRealEstate
  • Q&A
    • Upsertした場合の同期について質問が出ていたけど聞き取れない。


だいたいこんな内容です。Androidでの開発は出てきませんし、Hybidについても概要だけで実例のデモはありません。

すでに開発経験のある人の場合、とりあえずSmartStoreについての概要を把握するのに良いかもしれません。これからiOS+Force.comで開発しようという方は、もしハマったら私の過去ログなどでインストール方法を確認してみてくださいませ。

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年12月4日日曜日

Resizeしたい

■ごく単純なこと(そして落とし穴)■

現在開発中のiPhoneアプリはTableViewにカスタマイズしたCellを置いてそこにdatabase.comから取ってきたデータを表示するだけのごく単純なものなのです。ええごく単純。

要件としてはorientation(画面の向き)に応じてcellの幅を変える必要があるぐらい。Autoresizingを使えばほんと簡単。

あと表示するデータが可変長文字列なので、cellの高さを変える必要があります。これも単純な話で、以下のコードをview controllerに書いてやればおk

- (CGFloat)tableView:(UITableView *)tableView 
     heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCell *cell = (MyCell *)[self tableView:self.tableView
                       cellForRowAtIndexPath:indexPath];
    
    float width = cell.status.frame.size.width;
    CGSize bounds = CGSizeMake(width, self.tableView.frame.size.height);
    
    CGSize size = [cell.status.text sizeWithFont: cell.status.font 
                               constrainedToSize: bounds 
                                   lineBreakMode: cell.status.lineBreakMode];
    
    return MAX(size.height, ConstMinCellHeight);
}

なのですが…。このboundsがくせ者でした。当然、当然cell上に置いたUILabelの幅を使います。このLabelにもautoresizingを設定してますから、iPhoneを横向きにすると当然リサイズされます。しかし…boundsに入ってくるwidth、つまりUILabelのサイズは初期設定値のままでリサイズ後のwidthを返してくれません。


■毎度おなじみ試行錯誤地獄■

そこから約4時間ほど試行錯誤を繰り返しました。覚えている範囲で列挙すると:

  • とりあえずautoresizingのモードをあれこれ試す
  • 友人のアドバイスに従いboundsへのkey value notificationを使用
  • UILabelのサブクラスを作ってsetBounds/setFrame/drawRectなどをオーバーライド

で、最終的にわかったことは、「cellの中に置いたLabelの幅がわかるのは、tableViewのheightForRowAtIndexPathが呼ばれた後」ってことでした。

描画の仕組みから考えて、そんなことはないと思うのですが…現状でそれを知る方法が見つかりませんでした。とほほ。


■美しくない妥協案■

というわけで、deviceOrientationDidChangeでiPhoneの向きが変わったことを検出したら、そこで定数からラベル幅を算出する、という方法にしました…。一応、デバイスの規定値が変わってもそのまま動くようにはしてあるけど…どうも美しくないっす。

問題は、この方法は最初からわかっていたということで…「美しくないから」という理由だけで4時間試行錯誤してしまったのはどーなの?というあたり。まぁ時間単価で仕事しているわけじゃないから良いんだけど…困ったもんだ。

まぁ、あれだ、4時間の試行錯誤でいろいろ分かったこともあったから、そのうちそれらが花開く日も来るだろう、ということで…。

2011年11月6日日曜日

Xcode 4.2 + iOS 5 + Force.com mobile SDK


■今週もまたXcode三昧■

このところ休日はXcode上でobjective-c三昧です。ようやくツールに馴染んできて、昔WebObjectsで散々使っていたクラスたちにも再会し、Google先生頼みですがとりあえず「iOSアプリとはこういうもの」というのが分かってきました。まぁ、過去30年+に及ぶプログラミング経験上、この時期が一番楽しいのですけどね。

過去の経験上、何か新しいツールを始める時には、とりあえず動くものをベースにしてイジり倒し、次にテンプレートなどを使わないで同じものを作ってみる、という段階を踏むと手っ取り早く習得できるように思います。一応本も読むのですが、それは前にも書いたようにそのツールの世界観をつかむためで、習得するためには動くものを少しずつ改造していくのが良です。


■しかしまたハマる:まずXcode 4.1■

さて、とりあえずメシの種にしようと思っているForce.com / Database.com + iOS方面、一応Salesforce mobile SDKのテンプレートから作ったプロジェクトに関しては、re-authentificationやCRUDはひと通り動き、DescriptionなどFlash toolkitでハマった一連の処理も片付いたので、次の段階としてまっさらなプロジェクトを作りその上でSalesforce対応アプリを書いていく練習に移りました。

まぁ真っさらなプロジェクトとはいえ、Xcodeだとテンプレートが基本的な構成作ってくれるんですけどね。考えてみりゃGUIをプログラムで生成してたのはMS-DOS上でcでアプリ書いてた頃ぐらいのもので、そのあとのVisualbasic, VisualC++, Symantec C/C++, Xcode+WOBuilderなど、ずっとGUI Builder頼みの人生だったな(遠い目)。

で、Xcode 4.1にアップデートしたのですが…ここの追記に書きましたが、Xcode 4.1 + iOS5では、Salesforce mobile SDKから生成したプロジェクトがうまく動いてくれませんでした。世間様でもiOS5になって日本語入力できなくなったアプリが何本がありましたが、これもそれと似たような感じでOAuthの認証画面でキーボードが出てこなくてidもpasswordも入力できないという現象です。

4.0.2に戻すのも面倒だし、せっかくなのでダメ元でXcode 4.2にアップデートしました。Salesforce mobile SDKテンプレートからのプロジェクト生成でも一発で動きました。やれやれ。

そういえば上記SDKのドキュメントには「このSDK使う時には Other Linker Flags-Obj_c -all_load と設定しろ」って書いてありますが、ありましたが、これは「-ObjC -all_load」の間違いですね。ええハマりましたともさ。
#修正されていました(2011/11/13)


■次にStoryboardにハマった■

先に書いておきますがStoryboardさんが悪いわけではないです、その特性などをよく調べないままに使って、私が勝手に「動かねー」と泣いていただけです。はい。

経緯は
  1. Xcode 4.2でMaster-DetailテンプレートからStoryboard対応のアプリを生成
  2. Salesforce mobile SDKテンプレートから生成したプロジェクトから必要箇所をコピペ
  3. Table View Cellを従来のnibからカスタマイズして実装 →It just works.
  4. 次に、また新しくMaster-DetailテンプレートからStoryboard対応のアプリを生成
  5. 上記2と同じく必要箇所をコピペ
  6. Table View CellをStoryboard上のTable View Cellに対してカスタマイズ
  7. OAuthが終わり、requestSOQLが返って来て、TableViewをreloadしようとしてSIGABRT
上記1-6については2-3時間でしたが、7は金曜日の夜一晩徹夜しても解決できませんでした。

Master-Detail + Storyboardの真っさらなプロジェクトを作り、手作りのArray of Dictionaryを単純にTable View Cell上に表示するだけなら動くので、問題はmobile SDKが何かdelegateを呼び出していて、それをインプリメントしていない等の原因で落ちているのだろう、と結論付けました。

とりあえずStoryboardにあるTableView下のTableView SectionとCellを削除すれば普通にTable Viewとして動きますし、Cellをカスタマイズする際には以前と同様にnib+implement classで実装できます。Cellをカスタマイズする際にStoryboard上に直接TableViewCellを置くことができればStoryboardの画面遷移が使えて今後何かと便利だと思うのですが、できないっすね。

まぁそのうち、何かwork aroundが出てくるでしょう。

この週末ずっとXcode 4.2をいじって、プロダクツという意味では何も成果なかったんですが、上記7を調べるためにアプリの挙動をずっと追いかけたりググりまくったりしたので、とりあえず、勉強にはなった、はず。

先週は本業でずっとApex+Visualforceを書いていて、週末はXcode三昧、体重は増えたけど、久しぶりに充実した日々でした。今週は…要件聴取が多いなぁ…。

#追記:スクリーンショットが消えるなぁ…PNGじゃなくてJPEGで貼って見ました(11月8日)。
#また消えた…:コピペじゃなくてアップロードしてみた(11/08 19:00)

2011年10月22日土曜日

Salesforce Mobile SDK for iOSでハマる


■例によってハマりました

Salesforce Mobile SDKはiOS / AndroidからREST経由で簡単にSalesforceにアクセスできちゃうよ!っていう有り難いSDKです。OAuth認証も簡単で、Native, Hyblid, HTML5版に対応しています。

ここのページにあるPDFとiOS Mobile Templateは一発で動くんですよね、Xcodeのバージョンなどに間違いがなければ。で、もてる知識を総動員してChatterのFeedから特定のキーワードを引っ張ってくるアプリなんぞを作って喜んでいたものでした。で、テンプレートではできることにも限りがあるので、新規にiOSプロジェクトを作って、そこにMobile SDKを入れて作った1本目は奇跡的にか何かの冗談か、一発でうまく動きました。

しかし。 その次、わりと本格的なというか倉橋屋の社運(社じゃないが)をかけたプロジェクトを作ろうとしたところ、開発以前のところでビルドが通らなくなってしまいました。この間にiOS5へアップデート、Google Data APIsに浮気、Xcode 4.0.2から4.2にアップデートする…等いろいろと狼藉を働いたので、何が原因かわかりません。この辺がiOSシロウトの哀しいところです。

Xcodeがはき出すエラーは「missing required architecture i386 in file」が26個、同じ原因でワーニングが6個ほど出てきます。まぁこういうエラーの山は大抵1カ所つぶすだけで直るか激減するものです。今回もそうでした。

結果から申しますと、Force.com SDKからDependenciesをdrag & dropで追加した際にXcodeプロジェクトのFramework Search Pathsに勝手に余計なパスが追加されていたことが原因でした。"$(SRCROOT)"とか$(inherited)が入ってたら消します。プロジェクト>Build Settingsから「framework」で検索してSearch pathsの下のFramework Search Pathsを見てください。

いやはや…。