2011年12月20日火曜日

CoCafeの作り方(Googleプレイス編)

先日のエントリで、マップのUIについて書いた、CoCafeの作り方。
今回はGoogleプレイス編です。

CoCafeでは、位置情報から近くのカフェ情報を取得して表示しています。
カフェの情報は、Google Places APIを使って取得しています。

Google Places API は、1,000 リクエスト/日 の利用制限がありますが、
クレジットカードの登録により個人情報の登録をすれば、 100,000 リクエスト/日 を利用できます。
(クレジットカードの登録はするけど、請求は0円)
あと、行う必要があるのが powered by Google のロゴの表示 。
マップ上に表示するには、Googleマップの上で行わないといけない ようです。

お店の検索条件として以下のものが使える。
location (required):緯度・経度
radius (required):検索の範囲(m)
keyword (optional) :キーワード
name (optional):お店の名前
types (optional) :ここにあるタイプ。 | 区切りで複数指定可能。

なんとなくいけそうだな ってことで使用し始めたのですが......一回浮気しようとしたタイミングがありました。
理由は ... お店の情報が綺麗にカテゴリ分けされていない ため。

Googleプレイスでは、いろんなタイプでタグ付けされているのですが、cafe のタイプで検索しても、近くのスタバとかベローチェのお店が表示されない...
そのお店は登録されているのですが、設定されているタイプをみると establishment のタイプのみ。
いっぱいタイプがありすぎるのもどーかなーとも思うのですが、establishment だけってのも..なぁ...
とはいえ、establishment を入れるとほとんどの建物がひっかかちゃって、実用的にならない。

じゃぁ、カフェ とか スターバックス、ベローチェ、ルノアール... って有名どころの名前を一気にnameで条件指定して検索かけたらどうだろう?と試したのですが....
最初の方に指定されたキーワードのものが優先されてしまい、後のほうに指定したものは、引っかからなくなる。
Google検索と同じ感じで、はじめに指定されたキーワードの方が重要だ と認識される感じ。

1回の検索で返ってくるお店の数の上限が決まっていて、rate(評価)の高いお店から多分優先的に返すようなんですが、指定している範囲を超えて情報が返ってくるので、より 引っかからない度合いが顕著に...。

これを解決するには、取得したいお店名 ごとに1回のリクエストを投げて情報を取得するしかないのか... と一時期実装していたのですが、10数回一気にリクエストを投げることになり、API制限も気になってしまう結果になり断念。

そこで、食べログAPI はどうだろう? と問い合わせしてみました。
有料アプリになるかどうかはまだ判断しきれていないタイミングだったので、
> 個人で作成しているアプリだけど、200円程度の有料アプリになる可能性もあるがあるが、つかえるか?
という内容の問い合わせをしたところ
> 商用利用はお控え下さい
の返答が。
サイトをみると "法人の方は別途お手続きが必要" とあるのですが...返答メールの内容には、別途お手続きをしてください... 云々的な文言は一切なかったので個人だと対応もできないのかな。残念。

ぐるなびAPIはどうだろう? と見てみたのですが、
XMLのレスポンス...か...
でも!いい情報がとれるなら...と見てみたのですが、カフェ情報となるとやっぱり少なかった。
居酒屋とか食事メインの情報サイトですものねー。そうだよなー。 と断念。

# 結局、お店の登録内容や数が一番いいのは foursquare なんじゃないかとも思ったりもしますね...
# 試してないのですが、cafe ってカテゴリだけで近くを検索とかできるのかしら...
# OAuthで認証していないアカウントの場合の制限はどれくらいになるのかしら...

...で、Googleプレイス に戻って来ましたw

CoCafeでは、name(お店の名前)での検索をできるようにしているのですが、
お店の一部分を指定しても引っかからなかったり、英語表記のお店が引っかからない...と思ったら、カタカナにしたら引っかかったり...とちょっとイマイチ感。
Googleプレイスにお店の登録はあるのに、探しきれないという場面が多々あります。

Google Places API を改めてみると、Place Reportというのがある。
Places that have been added by your application can also be deleted, until they have been moderated. Once moderated and added into the full Place Search results, a Place can no longer be deleted. Places that are not accepted by the moderation process will continue to be visible to the application that submitted them.
と。
ちょうど近くにオープンした サンマルクカフェ が登録されていなかったようなので、登録してみた。
...が、自分だけが見れる登録情報の状態?で GoogleプレイスのURLも発行されない。
暫く日をマタイだ後.... Googleプレイスにサンマルクカフェが正式に入ってきた! ....が、自分が登録したサンマルクカフェも表示されて2重表示状態に!!! むぎゅー。自分が登録した方は自分で削除しましたよ otz

CoCafeとしては、Googleプレイスのデータベースをよりよいものにする情報を提供したい所ではありますが、今の状態だと、為す術がないですね...無念。

Googleプレイスの愚痴が多くなってしまっていますが...
お店がオープンした/閉店した というのも (タイムラグはありますが)反映されるし、
GoogleプレイスのWEBURLをみると、写真情報や評価/口コミも見れるし。
Googleマップで検索したお店の情報はGoogleプレイスの情報だと思うので、お店側も最新情報を載せよう!と思ってくれるだろうし。インフラとしてはとても最高。

正確な情報を、早いタイミングで更新するのはとっても無理だとは思うので、使用ユーザの手をうまーーく借りることができると良いんですけどもねー。
foursquareのお店情報って充実してるなー って思うのは、使用ユーザの手を借りているからなんだろうと思うので。

そうすると、2重登録は発生するし、
ユーザがお店を見つけられずに "閉店" としてしまって、訴えられることもあるでしょうが...
Googleさんなら出来るよ。がんばって!
• • •

2011年12月17日土曜日

CoCafeの作り方

先日リリースしたCoCafeですが、苦労したこと? を参考までにまとめてみようかと思います。

マップでのピン表示

CoCafeではMapを MKMapView を使って表示しています。
特徴的な所は、Mapに表示するピン。
ピンはデフォルトで3種類ぐらいの色を指定出来るピンが用意されているのですが、CoCafeでは有名所のカフェは色がそれなりに合うアイコンを用意してピンとして使用しています。

ピンは MKAnnotationView を拡張して自作しています。
MKAnnotationViewのimageプロパテイで、UIImageを設定するとピンの画像を変えることができます。

マップ上のピンは、端末の向きが変わると、画像の中心を回転の中心として画像の向きが変わります。
そのため、画像は、ピンの先が中心になるように画像を用意します。

アイコンは画像で用意します。画像はRitenaディスプレイ用に2倍の大きさで用意。

ピンをクリックした時に表示する 吹き出し部分 も自作したかったのですが、
簡単に変える方法は見つからず、ゴリゴリ書かないといけないっぽい感じ。
途中まで書いていたのですが、そこまで手間をかけることでもないよなーーー..ということで、CoCafeでは左側にアイコン載せるだけのカスタマイズをしました。


左側のアイコンは、MKMapView の leftCalloutAccessoryView プロパティで 自作のUIViewを設定
右側のボタンは MKMapview の rightCalloutAccessoryView プロパテイで UIButtonTypeDetailDisclosure のボタンを設定
しています。

UIViewで指定位置に配置できるので、全然無理がないカスタマイズw
ゴリゴリ系を諦めた理由の1つにMapViewがバージョンアップとともにインターフェースが変わる予感がした.. というのもあります。(勝手な想像です)

現在位置に移動

iPhone標準アプリのマップにある、現在位置を表示←→コンパス機能っていいですよね。
方向音痴の私としてはとても大切な機能。これがiOS5で使えるようになっていたので早速つかってみました。


作成方法は
MKMapView *mapView;
MKUserTrackingBarButtonItem *trakingItem = [[MKUserTrackingBarButtonItem alloc] initWithMapView:mapView] ;
とボタン作成時にMapViewを紐付けるだけ。
とっても簡単。

...だけど、画面を切り替えた時に、コンパスモード→現在位置を表示 に戻したいのに戻す方法が分からない。
これ、結局方法分からず。ご存知の方いらっしゃったら教えて下さい...

ペロっと途中までめくれるページ

iPhone標準アプリのマップにある、マップの種類(航空写真とか)を切り替えるページ。
ぺろっとちょっとめくれて良い感じですよね。
これをCoCafeにも!と思って入れています。CoCafeでは表示するカテゴリの切り替えができるようになっています。

このエフェクトは pageCurl というものになるのですが、途中で止める方法がはじめ分からず。
途中で止めないならば、
[UIView setAnimationTransition: UIViewAnimationTransitionCurlDown forView:self cache:YES];
とかが使えるっぽいけど...

CATransition *transition = [CATransition animation];
    [transition setType:@"pageCurl"];
    transition.duration = 0.35;
    transition.endProgress = 0.8;
    transition.removedOnCompletion = NO;
    transition.fillMode = kCAFillModeForwards;
    [self.view.layer addAnimation:transition forKey:@"curlup"];
でできるのは分かったのですが、リジェクトされるかもよ? という記事もあり。
たしかに、typeで指定できる定数として
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
があるっぽいけど、pageCurl がない。たしかに使っちゃダメそうな...
解決できず。このままリリースしちゃった。とおちゃった。ごめんなさい...ごめんなさい...><

なんか、UIばっかりの話になっちゃった。
次回はGoogleプレイスAPIについてちょっと書こうかな。
でわでわ。
• • •

2011年12月10日土曜日

CoCafe リリースしました!



CoCafeが正式リリースしました!
サイト http://cocafe.sorausagi.org/
AppStore http://itunes.apple.com/jp/app/cocafe/id483713206

CoCafeは、カフェの電源/WiFi/分煙などの情報をみんなで共有するiPhoneアプリです。
地図上にはGoogleプレイスのお店情報が表示されるので、大手チェーン以外のCafeでも表示されます。
お気に入りのカフェをぜひ見つけてくださいー。

ひとつの特徴としては、WiFiの設定がとても細かい事ですw
モバイルWiFi (WiMax, EMOBILE, Xi...) WiFi(mobilepoint, FON, Wi2...)など個別に電波強度を設定できます。
すっごく日本限定ですけども、モバイルWiFiを持ち歩く人には嬉しいはずっ

iPhoneアプリはCrossBacklogに続く第2弾目。
今年の目標の1つだったので、ギリクリア!

AppEngineのサーバー側を作ってくれた @shin1ogawa
アイコンを作ってくれた @horiuni
にも感謝!

現時点ではまだAppStoreの検索には引っかかってくれなくて残念ですが...
あと、アクセス数が伸びたらどんだけGoogleから請求がくるのかもとても心配だったりも...ww
• • •