2011年6月19日日曜日

50万ダウンロードの無料iOSアプリでいくら稼げたか

タイトルを若干釣りっぽくしてしまいましたが...

画像に簡単に文字を入れられる無料のiOSアプリ Phonto が先日50万ダウンロードを突破しました。

2011/05/24リリースで2011/06/16に突破したので、23日間で達成ということになります。
ダウンロードして下さった方ありがとうございます。



無料とはいえ今後この規模のアプリを個人で作ることはできないでしょうから、せっかくなので諸々の数字をメモしておきたいと思います。


はじめに
  • ダウンロード数は具体的には500,663 (2011/06/16時点)。
  • Phontoは無料アプリですが、通常は広告が入っています。
  • 広告を非表示にするオプションをIn-App Purchase($0.99)で販売しています。
  • 広告はiAd対応地域ではiAd優先、iAdの広告が取得できない場合はAdMobの広告を使っています。

用語について

eCPM:
  広告1000回表示あたりの収益額

フィル・レート(Fill Rate):
   広告の表示率




In-App Purchase

広告を非表示にするオプションです。
  • 購入数: 443
  • 購入率: (443 / 500663) * 100 = 0.0884%
  • 収入: 443 * $0.7 = $310.1
強いてオプションを購入するように誘導してはいない & 広告ができるだけ邪魔にならない作りになっている、ということを考えても笑ってしまうような購入率です。

何をどう販売するかで数字は全然違ってくると思いますが、広告非表示オプションというのはユーザーにとってはお金を払っても欲しいものではないようです。

(In-App Purchaseの収入は各ストアごとのレートを考慮してないざっくりとした数字です)


iAd

iAd対応地域はまだまだ少ないとはいえ、半ば実験的に導入してみました。
iAdの広告が取得出来れば優先的にiAdの広告を表示させるようにしています。
  • 広告表示回数: 206,771
  • 平均eCPM: $2.11
  • 平均フィル・レート: 5.70 %
  • 平均クリック率: 0.36 %
  • 収入: $436.79

国別のデータが興味深かったので載せておきます。


全体的にeCPMが高く、クリック率が低いのが特徴です。
フィル・レートを見るとヨーロッパではまだまだ広告が表示されないことが多いようです。
アメリカのフィル・レートは90%を超えていますがeCPM/クリック率の低さが突出しています。そのため全体平均のeCPM/クリック率が引き下げられているようです。


AdMob
  • 広告表示回数: 1,822,678
  • 平均eCPM: $2.29
  • 平均フィル・レート: 99.65 %
  • 平均クリック率: 3.65 %
  • 収入: $4176.94
eCPMがiAdよりいいのが意外でした。

フィル・レートがほぼ100%というのはiAdにはない魅力ですね。

地域別の統計が面白かったので載せておきます。


北米のCTR(クリック率)/eCPMの低さが群を抜いています。

iAdのデータと合わせてみると、アメリカ人はおそろしく広告慣れしていて全然クリックしてくれない、という印象です。

あくまでも印象です。たぶんアプリの種類や表示の仕方などで大分数字が変わってくるのでしょう。


その他、AdMobで印象的なのは、AdMobには簡単に自社広告を載せることができる機能があって、他のiOSアプリを宣伝できたりします。
そこでCameramaticMonochromiaなどの拙作アプリを自社広告として一定割合(2%)で宣伝してみましたが、クリック率が一般の広告より高め(7%〜10%)でした。
そこから購入につながったかどうかは判断できないのですが、宣伝の一環としては使えるかと。



まとめ

というわけで

$310.01 (In-App Purchase) + $436.79 (iAd) + $4176.94 (AdMob) = $4,923.74

という結果でした。
1ダウンロード$0.01という通説にかなり近い結果ですね。


2011年6月16日木曜日

[jQuery] liveとdelegateの違いとevent.stopPropagaton()

例えばこのような構造のHTMLがあるとして

<html>
  <body>

    <ul>
      <li>...</li>
      <li>...</li>
    </ul>

  </body>
</html>
こんなイベントを追加してみます。
$(document).click(function () {
  console.log('document !!');
});

$('li').click(function () {
  console.log('li !!');
});
li要素をクリックしたとき、li要素のクリック・イベントは発生してほしいけど、documentのクリック・イベントは発生して欲しくない時はどうすればよいでしょうか

event.stopPropagaton()を使えば簡単に実現できます。
$('li').click(function (event) {
  event.stopPropagaton();
  console.log('li !!');
});


では、
clickメソッドの代わりにliveメソッドでイベントを登録する場合はどうでしょうか
$('li').live('click', function (event) {
  event.stopPropagaton();
  console.log('li !!');
});
これはドキュメントにも記載されている通り、狙い通りには機能しません
li要素のイベントとともにdocumentのイベントも発生してしまいます。



そういう時に delegateメソッド が使えます。
$('ul').delegate('li', 'click', function (event) {
  event.stopPropagaton();
  console.log('li !!');
});


liveメソッドは見かけ上指定されたセレクタにイベントがひもづいているように見えますが、デフォルトではdocument rootに登録されます。

delegateメソッドはこの登録先を独自に指定できるところがliveメソッド違います。


実は liveメソッドもcontext を利用して登録先を指定できます。
$('li', $('ul')[0]).live('click', function() {
  // Live handler called.
});
ただ、個人的にはこれはちょっと見通しが悪い書き方のような気がします。
$('ul').delegate('li', 'click', function (event) {
 
});
こっちのほうがすっきりしている印象があります。

2011年6月10日金曜日

[iOS] アプリからInstagramアプリへ画像を直接渡す方法

InstagramはAPIを公開しているのでユーザーがアップロードした写真を閲覧したり「いいね!」を付けたりすることができるのですが、写真のアップロードは認められていません。

画像を直接アップロードすることはできないのですが、自分のアプリからInstagramへ画像を渡す方法は存在します。

詳しくは公式ドキュメント (DOCUMENT INTERACTIONの部分)。


ポイントを列挙すると

  • JPEG/PNGでファイルを保存
  • 拡張子は.ig
  • Document Interaction UTI がcom.instagram.photo
  • 画像サイズは612px以上

@interface MyViewController : UIViewController
<UIDocumentInteractionControllerDelegate>
{
    UIDocumentInteractionController *interactionController;
}

@property (nonatomic, retain) UIDocumentInteractionController *interactionController;

@end

@implementation MyViewController

@synthesize interactionController;

- (void)openAppList {
    NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
    if (![[UIApplication sharedApplication] canOpenURL:instagramURL]) {
        NSLog(@"Instagramがインストールされていない");
        return;
    }

    NSString *filePath;
    filePath  = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/image.ig"]; ;
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];

    self.interactionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
    interactionController.delegate = self;
    BOOL present = [interactionController presentOpenInMenuFromRect:self.view.frame
                                                                                                              inView:self.view
                                                                                                          animated:YES];
    if (!present) {
       NSLog(@"このファイルを開けるアプリが存在しない。");
    }
}


#pragma mark -
#pragma mark UIDocumentInteractionControllerDelegate

- (void)documentInteractionController:(UIDocumentInteractionController *)controller
            willBeginSendingToApplication:(NSString *)application
{
    // アプリ送信前に呼ばれるデリゲートメソッド
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller 
               didEndSendingToApplication:(NSString *)application
{
    // アプリ送信後に呼ばれるデリゲートメソッド
}

- (void)dealloc {
    [interactionController release];

    [super dealloc];
}

@end

実は上のコードを実行すると、EvernoteやDropboxのアプリをインストールしている場合、Instagramの他にEvernoteやDropboxも送信先の候補として挙がってきます。
おそらくこれらのアプリは「どんな種類のファイルでも受け入れる」という設定をしているためでしょうが、Instagramのみを候補にあげる方法は分かりませんでした。

また、UTIについてですが、ファイルの 拡張子をigにするとUIDocumentInteractionControllerは自動でUTIをcom.instagram.photoと認識してくれるようです。


[追記 2012/05/20]
Instagramのバージョンアップに伴って色々オプションが追加されているようです。

拡張子をigにするとInstagram以外にもJPEGとPNGファイルを扱えるアプリが選択肢として選べてしまうのですが
igoとすることでInstagramのみを候補に挙げることができるようになっています。

また、UIDocumentInteractionControllerannotationプロパティの対応も追加されています。
interactionController.annotation = [NSDictionary dictionaryWithObject:@"入力済みのキャプション" forKey:@"InstagramCaption"];
こうすることでキャプションに特定の文字を入力済みにできるようになっています。(Instagramのバージョンが2.1以上)

2011年6月4日土曜日

Phonto 1.0.1 アップデートしました

アップデートのお知らせです。


アプリをリリースして1週間。世界中のApp Storeでなかなか好評で、アメリカでは無料写真カテゴリのトップ10に入りしました。
なかでも日本の皆様には特にウケがよく、なんとApp Store全体の無料アプリランキングで3位に入りました。ダウンロードしてくださった方ありがとうございます!

このアップデートではApp Storeのレビュー蘭で要望の多かったものに対応しています。


Phonto 1.0.1 の変更点:

+++ 文字の傾きを変更できるようになりました

メニューの「傾き」から利用できます。

phonto


+++ 文字の「色」選択画面のUIを変更しました。

色の選択肢を厳選した代わりにRGB値を調節してお好みの色を選べるようになりました。

phonto



+++ アプリの背景画像を変更できるようになりました。

アプリの「設定」(左下のアイコン) > 「背景画像」から変更できます。

phonto

レビュー蘭で「背景がキモい!」という声があまりにも多くて驚きました。
どうも世の中には「ドット恐怖症」というものがあって、水玉模様をみると気分が悪くなる方がいらっしゃるようです (失礼ながら初めて知りました)。
アプリをダウンロードして気分を害された方、大変失礼しました。
背景画像が変更できるようになったので引き続きお使いいただければ幸いです。

2011年6月1日水曜日

Cameramatic 1.2.4 リリースしました

アップデートのお知らせです。



+++ 新しいフィルター/フレームの追加

フィルター 4種類


Expired Film

Dirty

Infrated Red

Green D Street


フレーム 1種類


White 06


+++ 調整したフィルターを保存する際に "選択されている画像にのみ適用"できるようになりました。

これまでは写真のコントラストや明るさなどのパラメーターを調節 してそれを保存する手段として「新しいフィルターとして保存」もしくは「選択されているフィルターを上書き」する選択肢しかありませんでした。

フィルターを作成することで別の写真にも簡単に同じエフェクトを適用することができますが、ちょっとした調整などでも新しいフィルターを作成するといたずらにカスタム・フィルターの数が増えてしまうという問題がありました。

今アップデートでフィルターの各パラメーターを保存する選択肢として「選択されている画像にのみ適用」を追加しました。
これにより、いたずらにカスタム・フィルターを作成する必要がなくなりました。