45
How tab for iPhone is Made Yoshihiro Akahira (tab inc.)

COOKPAD tab 勉強会 2014.04.24

  • Upload
    akahira

  • View
    984

  • Download
    2

Embed Size (px)

DESCRIPTION

COOKPAD さんとの勉強会(第1回)。 2014/04/24

Citation preview

Page 1: COOKPAD tab 勉強会 2014.04.24

How tab for iPhone

is MadeYoshihiro Akahira (tab inc.)

Page 2: COOKPAD tab 勉強会 2014.04.24

tab (iOS)

iPhone iPadLatest Ver. v2.10.0 v1.2.6

Support OS iOS6~ iOS5~Release 1 / 2~3 week 2013/9/14

• 開発体制 3 ~ 4 人

• ARC 使用

• Auto layout 不使用(iOS5サポートしていた時の名残)

Page 3: COOKPAD tab 勉強会 2014.04.24

今日話すこと

• tab アプリの内側

• API通信処理

• UI 工夫しているところ

• iOS App 開発 Tips

• デバッグ

• その他 Tips

Page 4: COOKPAD tab 勉強会 2014.04.24

API通信処理

Server JSON Model

ネットワークライブラリ どうする?

HTTPS MappingDict

Parsing

Page 5: COOKPAD tab 勉強会 2014.04.24

ネットワークライブラリ

• 非同期実行

• キャンセルできること

• コールバックがブロックで書きやすいこと

• 安定していること

Page 6: COOKPAD tab 勉強会 2014.04.24

MKNetworkKit

• キャンセル可能

• 同じURLへのリクエストが複数あるとマージしてくれる

• レスポンスキャッシュ機構あり

Page 7: COOKPAD tab 勉強会 2014.04.24

API通信処理

Server JSON Model

MKNetworkKit 採用!!

HTTPS MappingDict

Parsing

パースはどうする?

Page 8: COOKPAD tab 勉強会 2014.04.24

Parsing

• Parser は特にこだわり無し

• 速くて、安定してて、使いにくくなくて

• じゃあ MKNetworkKit (NSJSONSerialization) でいいか

Page 9: COOKPAD tab 勉強会 2014.04.24

API通信処理

Server JSON Model

MKNetworkKitどうやって 保存する?

ライブラリは?

HTTPS MappingDict

Parsing

MKNetworkKit 採用!!

Page 10: COOKPAD tab 勉強会 2014.04.24

Mapping

• ディスクに保存? メモリに保存?

• CoreDataを使う?リスクは??

Page 11: COOKPAD tab 勉強会 2014.04.24

ディスクに保存?• アイテム等のデータは常に更新される

→ネットワークから送られたものが常に正しい

→揮発性で良い

• 一方、画像データはディスクキャッシュ必須

• 投稿下書きデータはディスク保存必須

Page 12: COOKPAD tab 勉強会 2014.04.24

メモリに保存?• 1ID = 1インスタンス のような構造

• 同じIDのインスタンスをメモリ上に複数持つのも無駄

→メモリ上でインスタンスを保持

• 注意

同じインスタンスを複数箇所で参照・変更すると

内容が意識外で変化することによる危険性がある

Page 13: COOKPAD tab 勉強会 2014.04.24

CoreDataのリスク

• マイグレーションのリスク

マイグレーションシステム、コードの理解が難しい慣れていないと予期しない動作をする場合がある

• モデルのマージが難しい

複数人でいじりにくい

Page 14: COOKPAD tab 勉強会 2014.04.24

じゃあ、どうする?• CoreDataを参考にして…

• メモリ上にデータをキャッシュできる構造(1ID=1インスタンス)

• CoreData は使わず

• RestKit でシリアライズ・デシリアライズする

• CoreData を適用しようと思えば適用できる構造を意識

• 投稿下書きデータは KeyedArchiver で実装(AutoCoding ライブラリ)

Page 15: COOKPAD tab 勉強会 2014.04.24

API通信処理

Server JSON Model

MKNetworkKit RestKit 採用!!

HTTPS MappingDict

Parsing

MKNetworkKit

CoreData

Page 16: COOKPAD tab 勉強会 2014.04.24

今日話すこと

• tab アプリの内側

• API通信処理

• UI 工夫しているところ

• iOS App 開発 Tips

• デバッグ

• その他 Tips

Page 17: COOKPAD tab 勉強会 2014.04.24

UI

Page 18: COOKPAD tab 勉強会 2014.04.24

Tap!

Tap!

tab帳 アイテム

Page 19: COOKPAD tab 勉強会 2014.04.24

工夫したところ

• ユーザを待たせない

• 見やすい地図を表示

Page 20: COOKPAD tab 勉強会 2014.04.24

ユーザを待たせない

• UIが反応しない時間を短く

NO!

Page 21: COOKPAD tab 勉強会 2014.04.24

ユーザを待たせない• UIが反応しない時間を短く

• 前ページまでに得られている情報のみで、遷移先のページをまず表示する

• アイテムタイトル、アイテム説明

• 画像(サムネイル→精細画像)

Page 22: COOKPAD tab 勉強会 2014.04.24

サムネイル

Page 23: COOKPAD tab 勉強会 2014.04.24

ユーザを待たせない• 非同期取得・表示

• 別APIで取得するようなものは、非同期に読み込み、読み込まれた時点で表示(更新)

• 地図、同じ場所の別アイテム他

Page 24: COOKPAD tab 勉強会 2014.04.24

見やすい地図を表示

Apple Map に難あり…

Page 25: COOKPAD tab 勉強会 2014.04.24

見やすい地図を表示• アイテムのマップには

Google Static Maps API 使用

• API 上限&遅延対策

Apple Map の上に Google Static Map を乗せて、上限に達した時は非表示にして下の Apple Map を表示

Page 26: COOKPAD tab 勉強会 2014.04.24

http://youtu.be/9NLVfE8NwxM http://youtu.be/gR1yuXGe93k

Page 27: COOKPAD tab 勉強会 2014.04.24

UI 系 ライブラリ• AwesomeMenu

画面下のメニュー

• CMPopTipView

Tips吹出し

Page 28: COOKPAD tab 勉強会 2014.04.24

UI 系 ライブラリ• EGOTableViewPullRefresh

Pull To Refresh

• MBProgressHUD

ローディング HUD

Page 29: COOKPAD tab 勉強会 2014.04.24

UI 系 ライブラリ• PSTCollectionView

2列表示ビュー

• TSMiniWebBrowser

必要最低限の UI を持った WebView

Page 30: COOKPAD tab 勉強会 2014.04.24

UI 系 ライブラリ• IIViewDeckController

サイドメニュー

Page 31: COOKPAD tab 勉強会 2014.04.24

今日話すこと

• tab アプリの内側

• API通信処理

• UI 工夫しているところ

• iOS App 開発 Tips

• デバッグ

• その他 Tips

Page 32: COOKPAD tab 勉強会 2014.04.24

iOS App 開発 Tips

Page 33: COOKPAD tab 勉強会 2014.04.24

デバッグコツ• BugSense でクラッシュ情報を収集

• パンくずリストを併せて送信

→どういった操作でクラッシュするのか

→Stacktrace が当てにならない時に有用

Page 34: COOKPAD tab 勉強会 2014.04.24

デバッグコツ• MixPanel で統計的にバグを発見

• 新しいバージョンで ***ボタンを押す人が減った

• 何か UI 変えた? → 変えてない

→ ある条件だと「***ボタンを押せない」等のバグ発見

Page 35: COOKPAD tab 勉強会 2014.04.24

位置情報系デバッグ方法• シミュレータで SignificantLocationChange を受ける方法

1.位置情報 無し に設定

2.シミュレータ終了

3.シミュレータ起動

4.位置情報を設定

→ 発生!

❌GPS✅Wifi✅Cellular

BatteryPrecision

Page 36: COOKPAD tab 勉強会 2014.04.24

位置情報系デバッグ方法

• 位置情報をログに出力

• 読み出し UI を用意(DEBUGビルドのみ)

• UserDefaults に保存

Page 37: COOKPAD tab 勉強会 2014.04.24

位置情報系デバッグ方法• でも、やっぱり最終的には…

フィールドテスト

• デバッグのため山手線一周など

→荻窪駅周辺にバグを再現できるスポット発見!

Page 38: COOKPAD tab 勉強会 2014.04.24

iBeaconデバッグ (あしあと)

• シミュレータは iBeacon 不可

• あしあと確認画面を用意

Page 39: COOKPAD tab 勉強会 2014.04.24

今日話すこと

• tab アプリの内側

• API通信処理

• UI 工夫しているところ

• iOS App 開発 Tips

• デバッグ

• その他 Tips

Page 40: COOKPAD tab 勉強会 2014.04.24

Continuous Integration

Jenkins

Developer

GitHub

Module Test UI Test

TestFlight Build TestFlight

UploadDistribute

Merge

社内

Polling Trigger

Beta Users

Mail & HipChatDownload

Page 41: COOKPAD tab 勉強会 2014.04.24

コードレビュー• 誰か一人にレビューしてもらう

• Git の pre-commit で Uncrustify (コードフォーマッタ)

→しょうもない指摘をしなくて済む

→スタイル論争が不要になる

Page 42: COOKPAD tab 勉強会 2014.04.24

Storyboard• 複数人開発するとマージでコンフリクト

Page 43: COOKPAD tab 勉強会 2014.04.24

Storyboard• 複数人開発するとマージでコンフリクト

• Storyboard を分割

同時に Storyboard をいじる可能性が減る

• マージの際 Classes を削除

• <inferredmetricstiebrakers> → 中の要素を削除

Git の pre-commit で自動削除

Page 44: COOKPAD tab 勉強会 2014.04.24

Apple Review Reject• マップの Google ロゴの上に UI を乗せてしまってアウト

まだ Apple のマップがなかった時代

• ライセンスには気をつけよう

• Reject ではないけれど…

• どういうアプリかよくわからんから動画に撮って送ってくれ

Page 45: COOKPAD tab 勉強会 2014.04.24

今日話すこと• tab アプリの内側

• API通信処理

• UI 工夫しているところ

• iOS App 開発 Tips

• デバッグ

• その他 Tips

ご清聴、ありがとうございました