読者です 読者をやめる 読者になる 読者になる

「診断ビューアー」をアップデートしました

自作アプリ「診断ビューアー」をバージョン2.0.3にアップデートしました。

アップデート内容

2.0.3

  • 読み込み速度の改善
  • チャート系診断の結果が表示されない不具合の修正
  • 設定が適切に保存されない問題の修正

ダウンロード

個人でアプリ開発をして初めての収益を得てみて

Qiitaに投稿したものと内容は同じです。

個人でアプリ開発をして初めての収益を得てみて - Qiita

初めての収益

私は個人で開発しているアプリには広告としてGoogleAdsense(Admob)を利用しています。 先日、そのAdsenseの累計の収益が初めて支払い基準額である¥8,000を超えました。

f:id:andooown:20170320223805p:plain

Adsenseのヘルプによると、来月には収益が振り込まれるようです。

これまでの収支

私はUnityXamarinを利用して、iOSAndroid両対応のクロスプラットフォームアプリを開発してきました。 そのため、アプリの配布のためにそれぞれのプラットフォームのアプリストア(App StoreGoogle Play Store)の開発者登録を行っています。

Google Play Storeの開発者登録は$25(当時のレートで¥2,908でした)で永久に有効でしたが、 App Storeの開発者登録は¥11,800[税別]で1年間のみ有効**なのです。

開発者登録以外には、何本かサーバと連携するアプリを開発する際に、VPSを利用したため、VPSの利用料金が今までで¥3,000ほどかかっています。

Unityの有料アセット等は利用せずに開発を行ってきたため、支出としてはこれくらいだと思います。

それぞれの開発者登録を行ったのが2016年の3月なので、2017年3月現在の収支をまとめると以下のようになります。

内容 金額
開発者登録(App Store) -¥12,744
開発者登録(Google Play Store) -¥2,908
VPSの利用料金 -¥3,000
Adsenseの収益 ¥8,000
合計 -¥10,652

…..はい。¥10,652の赤字となりました。

しかし、この部分だけを見て「個人でのアプリ開発は儲からない」とは思わないで下さい。 私がこれだけの赤字になったのには理由があると思っています。 それを以下で書いていきます。

※なお、以下は収益のみを考えた場合の話です。 個人開発で得られる経験はお金に変えがたいものなので、 儲からないという理由だけでやめるべきではないと思います。

考察

1. リリースしたアプリの本数が少ない

私がこの1年間でリリースしたアプリの数はたったの3本でした。 これは個人開発者の中でも非常に少ないと思います。

ちなみに内訳はゲーム1本とツール的なアプリが2本で、 主な収益はツール的なアプリ1本です。今までの収益の半分以上がこの1本のアプリによるものです。

このことから思うに、個人開発者においてはとりあえず沢山のアプリを作り、 少しでも伸びそうな兆候があったアプリに時間をかけ、育てていくのがいいと思いました。

2. アップデートは収益増加のチャンス

上であげたメインの収益となっているアプリについてですが、 3月に入り大学が春休みになったため、時間をかけてUIの大幅な改善やバグ修正等のアップデートを3回行いました。 その結果、普段はひと月に¥300〜500ほどの収益のところ、3月は現時点までで普段の2倍以上の収益を得ることができました。

これについては、ストアのアプリを起動し、アップデートにアプリが表示されることでユーザーの目に触れ、起動回数が増えることが主な原因だと思われます。 一般的なアプリの広告形式であるバナー広告については、やはり起動回数(表示回数)が命となります。 緊急のバグ修正等でない限り、定期的に(ある程度期間を空けることも重要)アップデートを行うことで、収益の増加につなげることができそうです。

3. 個人レベルではVPSは不向き

これは私の場合のみかもしれませんが、個人レベルのアプリではVPSを使ってバックエンドを用意するのは不向きだと感じました。 理由は単純に利用料金が収益に釣り合わないからです。

私の場合は、アプリのコンテンツをサーバから配信するためにVPSを利用しましたが、 個人レベルであればまずアプリにコンテンツを組み込み、バックエンドを利用しないことを考えるべきです。 また、リアルタイムにコンテンツの配信を行いたい等の理由でバックエンドを用意するのであれば、 毎月無料枠のあるAWSを利用したり、その他のmBaaSを利用したりするべきです。 無料枠のない(お試し期間があるものはあります)VPSでは時間課金となってしまうため、アクセスの少ない個人のアプリでは赤字となってしまうことが多いでしょう。

実際に私の場合、1本のアプリはアプリ内にコンテンツを組み込み、もう1本のアプリはAWSやAzureのmBaasを利用する形に変更することでVPS利用をゼロにすることができました。 また、mBaaSについても、無料枠内で全部完結することができています。

個人レベルでは負荷を考えて予めリソースを用意するより、 最低限で運用して、足りなくなったところにリソースを増やすという運用の方が向いていると思います。 (個人レベルではダウンタイム0とかより改善のほうに時間をかけるべき)

最後に

宣伝の不足などまだまだ思い当たるところはありますが、とりあえずまとめると、

個人開発では

  1. たくさんのアプリを作るべし
  2. 伸びそうなものに時間をかけて、定期的にアップデートすべし
  3. 削ることができる支出はとことん削るべし
  4. 最低限で運用すべし。足りなくなってから考えるべし。

以上が簡単ではありますが、アプリの個人開発を続けてきて、 一段落した私の思うところです。

なお、これらのことは収益のみを考えた場合の話です。 私自身は実際には、お小遣いが稼げたらいいなとは思っていますが、 赤字になろうとも勉強のための個人開発なので、あまり気にしていません。 実際に個人開発をしてきた上で得た、XamarinやC#に関する経験や、Unityに触れることで得たゲーム開発の経験、 また作ったアプリを実際に配信することで得た経験は非常に大きかったです。 これからも個人開発が出来る限り、続けていこうと思います。

「診断ビューアー」をアップデートしました

自作アプリ「診断ビューアー」をバージョン2.0.2にアップデートしました。

アップデート内容

2.0.2

  • 診断の読み込みを分割して行うように変更
  • 動作速度の改善
  • 不具合の修正

ダウンロード

「診断ビューアー」をアップデートしました

自作アプリ「診断ビューアー」をバージョン2.0.0にアップデート、 その後、小さな機能追加をしたバージョン2.0.1にアップデートしました。

アップデート内容

2.0.0

  • UIの大幅な変更
  • 新着・月別・日別・総合ランキングの表示の追加
  • 140文字以上の診断結果の表示に対応
  • 画像・チャート系診断の結果表示に対応

2.0.1

  • 通報機能・フィルタリング機能の追加
  • 不具合の修正

ダウンロード

大学の学園祭アプリをXamarin.Formsで作りました

電気通信大学 調布祭実行委員会 編集局の安蒜です。

今回は11/25〜27に開催される「第66回調布祭」のアプリをXamarinで作りました。

以下色々と書いて行きます。

なぜXamarinなのか

今回のアプリ開発はとにかく時間がありませんでした。

僕自身はアプリを作る編集局員ではあるのですが、 学園祭で使う資材の管理等を行う資材局でもあり、 本業は資材局の方です。

この資材局というのが結構な激務で、 夏休みの一部しか時間を使えないことが事前にわかっていました。

そのような中で使ったことのないSwiftやJavaを使い、 ネイティブのアプリを2つのプラットフォーム分作るというのは不可能でした。

Xamarinを選んだと言うより、 この状況ではC#だけでクロスプラットフォーム開発ができるXamarinを選ぶしかなかった という方が正しいでしょう。

コンセプト

とにかく時間がないので、オープンソースコンポーネントやマネージドなサービスなどをできるだけ利用し、

車輪の再発明はしない

をコンセプトに作りました。

機能

アプリの開発を始めるときに局内で出た実装したい機能は以下の様なものがありました。

  • 模擬店や展示の紹介
  • ステージや講堂でのイベントのタイムテーブルと通知機能
  • 学内のマップ機能

また、構成としてデータはサーバで保持し、アプリを更新している時間を待たずに、 掲載情報を追加・修正できるようにしようというのも提案されました。

通常の常時公開しているアプリと異なり、 調布祭期間の3日間のみ使われるアプリであることを考えると、 必須とも言える機能です。

バックエンドについて

「第66回調布祭アプリ」のバックエンドは以下のようになっています。

f:id:andooown:20161003005619p:plain

  • サーバはConohaのVPSを利用。
    • 普段から使っているというのもあるが、お金のない委員会には月額課金ではなく時間課金であることがとてもありがたい。
  • サーバのミドルウェアとしてはdocker上にオープンソースのMBaaSであるdeploydのコンテナを立て利用。
  • サーバのプロビジョニングにはAnsibleを使用。
    • 忙しい調布祭中に問題が発生したときに、VPSを作り直してコマンド一つで同じ環境が作れるというのは便利。
  • スマートフォンへのプッシュ通知にはAWSSNSを利用。
    • プラットフォームの違いや、無効となったトークンの処理などを気にせずにプッシュ通知が実装できる。
    • 料金も100万件送って1ドルなのでありがたい。

フロントエンド(アプリ)について

タイトルの通り、アプリはXamarin.Formsを使って実装しました。

製作は1人ですが、調布祭が近くなってからのメンテナンスは他の人がやる可能性があるため、 設計・コードには読みやすさ・理解しやすさが必要でした。 全体で統一された設計にするために、MVVMライブラリのPrismを導入しました。

MVVMはデータバインディングとも相まって非常に強力ですが、 初めて触る人には少し難しいかもしれないので、 Prismを導入し、ある程度ルールに沿ったコードで実装できたのは、 僕自身を含めてメンテナンスのしやすさにつながりました。

一番大変だったのはタイムテーブルの実装です。 模擬店・展示の紹介ページなどはListViewそのままである程度行けましたが、 タイムテーブル用のViewなど用意されているわけもなく、 Gridを継承した自作コントロールを作ることで対応しました。

しかし、無理にデータバインディングを利用しようとしたせいか、 サーバとの通信の間、データがまだ無いため、何も表示されずに2,3秒経過する状態になってしまっていて、 現在、何かいい方法がないか模索中です。 (いいアイデアがあったら教えてください)

デザインに沿ったViewの配置についてはAbsoluteLayoutを使うことで デザイン担当の希望にある程度沿ったページが作れたかなといった感じです。

今後

ダウンロードしていただければわかると思いますが、 まだまだ荒削りの段階でのリリースとなりました。

というのも、これからの約2ヶ月間で実際にいろんな方々につかっていただいて、 我々では気づかないような点も含めてご指摘いただき、 アップデートを続けていけたらという気持ちでリリースをしたからです。

ご協力をお願い致します。

ダウンロード

最後に

11/25〜27の3日間、 電気通信大学の学園祭、「調布祭」が開催されます。

皆様のご来場、心からお待ちしております。

「診断ビューアー」をアップデートしました

自作アプリ「診断ビューワー」をバージョン1.0.2にアップデートしました。

アップデート内容

  • アイコンを修正しました。
    • 「診」の文字を中央へ
  • 一部の診断について、診断時にクラッシュする不具合を修正しました。
    • 特定の診断が別のURLへリダイレクトされていることが原因のバグでした。
    • エラー時はURLを変えてリトライすることで回避しました。
  • 診断検索画面の余白を除去しました。
    • StackLayoutのSpacingを設定していないことが原因でした。

ダウンロード

「診断ビューワー」の技術的な話

先日リリースした「診断ビューワー」の技術的な話です。

今回はXamarinでとりあえずなにか作ってみようということで軽めに1本作りました。

しかし、いろいろ調べながら作っていたため、技術的にはかなり大きな収穫があったと思います。

iOSAndroidの見た目の違い

Xamarin.Formsでクロスプラットフォーム開発をして、いざiOSAndroidでビルドして動かしてみると、その見た目の違いがかなり気になります。

というのも標準ではiOSは白背景、Androidは黒背景でコントロールもその色をベースに作られているので、Xamarin.Formsでコードを共通化しても、見た目が全然違います。

これは、Android側を白ベースにしてiOSに近づけることで解決しました。

具体的には、ソリューション内のAndroidプロジェクトの中にあるMainActivity.csの以下のように変更しました。

[Activity(Label = "診断ビューアー",
 Icon = "@drawable/icon",
 MainLauncher = true,
 ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
 Theme = "@android:style/Theme.Holo.Light")]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity {
    protected override void OnCreate(Bundle bundle) {
        ...
    }
}

MainActivityクラスの属性の

Theme = "@android:style/Theme.Holo.Light"

が今回変更したところです。
これでAndroidアプリが白ベースになります。


非同期処理について

ただの知識不足だったんですが、Commandasync/awaitが使えることがわかったので、
できるところはすべて非同期処理に書き換えて、UIをブロックしないようにしました。

new Command(async () => {
    await Task.Run(() => /*時間のかかる処理*/);
};

このように書くことで既存の同期処理を非同期処理に書き換えることができます。


シングルトンなModel

今回はXamarinに慣れる意味もあって、極力MVVMパターンを守りました。
そんななかで設計上インスタンスが何個もあるとまずいModelがありました。
最初はstaticなクラスにしようと思ったのですが、
何となく気持ち悪かったのでteratailで質問したところ無事解決することができました。
teratail.com
(なんとC#SQL Serverカテゴリで1位の方々に答えていただきました!)

MVVMにおいて共有インスタンスシングルトン化するのが一般的だと思います。

とのことなので、シングルトンにて実装しました。


ObservableCollectionの更新処理

ViewModelのObservableCollectionをViewにバインドしているのですが、
データの更新処理でデータをすべて書き換えるときに最初は、

void UpdateData() {
    // ObservableCollection を初期化
    this._items = new ObservableCollection<Model>();

    // 更新処理
    foreach (var d in GetDate()) {
        this._item.Add(d);
    }
}

このようにしていたのですが、インスタンスを初期化してしまうとバインドが切れてしまう(?)ようでうまく動きませんでした。
そこで以下のようにしたところうまくいきました。

void UpdateData() {
    // ObservableCollection をクリア
    this._items.Clear();

    // 更新処理
    foreach (var d in GetDate()) {
        this._item.Add(d);
    }
}

インスタンスを初期化せずに要素を全部消して、その上で一から追加していく方法です。
確かによくよく考えれば当たり前な気もしますが....

まとめ

他にも様々な発見がありましたが、ブログに載せるのはこれぐらいにしたいと思います。
また今回はViewからの画面遷移になってしまったので、
MVVMに忠実にViewModelからViewModelへの遷移を実装できたらと思います。
PrismというMVVMフレームワークを使えばできるらしいのですが.........。