レスポンスはキャッシュされる
- NSURLConnectionでもAFNetworkingでも、レスポンスは設定によってはキャッシュされます
 - httpのレスポンスコードを正しく返す必要があります。
 - サーバーからのjsonのレスポンス、画像のキャッシュの設定をしっかりみる必要があります
 - 特に、普段返さないエラーページやメンテナンスページの設定を確認する必要あり
 
バージョンコントロール
- 下位バージョンをサポートしないことで、インストールがかなり落ちます。
 - 一度間違えて、7.1のときに7.0以降でなく7.1以降という設定でリリースして3割ほどインストールが落ちました
 - cocoapodを利用している場合は、Podfileに書いているバージョンとprojectのバージョンに違いがあるかも注意する必要があります。
 - 特定の7.0.2だけviewが崩れる問題などもありました
 
iOSの細かい設定の違い
カレンダーの設定の違い
- 和暦とタイ仏暦が存在します
 - iOS内部でNSDateにより日付を保持している場合は問題が表面に出ることはありませんが、文字列としてフォーマットし表示しようとした場合や、Webサーバーなど外部とのやりとりの際に問題が表面化することがあります
 - (iOSの書式設定に依存しますが)和暦の場合は2014年ではなく平成26年のように出力されます
 - (iOSの書式設定に依存しますが)タイ仏暦の場合は2014年ではなく仏歴2557年のように出力されます
 
キーボードのsplit keyboardの処理
- iPadの場合split keyboardというものがある。
 - 他のキーボードとnotificationのタイミングなどが異なるので注意が必要
 
気づきにくいバグのポイント
sharedInstanceやviewDidLoadでセットしているviewで問題が起きる
- sharedInstanceを利用してデータの受け渡しをしている場合、バグがあると、古いデータを利用して動作して問題が起きることが起きる。
 - 例えば、Aさんにメッセージしようとすると、Bさんにメッセージしてしまう
 - データの受け渡しはバグになりにくいように設計する。sharedInstanceを使った受け渡しはなるべくさける。notificationも常に使うことは絶対にしない。
 - コミュニケーションパターンってのがある。これに従うとよい
 - http://www.objc.io/issue-7/communication-patterns.html
 
異常系でクラッシュしやすいポイント
NSDictonaryやNSNumberにnilが入る
- blockの中の変数など解放されてたまにnilが入るケースもある。
 - viewのプロパティには注意が必要
 - サーバーからのデータに必ず値が入るか、入っていなくても動作するようにするか、決める&テストを書いておく必要がある
 
KVOでたまに落ちる
- 注意しないと結構クラッシュしやすい
 - FacebookのKVOControllerがおすすめ
 - https://github.com/facebook/KVOController
 
ネットワークを接続中の操作
- 他のviewに移動する
 - 他のアクションを実行するとか気をつける必要あり
 
新規ユーザのテスト
- データ依存の問題に最も気づきにくい
 - 選択肢などなるべく一度はすべてのケースでテストしたほうがよい
 
Crashlyticsは必ず入れておく
表示がおかしくなるポイント
ScrollViewの上部の位置
- versionによっても問題起きやすい
 - 複数配置していても問題起きやすい
 
データが0件のときのテスト
- なにも表示されない問題が起きる
 - 開発中に気づきにくいポイントになりやすい
 
セルの再利用
- tableViewやcollectionViewではセルを再利用している
 - データがない場合でもデータがないということを再代入する
 - imageの読み込み中のcellを再利用してしまうのはよくしてしまう
 
アプリの起動方法
通知から開く
- 通知から開く際に、アプリを起動してない・アプリを起動しているという二つのケースがある
 - 特にアプリを起動しているときは、例えばモダルビューを開いているときに通知を開くなどのケースを忘れやすい
 - ログインしてないユーザが通知からアクセスするとかも注意必要
 - 起動中の通知もある
 
url schemaから開く
- セキュリティ的にバグにならないか
 - 当たり前だけど、APIとしても常にどういうデータがきても大丈夫なように設計する
 
バックグラウンドフェッチから起動
- ライフサイクルが異なる
 
iPhoneの機種
- 機種依存の問題もありえるためできるだけ機種ごとにテストするほうがいいです。
 
その他iOS関連で書いている記事
- iOS開発に加わって最初に学んで欲しいこと http://qiita.com/reikubonaga/items/3ebe6fe29ce8d7c84291
 - iOS開発する上で絶対に押さえておく8つの項目 http://qiita.com/reikubonaga/items/44b459db5d6f130a4fc6
 - iOS開発していて気がついたら一杯のハードディスクを20GB以上軽くする方法! http://qiita.com/reikubonaga/items/48987d35fb10b7de6bcc
 - Swiftプロジェクトに入る前に読んだことまとめ http://qiita.com/reikubonaga/items/2a754c02534f8e7f97c2
 - StoryboardとContainerを多用した開発のメリットとデメリット http://qiita.com/reikubonaga/items/2e88ddda1ac0868a2729
 - iOSの環境変数(Configuration, Build Settings, Plist)で知っておくべきこと http://qiita.com/reikubonaga/items/53ac1818b3f56fc91504
 - awakeFromNibとinitWithFrameとinitWithCoderの使い方 http://qiita.com/reikubonaga/items/cb52dea471cfe1640773
 
インターン生・未経験者向け投稿
以下も同じように、これからスキルを身につけたい人向けに開発インターンで役立つことを書いています。
- rails開発に加わる前に学んで欲しいこと http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b
 - 開発インターンで気をつける5つのポイント http://qiita.com/reikubonaga/items/d00c179957d57f48bf73
 - 初めてコードレビューされる人のためのpull requestとcommitの作り方 http://qiita.com/reikubonaga/items/e3b3b19c14d4ef4efb95