2012年6月29日金曜日

Google+ History API

 GoogleIOでのGoogle+ History APIのセッション Advanced Google+ History APIを朝から見ていました。

HistoryAPIというのは、音楽を聞いた、動画を見た、購入した という行動のActivityを保存して、後から見ることが出来るもの。

APIドキュメントも公開されています。Google+ History API

今はDeveloperPreviewなので、みるためには、Google+ History APIにあるように、Sign upして、API Consoleで "Google+ History API" を ONにします。
そうすと、G+の画面でHistoryが選べるようになります。


プロフィールにもでてくる。

Activityの登録をするのは、基本はサードパーティ製アプリ。
デモではlast.fmをやっていたので、last.fmは提供してくれるかもしれないですね。
Sourceをみるとこんな感じになっていて、YouTubeの動画をみたらActivityとして登録されていました。

HistoryAPIでは、ActivityではなくMoments というみたい。 Momentsではいくつかの種類があります。

  • AddActivity
  • BuyActivity
  • CheckInActivity
  • CommentActivity
  • CreateActivity
  • ListenActivity
  • ReserveActivity
  • ReviewActivity
  • ViewActivity - video
  • ViewActivity - movie
  • ViewActivity - TV episode

種類によって、登録出来る属性が変わります。
音楽のMomentsだったら、名前、画像、アルバム名やURL、アーチスト名 とか。
チェックインのMomentsだったら、名前、住所、緯度経度、MAPのURLとか。
新しいタイプのリクエストも受け付けてくれるみたい。

amazonの場合、amazonでの購入履歴や表示ページから "おすすめ" を出してくれますが、 Google Historyを使えば、amazonの枠を超えて...楽天とか?... さらなる "おすすめ" を出せるのかもしれません。

APIをみると、タイムトラッカー的につかえるか? と一瞬おもいましたが、 そういうMomentsがない というのもありますが... 上手く使えずに消されていくAPIかもしれない という疑問が出てくる。
これが流行るためにはサードパーティが上手く作ったアプリを提供して、ユーザも便利!って思えるようならないと行けないと思うから...

だが、PCからもmobileからも登録ができるようなアプリ を作りたい場合で、提供されているMomentsにぴったりくるのであれば、このAPIを使えばサーバーを自前で用意しなくてもアプリが作れるという魅力はある。
どこまで気合入れているAPIなんだろうーなー。今後の動向が気になる所。

• • •

2012年6月28日木曜日

実機テスト時にinvalidProductIdentifiersが発生

iPhoneのアプリ内課金の所で、SKProductsRequest を取得しようとすると、Product情報が上手く取得できず、 invalidProductIdentifiers になってしまう。
シュミレータではinvalidにならないのに、実機からテストした時のみinvalidになる状態。

結局何がダメだったのか? ですが、
実機に送っていた時のプロビジョニングファイルが、*(アスタリスク) のものだったからでした。(なんでもOKのやつ)

実機上のアプリを削除してから、Bundle Identifierと同じProvisioningFileを選択し再度起動したら正常に取得できた。
ちなみに、よく、"バイナリをアップして自分でリジェクトする"という記事があるが、これはしなくても大丈夫です。
(昔はそうだったのかなー。)

同じ場面になる人はあまりいないかもしれないけどー、一応共有デシタ。

2012/08/02 追記 プロビジョニングファイルは関係なくて、アプリを一度削除して入れ直すだけでいけてたような気がする...
• • •

2012年6月20日水曜日

賞味期限メモ FreshPantry リリースしました

最近家にいることが多いので、食材を備蓄する機会が増えた @aqubi です。
そうだ!賞味期限アプリで管理しよう! と思い探していたのですが、これが、なかなか気に入るのがない!!

理由はいくつかあれど、一番は...
画面デザインが嫌!

もっとかわいい感じで、入力とか見るのとかが楽しくなるようなアプリが欲しい。
楽しくなくちゃ絶対続かない。少なくとも私は(笑)

ということで作り始めたのが 賞味期限メモ Fresh Pantry

見てて楽しい画面ってどんなんだろーなー
→ 写真だな! 写真が並んでいたら嬉しい!

写真があるなら....
→ カテゴリとか、食材の名前とか入れなくても分かるじゃん! 消しちゃえ!

と、ザクザクと入力項目を減らし、シンプルを目指して画面を作成していきました。

悩んだ所は....
まず、「写真選択」のところ。
普通は、カメラ or フォトライブラリー から選ばせるパターンが多いと思うので、当初はそう作っていたのだけど、アプリの特性上、既に写真を撮っていてフォトライブラリーから選ぶ事ってすくないよなー。
ってことで、カメラのみに断捨離。これで、入力時のタップ回数が1つ削減w

もう一つは、「削除」の所。
ちゃんと使い切った時には、使いきったぜ! という気持ちが欲しかったので、削除ボタンではなくて、
| 使いきった! | 捨てちゃった... |
という2つのボタンを作ろうか と。
そういう選択したら、その結果もみたいよねーってことで、使いきった割合 とか出すかなー とか。
最終的には、DELETE ボタンだけにしました。
気持ちよさも大事なんだけど、無駄な選択肢は無いほうがよいよな。つーことで。

結果、
1. + ボタン(追加ボタン) をタップ
2. カメラでシャッター をタップ
3. カメラで 「使用」をタップ
3. 期限日をドラムで選択
4. 「保存」をタップ
だけのミニマム操作なアプリとなりました。

こんな感じで、面倒くさがり屋の私が作ったアプリ。
ぜひ、使ってみてください!
ちなみに、他人の登録内容をみるのも楽しい。冷蔵庫を見ているようで。
他人の冷蔵庫ってちょっとした秘密っぽくて、みると楽しいですよね? 私だけ?w

P.S.
使ってくれる人が多そうであれば、データを転送出来る機能をつけたい...

賞味期限メモ Fresh Pantry
価格 : 85円
カテゴリ : ライフスタイル
対応機種 : iPhone
対応OS : iOS4.3以上
サポートページ : http://freshpantry.places-inc.com/jp/
リリース日 : ver1.0 2012/06/19


• • •

2012年6月4日月曜日

iOSで角丸画像の作り方

画像を角丸にして表示したい 時。
いくつか方法があります。

a. 角丸の画像を描画して抜き出す

How to make an image with rounded corners
のようにゴリッと書いて画像を作ってしまうパターン。

Resize a UIImage the right wayにすぐに使えるコードも置いてある。素敵。

b. マスク画像で抜き出す

画像処理に使えるUIImageのTips10個 - (9) マスク処理で角丸画像を作成する
私はまだやったことないのですが、角丸のように単純でない抜き出しは楽そうー。

c. CALayerの cornerRadiusで指定する

#import <QuartzCore/QuartzCore.h>

@implementation FERoundView

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.layer.cornerRadius = 4.0f;
    }
    return self;
}
@end

こんな感じで、CALayerのcornerRadiusで指定するのはとっても簡単。
1つこんな感じのViewをつくっておけば、角丸にしたいラベルの背景がある時に InterfaceBuilderのクラスに作ったクラスを指定するだけで完了します。

調子に乗って、角丸画像が一覧になっている画面にCALayer#cornerRadiusで指定したものを並べてみたのですが、 これが遅い! スクロールするとガクガク...
そんなに重い処理だったんですね、コレ。

このLayerの機能をつかって a.のような角丸画像作成メソッドとして使っちゃう手もあります。
シンプルなコードでかけるのが魅力的。

- (UIImage *)makeCornerRoundImage:(UIImage *) image {
    CALayer *imageLayer = [CALayer layer];
    imageLayer.frame = CGRectMake(0, 0, 200, 200);
    imageLayer.contents = (id) image.CGImage;
    imageLayer.masksToBounds = YES;
    imageLayer.cornerRadius = 4.0f;
    
    UIGraphicsBeginImageContext(imageLayer.frame.size);
    [imageLayer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return roundedImage;
}



当たり前のお話なんですが、画像を一度にたくさん表示するのであれば、
・最適の画像サイズ&角丸などの処理済み の画像を用意しておく
・表示はUIImageViewでなくてdrawRectで書いてメモリ節約
ってのはとても効果が大きいもんですなぁ

テスト的にアプリ作っていると、ついつい手抜きでInterfaceBuilderで画面イメージ想像しながらUI部品貼り付けて、画像も既にある画像を拡大/縮小してとりあえず表示しちゃう。
ま、それはそれでいいですよねぇー。あとで、ちゃんと書きなおすのであればw

UIImagePickerでカメラを起動して写真撮ると、結構メモリを消費する上に、
その際に メモリ警告がでると それまでに作成していたViewが削除されてしまう状態になり...
viewが削除された画面に戻ると、UIViewControllerのloadViewからまたふただびCallされる事になり...
"わはーっ ちゃんと真面目にやろう..."
と、ワタワタした土曜日を過ごした(笑

• • •