コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

やりたくない作業はガチャで解決 iOSアプリChoreGachaの作り方

毎度おなじみクソアプリ Advent Calendar 2018の25日目、2年連続オオトリの記事でございます

「あなたにとって一番ためになったビジネス書はなんですか?」なんてことを面接とか飲んでるときとかに話したりするよね。

そんなときはオレはいつもカーネギーの「人を動かす」と答えている。 この本は本当にいい本で、オレは本編の他にも漫画版も持っている。

人に何かをしてもらいたいときには言い方や接し方が重要だよと当たり前のことを説いてる本で、「プログラムは人と違って嘘つかないから良い」とか言っていたかつてのオレのような人にはおすすめなんだな。 人を動かす 文庫版マンガで読み解く 人を動かす

そんなことはさておき、オレと同じ家に妻がいるんですけどね。 やれ「部屋を片付けろ」だの、「読んでもいない本を処分しろ」だの、「なんだかわからないケーブルを捨てろ」だの「謎のガジェット捨てろだの」頭ごなしに言うわけですよ。

本当にわかってない、ピープルマネージメントがわかってない。こんな言い方ではコミュニケーションの試験は赤点だ。

そんなにガミガミ言って人が動くわけがない、もっとこう片付ける気にさせるようにマネージメントしなさいよと、カーネギーの人を動かすを渡そうとするとどういうわけか火に油

しょうがないから片付けを仕組み化できるようなアプリを作らせろと言ったところ、そんなの作る時間があったら片付けろ言われる始末。至極まっとうな主張なのでぐうの音も出ない。

そんなこんなで妻が数日出張で家を開けたんですよ。

「これは片付けていいところを見せるチャンスだ」 「この隙きに片付けアプリを作って部屋を片付けまくって見返してやるぜ!!」

と言って作ったのが今回のこちら

作ったアプリ概要

「面倒くさいことややりたくないことはスキマ時間にちょっとづつやればいい」 ちょっとづつ何回もやればいずれ全部解決するという寸法だ。

やらなければならないけどやりたくないことを集めて、これらをガチャを回して一つに決める。決まったものを10分間実施し、時間が来たら音が鳴るというiOSアプリ

アプリ名

アプリ名はChoreGacha(チョアガチャ)、雑用(chore)をガチャを引いてこなしているのでチョアガチャ

登録されているChoreは以下の7個

  • テーブルや机を片付ける
  • 水回りを掃除する
  • 本棚を整理する
  • いらないものをメルカリに出品する
  • 伝票の仕分けをする
  • 筋トレかストレッチをする
  • 英語をちょっと勉強する

Choreの追加や編集は? できねぇよ。コード書き換えりゃあいいじゃねぇか

デモ


面倒くさいことをガチャで解決


しょうもないアプリの作り方

さて技術的にはそんなに高度なことはしていないが、作りたいもの機能をどうやって最小限に絞り込むのかについて、今回はいつもとは趣向を変えて例を示したい。

趣味で作って公開したものはバズらせたい気持ちもわかる。オレも正直せっかく作ったものが多くの人に知られてほしいとも思う。

わかるけれども少しばかりバズったところで人はすぐに忘れていくのだ、コンシューマの消費行動に我々クリエイターが疲弊する必要はないのだ。ないのだ!!

下記のことをして漠然としたやりたいことから、やるべきことを絞り込んで実装するという流れで作っていく

  • やりたいこと
  • MVPを考える
  • 具体的なタスクリストにする
  • タスクを潰していく(作っていくと判明したタスクの追加もする)

やりたいこと

  • 本棚の片付けや机の整理をちょっとづつやる
  • ガチャのように選びたい
  • タスクはタスクごとに制限時間をつける?
  • やる時間を設定(セレクトする5、10分 20分 30分)
  • ガチャを回す
  • ストップウォッチスタート
  • タスクの登録(内容と、選べる時間帯を複数)
  • デザインも適当なキットみたいのを当てたい
  • RxSwiftを使ってみたいから使う

MVPを考える

MVP(Minimum Viable Product)はプロダクトのコアだけ作る、機能の取捨選択した一番小さいプロダクトのことを指す。特に重要なのはやらないことを明確にして書き出しておくことだ。

やらないこと

  • タスクの登録はやらない
    • 固定値にする。モデルのリストをイニシャライズする
    • なので永続化もしない
  • アプリがバックグラウンドでどれだけ再生できるかは気にしない(最悪10分持てば良い)
  • 時間設定もなくていい画面が増えるから 10分とか固定
  • UIにこらない、デフォルトでいい、アニメーションもこらない
  • AutoLayoutを気にしない。iPhone Xで見られればいい
  • 1画面1ストーリーボードみたいにいい感じにしない
  • FatViewControllerを気にしてファイルをいい感じに分割しない

やること

  • ガチャを引く
  • タスク決定
  • タイマースタート
  • タイマーをっぽいことをバックグラウンドで動かす
    • -> どうやらストップウォッチ的なのはiOSアプリは作れないっぽい
      • ローカルプッシュ通知を使う
  • RxSwiftで書く。全然本質的じゃない書き方でいいのでRxを導入する

MVPから導き出されるUIは

  • トップ画面、ガチャを引く
  • タスク決定、タイマースタート開始ボタン
    • ストップウォッチをバックグラウンドで動かす
    • 10分後に通知が飛ぶ

MVPを作るためのタスク

  • [x] XcodeでUnitテスト付きで作りアイフォンでデバッグできるようにする
  • [x] CarthagoでRxswiftを入れて適当なプロプログラムを動かす
  • [x] 2枚めの適当な画面を作る
  • [x] ボタンを押したら画面遷移するようにする(ストーリーボードじゃなくてコードで)
  • [x] 画面遷移で値(最終的にはモデルクラス)を渡す
    • [x] 中間段階として文字列を渡す
    • [x] モデルを渡す
  • [x] タイマーを作る、時間が過ぎたら適当な音がなるようにする。バイブでもいい
    • [x] 適当なストップウォッチ機能を作る
    • [x] タイマーのバックグラウンド再生する
    • [x] ストップウォッチ機能をカウントダウンするようにする
    • [x] カウントが終わったら、音を鳴らすようにする
  • [x] モデルを作る、structで作ること
    • 内容: タイトル、対象時間を入れたいところだけど今回はタイトルだけ
  • [x] ガチャのロジックを作る
    • [x] ガチャを引く、選定、画面遷移
    • [x] 選ばれたモデルをラベル表示
  • [x] タイマー画面の調整
    • [x] 戻るボタンを付ける。タイマーもリセット(ちゃんと作ってないからリセットされるかも)
  • [x] 見た目を整える
    • [x] タイトル表示
    • [x] ボタン名をつける
    • [x] タイマー開始前のラベル名がlabelのままなので00とかにしておく
    • [x] サンプルのRxのコードを消す
  • [x] 他にやるとしたら
    • [x] バックグラウンドでタイマー完了後に音を鳴らせないのでローカル通知にする

じゃーねーロケットビーバイ!!

人を動かす 文庫版

人を動かす 文庫版

マンガで読み解く 人を動かす

マンガで読み解く 人を動かす