SlideShare a Scribd company logo
1 of 45
Download to read offline
How	

tab for iPhone	

is Made
Yoshihiro Akahira (tab inc.)
tab (iOS)
iPhone iPad
LatestVer. v2.10.0 v1.2.6
Support OS iOS6∼ iOS5∼
Release 1 / 2~3 week 2013/9/14
• 開発体制 3 ∼ 4 人	

• ARC 使用	

• Auto layout 不使用(iOS5サポートしていた時の名残)
今日話すこと
• tab アプリの内側	

• API通信処理	

• UI 工夫しているところ

• iOS App 開発Tips	

• デバッグ	

• その他Tips
API通信処理
Server JSON Model
ネットワークライブラリ	

どうする?
HTTPS Mapping
Dict
Parsing
ネットワークライブラリ
• 非同期実行	

• キャンセルできること	

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

• 安定していること
MKNetworkKit
• キャンセル可能	

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

• レスポンスキャッシュ機構あり
API通信処理
Server JSON Model
MKNetworkKit	

採用!!
HTTPS Mapping
Dict
Parsing
パースはどうする?
Parsing
• Parser は特にこだわり無し	

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

• じゃあ MKNetworkKit (NSJSONSerialization) で
いいか
API通信処理
Server JSON Model
MKNetworkKit
どうやって	

保存する?	

ライブラリは?
HTTPS Mapping
Dict
Parsing
MKNetworkKit	

採用!!
Mapping
• ディスクに保存? メモリに保存?	

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

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

→揮発性で良い	

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

• 投稿下書きデータはディスク保存必須
メモリに保存?
• 1ID = 1インスタンス のような構造	

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

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

• 注意	

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

内容が意識外で変化することによる危険性がある
CoreDataのリスク
• マイグレーションのリスク	

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

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

複数人でいじりにくい
じゃあ、どうする?
• CoreDataを参考にして…	

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

• CoreData は使わず	

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

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

• 投稿下書きデータは KeyedArchiver で実装(AutoCoding ライブラリ)
API通信処理
Server JSON Model
MKNetworkKit
RestKit	

採用!!
HTTPS Mapping
Dict
Parsing
MKNetworkKit
CoreData
今日話すこと
• tab アプリの内側	

• API通信処理	

• UI 工夫しているところ

• iOS App 開発Tips	

• デバッグ	

• その他Tips
UI
Tap!
Tap!
tab帳 アイテム
工夫したところ
• ユーザを待たせない	

• 見やすい地図を表示
ユーザを待たせない
• UIが反応しない時間を短く
NO!
ユーザを待たせない
• UIが反応しない時間を短く	

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

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

• 画像(サムネイル→精細画像)
サムネイル
ユーザを待たせない
• 非同期取得・表示	

• 別APIで取得するようなものは、非同期に
読み込み、読み込まれた時点で表示(更新)
• 地図、同じ場所の別アイテム他
見やすい地図を表示
Apple Map に難あり…
見やすい地図を表示
• アイテムのマップには
Google Static Maps API 使用	

• API 上限&遅延対策	

Apple Map の上に Google
Static Map を乗せて、上限
に達した時は非表示にし
て下の Apple Map を表示
http://youtu.be/9NLVfE8NwxM http://youtu.be/gR1yuXGe93k
UI 系 ライブラリ
• AwesomeMenu	

画面下のメニュー

• CMPopTipView	

Tips吹出し
UI 系 ライブラリ
• EGOTableViewPullRefresh	

PullTo Refresh

• MBProgressHUD	

ローディング HUD
UI 系 ライブラリ
• PSTCollectionView	

2列表示ビュー

• TSMiniWebBrowser	

必要最低限の UI を持った WebView
UI 系 ライブラリ
• IIViewDeckController	

サイドメニュー
今日話すこと
• tab アプリの内側	

• API通信処理	

• UI 工夫しているところ

• iOS App 開発 Tips
• デバッグ	

• その他Tips
iOS App 開発Tips
デバッグコツ
• BugSense でクラッシュ情報を収集	

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

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

→Stacktrace が当てにならない時に有用
デバッグコツ
• MixPanel で統計的にバグを発見	

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

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

→ ある条件だと「***ボタンを押せない」等のバ
グ発見
位置情報系デバッグ方法
• シミュレータで SignificantLocationChange を受ける方法	

1.位置情報 無し に設定	

2.シミュレータ終了	

3.シミュレータ起動	

4.位置情報を設定	

→ 発生!
❌GPS
✅Wifi
✅Cellular
Battery
Precision
位置情報系デバッグ方法
• 位置情報をログに出力	

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

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

フィールドテスト
• デバッグのため山手線一周など	

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

(あしあと)
• シミュレータは iBeacon 不可	

• あしあと確認画面を用意
今日話すこと
• tab アプリの内側	

• API通信処理	

• UI 工夫しているところ

• iOS App 開発Tips	

• デバッグ	

• その他 Tips
Continuous Integration
Jenkins
Developer
GitHub
ModuleTest	

UITest	

TestFlight Build
TestFlight
UploadDistribute
Merge
社内
Polling	

Trigger
Beta Users
Mail & HipChat
Download
コードレビュー
• 誰か一人にレビューしてもらう	

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

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

→スタイル論争が不要になる
Storyboard
• 複数人開発するとマージでコンフリクト
Storyboard
• 複数人開発するとマージでコンフリクト	

• Storyboard を分割	

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

• マージの際 Classes を削除	

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

Git の pre-commit で自動削除
Apple Review Reject
• マップの Google ロゴの上に UI を乗せてしまってアウト	

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

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

• Reject ではないけれど…	

• どういうアプリかよくわからんから動画に撮って送って
くれ
今日話すこと
• tab アプリの内側	

• API通信処理	

• UI 工夫しているところ

• iOS App 開発Tips	

• デバッグ	

• その他Tips
ご清聴、ありがとうございました

More Related Content

What's hot

running-elixir-in-production
running-elixir-in-productionrunning-elixir-in-production
running-elixir-in-productionTsunenori Oohara
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Koichi Shimozono
 
Zabbix モジュール間の通信を暗号化する
Zabbix モジュール間の通信を暗号化するZabbix モジュール間の通信を暗号化する
Zabbix モジュール間の通信を暗号化するTakeshi Yamane
 
チャットサービス運用の舞台裏
チャットサービス運用の舞台裏チャットサービス運用の舞台裏
チャットサービス運用の舞台裏Hiroaki Nagata
 
IPアドレスのおねだん
IPアドレスのおねだんIPアドレスのおねだん
IPアドレスのおねだんKei Onimaru
 
a-blog cms の基本 福岡版
a-blog cms の基本 福岡版a-blog cms の基本 福岡版
a-blog cms の基本 福岡版Kasumi Morita
 
WeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加するWeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加する裕士 常田
 
PHPで使うIPv6の実際
PHPで使うIPv6の実際PHPで使うIPv6の実際
PHPで使うIPv6の実際Tetsuji Koyama
 
Raspberry Piで撮った写真を共有するアプリ on SoftLayer
Raspberry Piで撮った写真を共有するアプリ on SoftLayerRaspberry Piで撮った写真を共有するアプリ on SoftLayer
Raspberry Piで撮った写真を共有するアプリ on SoftLayerrina0521
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際Tetsuji Koyama
 
Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829Rikiya Kawakami
 
20150228 Realm超入門
20150228 Realm超入門20150228 Realm超入門
20150228 Realm超入門Kei Ito
 
趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方Koichi Ota
 
Firebase × Swift ~ときどきPython~
Firebase × Swift ~ときどきPython~Firebase × Swift ~ときどきPython~
Firebase × Swift ~ときどきPython~Yuya Oka
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュKenji Mori
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメTakafumi ONAKA
 

What's hot (20)

running-elixir-in-production
running-elixir-in-productionrunning-elixir-in-production
running-elixir-in-production
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
RSpecしぐさ
RSpecしぐさRSpecしぐさ
RSpecしぐさ
 
About Reauire.js
About Reauire.jsAbout Reauire.js
About Reauire.js
 
Zabbix モジュール間の通信を暗号化する
Zabbix モジュール間の通信を暗号化するZabbix モジュール間の通信を暗号化する
Zabbix モジュール間の通信を暗号化する
 
チャットサービス運用の舞台裏
チャットサービス運用の舞台裏チャットサービス運用の舞台裏
チャットサービス運用の舞台裏
 
IPアドレスのおねだん
IPアドレスのおねだんIPアドレスのおねだん
IPアドレスのおねだん
 
a-blog cms の基本 福岡版
a-blog cms の基本 福岡版a-blog cms の基本 福岡版
a-blog cms の基本 福岡版
 
WeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加するWeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加する
 
PHPで使うIPv6の実際
PHPで使うIPv6の実際PHPで使うIPv6の実際
PHPで使うIPv6の実際
 
Raspberry Piで撮った写真を共有するアプリ on SoftLayer
Raspberry Piで撮った写真を共有するアプリ on SoftLayerRaspberry Piで撮った写真を共有するアプリ on SoftLayer
Raspberry Piで撮った写真を共有するアプリ on SoftLayer
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際
 
Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829
 
20150228 Realm超入門
20150228 Realm超入門20150228 Realm超入門
20150228 Realm超入門
 
趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方
 
Firebase × Swift ~ときどきPython~
Firebase × Swift ~ときどきPython~Firebase × Swift ~ときどきPython~
Firebase × Swift ~ときどきPython~
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
 
hello waf, hello phoenix
hello waf, hello phoenixhello waf, hello phoenix
hello waf, hello phoenix
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメ
 

Similar to COOKPAD tab 勉強会 2014.04.24

RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open APIKohei Saito
 
オフラインファーストの思想と実践
オフラインファーストの思想と実践オフラインファーストの思想と実践
オフラインファーストの思想と実践Shumpei Shiraishi
 
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲームhideyuki ikeda
 
最近のフロントエンドツールの紹介
最近のフロントエンドツールの紹介最近のフロントエンドツールの紹介
最近のフロントエンドツールの紹介Ryo Iinuma
 
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発takuma mori
 
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~拓将 平林
 
Hacker's meetup boost_vol1発表資料_20150902
Hacker's meetup boost_vol1発表資料_20150902Hacker's meetup boost_vol1発表資料_20150902
Hacker's meetup boost_vol1発表資料_20150902真一 藤川
 
TypeScript x Bot Framework
TypeScript x Bot FrameworkTypeScript x Bot Framework
TypeScript x Bot FrameworkKazumi IWANAGA
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話Yuhei Miyazato
 
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」Noritada Shimizu
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳Uchio Kondo
 
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある20181025 若手LT会 Codableあるある
20181025 若手LT会 CodableあるあるIgaHironobu
 
Windows azureって何
Windows azureって何Windows azureって何
Windows azureって何Kana SUZUKI
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7TakumiIINO
 
AWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャAWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャ真吾 吉田
 
さくらのクラウドフォーメーション with Chef [XEgg session]
さくらのクラウドフォーメーション with Chef [XEgg session]さくらのクラウドフォーメーション with Chef [XEgg session]
さくらのクラウドフォーメーション with Chef [XEgg session]Yukihiko SAWANOBORI
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~Developers Summit
 
PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!Tsubasa Yoshino
 
B 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureB 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureGoAzure
 

Similar to COOKPAD tab 勉強会 2014.04.24 (20)

RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
 
オフラインファーストの思想と実践
オフラインファーストの思想と実践オフラインファーストの思想と実践
オフラインファーストの思想と実践
 
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
 
最近のフロントエンドツールの紹介
最近のフロントエンドツールの紹介最近のフロントエンドツールの紹介
最近のフロントエンドツールの紹介
 
Api meetup LT
Api meetup LTApi meetup LT
Api meetup LT
 
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
 
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
 
Hacker's meetup boost_vol1発表資料_20150902
Hacker's meetup boost_vol1発表資料_20150902Hacker's meetup boost_vol1発表資料_20150902
Hacker's meetup boost_vol1発表資料_20150902
 
TypeScript x Bot Framework
TypeScript x Bot FrameworkTypeScript x Bot Framework
TypeScript x Bot Framework
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」
Firefox OS 勉強会 名古屋2nd 「便利な便利な開発ツール」
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある
 
Windows azureって何
Windows azureって何Windows azureって何
Windows azureって何
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7
 
AWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャAWSによるサーバーレスアーキテクチャ
AWSによるサーバーレスアーキテクチャ
 
さくらのクラウドフォーメーション with Chef [XEgg session]
さくらのクラウドフォーメーション with Chef [XEgg session]さくらのクラウドフォーメーション with Chef [XEgg session]
さくらのクラウドフォーメーション with Chef [XEgg session]
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
 
PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!
 
B 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureB 2-1 はじめての Windows Azure
B 2-1 はじめての Windows Azure
 

COOKPAD tab 勉強会 2014.04.24