iOS アプリ開発　全アプリ共通でやっておきたいUIまわりのテスト

iOSアプリ開発にて、テスト中に確認する項目をメモっておきます。

[Android アプリ開発　全アプリ共通でやっておくUIまわりのテスト](http://qiita.com/whomyuw/items/ce95173189bfccf0e82d)のついでに作成しました。


# 確認項目一覧

* Androidと共通の確認点
  * 低速回線でのアプリ動作
  * ボタンの同時押し
  * ネットワークエラー時の動作
  * 複数OS,解像度での確認
  * 外部キーボード入力

* iOSのみの確認点
  * 画面左エッジスワイプの戻る動作
  * NSDateFormatterの和暦、12/24H表記対応

# 低速回線でのアプリ動作
開発中は、固定回線のためアプリがサクサク動きますが、実際の環境ではモバイル回線なので、
モバイル回線時の環境に近い状態で正常に動作することをテストする。

【方法】
個人的な理想では、mvnoのSIM（あまり速度のでない回線）を用意してテストするのが良さそうです。
ただ、用意できない場合は、低速回線環境をシュミレートしてテストする必要があります。
https://www.lancork.net/2014/04/ios-dev-how-to-change-network-condition/

# ボタンなどUIの同時押し
ボタンの同時押しができると、意図しない画面遷移をするので、不必要に同時押しができないことを確認する。

【対策】
各UIButton(UIView系)に

>button.exclusiveTouch = false

を設定すれば同時押しを無効化できます。

【参考】
ViewControllerのSubViews全て一括で適用
https://qiita.com/YusukeHosonuma/items/8d5ed9fa4bd4fd172bf2
ボタンだけ
http://qiita.com/usatie/items/514e24b8d8e6ada708e8


# ネットワークエラー時の動作
ネットワークエラー時の仕様がある場合、ネットワークエラーの動作確認を行う。

【方法】
実装次第では、更新ボタン、PullToRefresh等で更新した時に、表示が崩れたり、クラッシュしたりするので、しっかりと確認する。

# 複数OS,解像度での確認
当たり前ですが、動作保証内のOS、端末解像度での動作確認をする。

【対策 複数OS】
iOS8以降対応であれば、

* iOS 8.1 と 8.4.1
* iOS 9.1 と 最新版

のように、各バージョンごとのx.0を除いた一番古いバージョンと最新のバージョンで動作確認をしておく。
バージョンx.0はOS自体の

* バグが多い
* 利用者数が少ない

ため、動作保証対象からできれば外しておくのがオススメです。

【対策 解像度】
例として、iPhone対応アプリであれば、

* iPhone 4s
* iPhone 5系
* iPhone 6系
* iPhone 6plus系
* iPhone X

を用意して、 最低でも正常動作周りは全端末で動作確認をしておく。

iPadも対応しているアプリで有れば、

* iPad 9.7inch
* iPad 10.5 inch
* iPad 12.9inch

のサイズでちゃんと表示されればいい感じです。

【備考】
iPhone6,6plusでは、設定アプリから拡大表示を設定することで、

* iPhone6 -> iPhone5
* iPhone6Plus -> iPhone6

の画面サイズに拡大することができます。
https://support.apple.com/ja-jp/HT203073

1端末で2端末の画面サイズをテストできるので、端末がない時は試してみてください。

#外部キーボード入力

iPhoneメインのアプリで有れば、それほど気にする必要がないかもしれませんが、
iPadに外付キーボードを接続している状態でのテストをした方が良いアプリがあります。

* TextField/TextViewで文字列制限があるアプリ
* TextField/TextViewで文字種制限があるアプリ
* 業務系のアプリでTabキーを考慮する必要があるアプリ

などです。

【方法】
* 端末に外部キーボードを接続
* シュミレータ場でMacのキーボードから入力

して、入力周りをテストする。

# 画面左エッジスワイプの戻る動作
左エッジスワイプで戻る操作をするときは、戻るボタンと違って画面を戻る遷移を途中でキャンセルできてしまいます。
途中でキャンセルした場合でも、前画面のviewWillAppearは呼ばれてしまうので、戻るをキャンセルした時のテストが必要です。

【方法】
エッジスワイプで戻れる画面を把握して、全画面テストする。


## NSDateFormatterの和暦、12/24H表記対応
iPhoneでは設定アプリ->一般->言語と地域から、暦法を

* 西暦
* 和暦
* タイ仏暦

の3種類から選択することができます。

この設定を西暦以外にするとNSDateFormatterを使って年を取得するときに、意図しない値を取得してしまいます。
例としては、端末の設定が**和暦**で、2016年を文字列で取得したい場合、0028年（平成28年）あたりの値になるはずです。
※2016年=平成28年をyyyyフォーマットにするため、0028年になります。

また、暦法だけではなく、iPhoneでは設定アプリ->一般->日付と時刻->24時間表示から

* 12時間表記
* 24時間表記

を選択できるので、12h設定時に13時を文字列で取得したい場合、**午後01時**のような文字列が取得できてしまいます。


【方法】
日付をNSDateFormatterを使用しているところでは、端末の暦法を和暦/12h設定にしてアプリの表示が正しく行われていることを確認する。
また、APIなどへパラメーターとして年を送信する実装がある場合も上記手順で問題なく動作しているか確認する。

【対策】
NSDateFormatter,NSCalenderの設定を端末設定ではなく、手動で初期化すれば常に西暦で年をとることができます。

```swift
let dateFormatter = NSDateFormatter()
// 西暦に設定
dateFormatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
// local,timeZoneを明示的に指定
dateFormatter.locale = NSLocale.systemLocale()
dateFormatter.timeZone = NSTimeZone.systemTimeZone()

dateFormatter.dateFormat = "yyyy/MM/dd"
print(dateFormatter.stringFromDate(NSDate()))

```

【参考】
http://dev.classmethod.jp/smartphone/ios-nsdate/
http://d.hatena.ne.jp/MoonMtLab/20150407/1428406838

とりあえずここまで！！