この記事はアクトインディ株式会社 Advent Calendar 2016 7日目になります。
Webサービス「いこーよ」のアプリエンジニアのナカヤマです
個人アカウントは@LimiterJP
本業は会社員ですが個人で作っている賞味期限管理iOSアプリ「リミッター2」が
2016年12月5日
日本テレビ「有吉ゼミ」にて年末大掃除企画にてテレビ放送されました。
(個人プロジェクトはあたたかい会社にて個人事業了承済み)
紹介の尺は全部で2分程度
そこでテレビに放送されたときの効果と体験記を紹介します。
##アプリの内容
商品バーコードを読み取ると商品名と写真が表示され日付を入力するだけで賞味期限を
簡単に管理できるアプリです。賞味期限前にプッシュ通知でお知らせしてくれます。
読み取れないバーコードは一度登録すると学習していく仕様です。
ちいさなちょっとしたアプリです。
##ダウンロードURL
リミッター2
https://itunes.apple.com/jp/app/shang-pinbakodode-shang-wei/id1027284532?mt=8
##アプリの誕生まで
自分がもともとFlash開発→JSエンジニアで3年前くらいに
アプリエンジニアに転身し一番最初に作ったアプリです。
最愛の嫁さんが賞味期限を管理したい。
「簡単に使える」という嫁さん仕様に基づき世の中の廃棄が少しでも減ればと思い開発スタート。
最初はObjective-Cで開発 ローカルDBはCoreData(MagicalRecord)で作りました。
時は流れ1年前にリニューアルSwiftで再構築。
リリースから約3年クラッシュアンドビルドを繰り返し
今の形になりました。
放送前のDL数はversion1から累計で3年で5万DL。
##課金について
このアプリは課金アプリです。
アプリで儲けようと思っていません。
開発し続けるモチベーション維持、マーケティングの勉強、ドッグフーディングの為に行っています。
1000人に1人優しい方が課金してくれて月に1回ステーキが食べられればモチベーションがあがり機能が増えていくサイクルです。
ボクはステーキが大好きです。ステーキを食べるために個人アプリを開発しています。
新宿のパンドラが特に好きです。
##テレビ放送までの経緯
歌手の木山裕策さんがもともとプライベートで使用されていました。
年末大掃除企画で木山さんの超絶きれいな冷蔵庫管理方法を紹介。
(テレビ放送内で話しています)
##開発環境
###PC
MacBook Pro 13インチ core i7
###言語
Swift,Javascript(言うほど使ってないけど一応使っている)
###Webまわり
Javascript HTML
###使用したAPI
バーコードから商品を特定するために 楽天商品検索API
##インシデント
バーコードをKeyにして楽天商品検索を行っており
放送20分ほどでインシデント発生。
1秒間に30~50ほどのRequest。
商品検索APIがRequest制限に耐えられず(楽天が負荷に耐えられないわけではない)
「バーコード読めない」などお問い合わせが殺到
この時社会的な「死」を感じました。
その後予め楽天へ連絡を入れておいたおかげで復帰が早く
楽天より連絡が届く。
普段の10倍まで耐えられるように緩和してもらいました。
楽天のエンジニアの方々本当にありがとうございます!
もう楽天でしか買い物をしないと心に誓いました。
楽天APIを使用しているエンジニアはテレビ放送が決まったら速やかに
楽天へ連絡を。状況によって対応していただけます。
##当日のDL数、ランキングの順位効果など
AppStore総合5位
フード・ドリンクカテゴリーで2位
放送終了後12時間で大体3万ダウンロード
##放送前の負荷対策と障害が起こってしまったときの対応
商品検索APIを2つ用意(YAHOO・楽天)。一つ落ちたらすぐに切り替える設計(FireBaseのRemote Configを使用)
APIのURLは外部APIで管理。何かあったときにすぐに切り替えられうよう対策。(結局楽天の対応で楽天しか使用せず)
放送決定後すぐにAPIの提供元へ連絡。負荷がかかったときに制限を緩和してもらう。
例外が起こったときのアラート表示(なぜ?どんなError?なのか一般ユーザーにもわかるように)
放送直後にAPIが落ちたらプッシュ通知で一時的にバーコードが読めない旨をアナウンス。
ヘルプやお問い合わせなどあらゆるところに放送直後障害が発生する可能性があることを伝える。
##アプリの設計
XcodeにてStoryboardを使用。
構成は大きく分けてModelとViewController,Manager(APIなど),Extension,Constのシンプルな設計。
ViewController間の値渡しはprepareForSegueとUnwindSegue。
DelegateはTableViewCell以外は使用していない。
ViewControllerのController部分はExtensionに集約。
ViewControllerのExtensionを通してModelにアクセスする設計です。
AlertやActionSheet,ViewのtransitionなどViewControllerにExtensionを生やして実装。
極力Classは作らない設計。
例えばAViewControllerにTableViewがあるとすると
AViewController+TableView.swiftというファイルを生成しExtensionする。
値などのContstはstructをstatic。letで定義。
Alertの文言などはLocalizable.stringsで定義
小さなプロジェクトのためStoryboardの分割は
大きく5つ
「設定」
「TOPから枝分かれした遷移」
「課金」
「カテゴリー」
「カメラ」
Storyboardの中身はXibでオートレイアウトし
loadView()で呼び出し。Conflictを極力回避(一人だから競合しようがないw)
Storyboard分けすぎず全体を俯瞰できるよう考えました。もっといい方法があるかも。
先月StoryboardReferenceへ移行。(すっごい便利です)
##使用したライブラリ
###FireBase
プッシュ通知などを実装
APIをスイッチするためRemote Configを使用
###SDWebimage
画像キャッシュ
###Crashlytics
クラッシュ報告
###reachability
電波監視
###ObjectMapper
JSONのParse
最近SwiftyJSONから入れ替えました
###SVProgressHUD
ローディング
※通信系のライブラリは自力実装です。
##ワークフロー
基本的にGitHubFlow
プロジェクト管理はjootoで管理
https://www.jooto.com/
つけたい機能をトピックとして洗い出し期限を設定。
バージョン管理(Git)はBitbucketを使用
https://bitbucket.org/
jootoのチケット番号でbranch作成
1人プルリク
1人merge...
Apple審査完了時にversionをTagで管理。
会社(アクトインディ)では
GitHubのGitHubFlowです。
##感想
テレビは現時点においてもNo1のメディアです。
テレビ番組を作ってる方々は本当にものづくりに魂を込めています。
ボクは普段テレビをあまり見ないのですが今後は違った視点でテレビをこれからは見ていこうと思います。
こんな小さなちょっとしたアプリでテレビで紹介されるなんて恐縮です。
関わった関係者様、本当にありがとうございます!
今回のテレビ放送により日本中の食べ物の廃棄が0.01%でも減れば嬉しいと感じます。
##本業は会社員です
1児の父で
アクトインディという会社で子どもとの楽しいお出かけ先を提供するアプリ「いこーよ」を作っています。
http://iko-yo.net/apps
アクトインディでは以下の職種を募集しています。
https://www.wantedly.com/companies/actindi/projects
以上読んで下さってありがとうございます!