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

2011年5月23日月曜日

twitterの検索結果のcreated_atをNSDateに変換する(Objective-C)

うーん、タイムラインを単純に要求した場合と検索した場合とで返ってくる「created_at」のフォーマットが違うのだ。
Web上にあるサンプルはタイムラインを要求した場合のものなので、単純に真似てもうまくいきません。

NSDateFormatter* inFormat = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[inFormat setLocale:locale];
[locale release];
[inFormat setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];

NSDate *date = [inFormat dateFromString:createAt];
[inFormat release]; 

変数「createAt」にTwitterから取得した「create_at」が入っているものと仮定しています。上のコードを実行するとdateに「create_at」が指している日付オブジェクトが格納されます。

Twitterから返ってくるcreated_atの値は「Mon, 23 May 2011 12:23:50 +0000」といった値なのだけど、Web上にあるコード例(タイムライン要求時)だと「Mon May 23 12:23:50 +0000 2011」という形式を想定しているのでそのままでは動かない。

とにかく「Mon, 23 May 2011 12:23:50 +0000」という形で返ってくるのでNSDateFormatterには「EEE, dd MMM yyyy HH:mm:ss Z」としなくてはいけない。

また、忘れてはいけないのがNSLocaleで「en_US」を指定すること(多分、en_**なら何でも良さそうだけど試してません)。
こうしないと「Mon」や「May」といった英語表記をうまく拾ってくれません。

海外のサンプルコードだとNSDateFormatterの末尾を「+0000」としているものがあるけれど、こうするとロケールを「en_US」にしているのでNSDateも米国時間で作られてしまう。なので「Z」としてやることで、日本の環境では日本時間になるよう指定します。

2011年4月12日火曜日

「_OBJC_CLASS_$_ referenced from」でリンクエラー

XCodeで複数のターゲットを1つのプロジェクトで作成しているときに「_OBJC_CLASS_$_****」というエラーメッセージでリンクに失敗することがあります。
ソースファイルやフレームワークを追加した際に特定のターゲットだけに追加されてしまうことが原因です。

XCodeの左側のペイン「グループとファイル」の「ターゲット」からビルド対象のターゲットの▲を押して広げてみましょう。ソースやリソース、フレームワークなどで含めるべきファイルが含まれていないか確認します。足りなければClassesやFrameworksから必要なファイルをドラッグ&ドロップすればOK。

こちらを参考にしました。



2011年3月23日水曜日

iPhoneアプリのditsributionビルド

はいはい、どハマりしたので久々の更新です。

iPhoneアプリを公開するには通常のデバイスインストール用のプロビジョニングとは別にdistribution用のものが必要です。
「iPhone アプリ 公開」なんて語句でググれば親切な手順がわんさか出てきますので省略。
distribution用の証明書をキーチェインに追加し、同じくプロビジョニングを追加して、ビルドをするとリンクエラーになりました。
"code sign error"と出て、証明書が一致しないなんたらかんたら。

どう見ても正しくインストール出来てるんですが。。
色々と調べまわった結果、過去の実験やらテストで証明書にiPhone用のがうじゃうじゃあるとダメになることがあるらしい。
というわけで、以下のように対処しました。

  1. XCodeのオーガナイザのProvisioning profileにある、ディストリビューション用のprofileを全部消す(developer用のは残しておいてOK)
  2. キーチェインに登録されているディストリビューション用の証明書を全部消す
    (「システム」の中に残っていることがあるので削除しましょう)
  3. iOS Provisioning portalからDistribution用のProvisioning Profileを削除する
  4. 同じくDistribution用の証明書をRevokeする
  5. キーチェインから証明書要求をつくる
  6. iOS Provisioning portalからDistribution用の証明書を5でつくった要求を指定してつくる
  7. 同じくDistribution用のProvisioning Profileをつくる
  8. 6と7をdownloadする
  9. downloadした***.cerをダブルクリック。キーチェインのログインに***.cerをドラッグしてドロップ
  10. 同じくdownloadした***.mobileprovisionをダブルクリック(XCodeのオーガナイザに追加される)
  11. XCodeでdistribution用の構成のコード署名を10で追加したProfileを指定する
  12. クリーンしてビルド
手順2でキーチェインから消せない場合がありますが、そのときは再起動すれば消せます。



2011年2月22日火曜日

NSDateのロケール

iOS4.1ではNSDateはGMT時刻を持っているようだ。

NSDate *d = [NSDate date];
NSComparisonResult result = [d compare yesterday];
上記のコードのうち前日の23:59頃にyesterdayの値を格納していて、
翌日の0:01に上記コードを実行した場合、
期待しているのはNSOrderedDescendingなのであるが、
NSOrdearedSameが返ってくる。
これは日本時刻では日付は変わっているが
NSDateが持っているGMT時刻では日付は変わっていないので
結果が同じ日付と判断されてしまう。

NSDateにロケールを設定する仕組みが調べた限りでは無さそうなので、
仕方なくNSDateComponentに変換して日付で比較することにした。
NSDateComponentは実行環境のロケールに従った日付に変換するようだ。

2011年1月18日火曜日

GHUnit

iPhoneアプリ(に限定したものでは無いけど)開発におけるテスティングフレームワークとしてGHUnitがあります。
今回はこれをセットアップしてみましょう。

参考にした記事はこちら
GHUnitの導入ーメメメモモ

更に上記ページから参照されているこちら
GHUnit Setup

最後のソースコードにimport文を追加してやれば問題なし。
とても親切に書かれているので特に追記はないです。

2010年12月26日日曜日

「base sdk missing」と「code sign error」

XCodeでiPhoneアプリを試してみようと思い、SampleのHelloworldをダウンロードしてビルドしようとすると「base sdk missing」と言われる。
環境はiOS SDK4.2。
ググって解決。

Xcodeで「base sdk missing」と表示されたときの対処方法


でも「code sign error」と出てる。
ググっても解決しないので試行錯誤。

1) 左側ペインの「グループとファイル」から「Resources」の下にある「Info.plist」を選択
2) コンテントペインにアプリケーションの情報が表示されるので「Bundle creator OS Type code」の表示を確認する
3) 「???」になっていたら削除してブランクにする
4) クリーンしてからビルド

で、うまくいきました。