2011年2月15日火曜日

NSURLConnectionに渡すURLはきちんとエンコードしてから渡すこと

iOS SDKの話。ふつうにMac OS Xでもそうなのかもしれないけど。

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[req setHTTPMethod:method]; self.URLconnection = [NSURLConnection connectionWithRequest:req delegate:self];
みたいな感じでURLを渡すと、そのURLのなかみを取ってきてくれるのがNSURLConnectionなんですが。SafariのURL表示窓がURLエンコードをしないで表示しているからって、requestwithURLのなかみに半角スペースや全角文字をそのままいれると"bad URL"と言われてエラーになります。

日本語やスペースのある文字列をURLエンコードするメソッドがビシーッと用意されているので、それをバキーッとつかうこと。

[hogehoge stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
NSUTF8以下の引数は、相手の文字コードにあわせて適宜書き換える。さいきんはUTF-8が多いよね。

2011年2月12日土曜日

MPMusicPlayerControllerをつかってiPod.appごっこ

俺様用メモ

iOS SDKでは、iPod.appみたいな音楽プレイヤや動画の再生とかなんとかはまるっとフレームワークにまとまっています。MediaPlayer.frameworkがそれ。とりあえずここでは音楽プレイヤとしての話を。

使い方

ヘッダにMPMusicPlayerController *musicPlayer;などとインスタンスをつくる文をかいておき、viewDidLoadなどのタイミングで、

[self setMusicPlayer:[MPMusicPlayerController iPodMusicPlayer]];
としておけば、musicPlayerがiPodのライブラリなどとのやりとりをやってくれます。お手軽。

再生と停止

IBActionで受け取った先に、

[musicPlayer play]
[musicPlayer pause]
[musicPlayer stop]
とするだけ。なんて簡単なのでしょう。

いま再生している曲の情報を取り出す

[musicPlayer nowPlayingItem]
でいま再生している曲をつかまえるので、そこから次のようにして欲しい情報を取り出します。
[[musicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyTitle];
この例は曲名を取り出す場合。MPMediaItemProperty〜の部分を変えると取り出せるものが変わります。詳しくはデベロッパドキュメントを参照ください。アートワークもとれるよ。

再生している曲がかわったら、曲名表示も書き換えたい

コードのなかで"書き換えろ!"と書かない限り、UILabelなんかに映している曲名は曲がかわってもずっと同じままです。曲がかわったことにアプリが気づく→曲の情報を取り直す という手順で、自動的に書き換えることができるようになります。

じゃあどうやって曲が変わったことに気がつけばいいのか。そこでNSNotificationクラスの力を借ります。このクラス自体の詳しい仕組みは他のサイトにまかせますので、ここではどんな流れになっているのかを書いておきます。

  1. NSNotificationCenterに、曲がかわったときに動かしてほしいメソッドと、プレイヤのインスタンスを登録する。
  2. プレイヤのインスタンスに、曲が替わったらNSNotificationCenterに知らせるよう伝える。
  3. 曲が替わったらNSNotificationCenterにプレイヤから連絡が出て、メソッドを実行する。
といった流れ。これをコードに直すとこうなります。

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self 
                    selector:@selector(updatePlayingMusicInfo:) 
                    name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
                    object:musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
まずNSNotificationCenterをつくっておくところから。そのCenterにselectorとしてメソッド名を、nameにメソッドを実行するタイミングを、objectにプレイヤをそれぞれ登録する。Centerに伝えるよう仕向けるのはそのあとのbeginGeneratingPlaybackNotificationsで。これで曲の切り替わりと同時に情報を書き換えてくれるようになります。

nameに指定するフラグも、デベロッパドキュメントにはもっといろんなタイミングでできるとあります。そちらを参照ください。

2011年2月9日水曜日

スキーちゅうにGPSロガーを動かすと楽しい / KMLの共有

週末は苗場までスキーにいっていました。自宅からスキー場までの移動を記録しようと思ってHoluxのGPSロガーM-241を買っていたんですけど、スキー中にもログをとったらおもしろいんじゃないかと。
M-241

Holux M-241。きいろいほうね。手前はKO-D無差別級王座のベルト。

このM-241、けっこう精度がいいので、スキー中でもばっちり位置を記録してくれました。そのようすがこれ。

スクリーンショット(2011-02-09 19.06.44)

青い線が滑った経路。Google Earth上の苗場スキー場は雪がないんだね。まっすぐな線はリフト・ゴンドラで、くねくねがスキーとなってます。けっこう上のほうまでがんばったんだなー。

で、このKMLをGoogleマップのマイマップに載せるとこうなります。


より大きな地図で なえばスキー を表示

経路全部がみえない…。

大きい地図で表示をクリックしてもらうとわかりますが、ログがいくつかに分割されちゃってるんですね。マイマップの仕様みたいで、一度に表示できる点の数には限りがあるようです。

GPSロガーで記録した位置情報や経路なんかを、うまくシェアできる方法はないものかなーと考えています。ダウンロードしてもらってGoogle Earthで見てもらえばいいんですけど、それってすごいめんどうじゃないですか。リンクをクリックして、ブラウザのなかでさらっと表示できるのがいいと思うんですけどね。

2011年2月3日木曜日

2月2日 水曜カレープロレス(仮)

お仕事のあとに、かわいいWiLL Viをすっとばして名古屋は鶴舞のスポルティーバアリーナへ行ってまいりました。ほぼ毎週水曜は"水曜カレープロレス"と銘打って興行をやっているのです。愛知に引っ越してからもうすぐ1年なのですが(早いな)、初めての観戦です。

カレーライスが入場料がわりなのね。1ドリンク制ではなく1カレーライス制。カツは別料金だけどね。

このカレーライスがうまいのだ。ごはんがちょっとかためなのがすごくいい。あまりやわらかくないごはんだと、ごはんがカレーを吸いぎみになってしあわせなひとときになりますよね。カレーのほうはちょっと懐かしい味がします。東京都内に出没する屋台のカレー屋さんに"俺の昭和カレー"というのがあるんですけど、あの味に近い感じがしました。

福神漬はお酢が強め。いいっすねー。福神漬のついたカレーは久しぶりに食べた気がする。豚カツ以外にも鶏や烏賊のから揚げもトッピングにできるので、また食べに行こうと思います。

プロレスの話をしていなかった。20時開始で2試合。Ustreamでも中継があるので、遠方のかたもパソコンから是非。