Apple公式 アプリ改善のベストプラクティス

# Apple公式のアプリ改善のベストプラクティス

WWDC16で[Improving Existing Apps with Modern Best Practices](https://developer.apple.com/videos/play/wwdc2016/213/)というアプリ改善のベストプラクティスを紹介するセッションがありました。

> We're going to take a look at some ways that you can today start reducing your technical debt. 

と言っていたように、正確には技術的な負債を減らすことを目的としたセッションと見て良いのではないかと思います。

※この記事に挿入されているスライド、引用はすべて[Improving Existing Apps with Modern Best Practices](https://developer.apple.com/videos/play/wwdc2016/213/)より引用しています。

細かな点については上記のセッションを見てもらうのが一番ですが、ここで取り上げられていたいくつかをまとめてみました。

## 直近2つのOSをサポート、Deployment Targetは最新のアップデートバージョンに

直近2バージョンを押さえておけば（この時Appleが公表していた）95%のデバイスをカバーすることができるので、そうしましょうということでした。

<img width="636" alt="スクリーンショット 2016-12-01 10.39.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/1f714a73-88e8-9852-634d-386714b4e3bb.png">


また、Deployment Targetは最新アップデートバージョンにしましょうということでした（iOS8と9をサポートするのであれば、その最新のアップデートであるiOS8.4をDeployment Targetに指定）。

> But don't go to 8.3 or 8.2 anymore because then you and your customers don't benefit from the improvements that we've implemented under the hood in that 8.4 release.

最新OSの恩恵を受けましょう、振り返るのはやめましょう。

ちなみに今日の時点でiOS9よりも前のOSを使用しているユーザーは8%でした。

<img width="235" alt="スクリーンショット 2016-12-01 10.42.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/1f04c409-fdf9-ec0e-9764-95734f33c657.png">

この数値は https://developer.apple.com/support/app-store/ で確認することができます。


<div class='alert alert-warning'><h5>注意</h5>
Deployment Targetはアプリがサポートする最低バージョンを指定するものなので、上記の例のようにiOS8.4をDeployment Targetに指定すると8.3, 8.2など、それ以前のOSをサポートしなくなります。
</div>

## 警告をエラーとして扱う

Deprecated APIは修正しましょう。言い訳は無用です。

> And there's really no excuse for not moving on to the new API because we tell you right there. It tells you what to use. So, just use that.

厳格にやるためにBuild Settingsで**Treat Warnings as Errorsを有効化**しましょう。

<img width="429" alt="スクリーンショット 2016-11-30 21.56.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/f3ab672d-92f9-9c09-be56-8b835bb7183e.png">

警告は無視しようと思えばできてしまうので、こうすることで厳格に運用することができます。


## アクセシビリティをサポートする

> We think that the accessibility support is as much a part of your user interface as the artwork is.

**アクセシビリティもUIの一部です**。Interface Builderでもコードでも設定することが可能です。

## ローカライズする

ローカライズのためのAPIがたくさん用意されています。

<img width="638" alt="スクリーンショット 2016-12-01 10.50.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/191251c6-2d35-60ac-2679-4a36f1388d8b.png">


iOS10では、`Dimension`と`MeasurementFormatter`などローカライズに便利なクラスが追加されています。

## Peek, Pop, Quick Actionsに対応しましょう

Appleはすべてのアプリがサポートすることを期待しています。

> How awesome would it be if every app that we had already had support for Peek, Pop and Push and the 3-D touch?


すべてのアプリが対応していればユーザーも使います。

## 2016年の秋に備える

もう過ぎてしまいましたが、これは来年以降も変わらないでしょう。早めに動き出して確認をしましょう

> So, you have an edge case. So, tell us about that too. This is why we do these preview releases.
We want you to file bug reports. The report isn't just banter in the hallway. And it's not just writing on a dev forum and is not just sending an email to Apple. The proper way to file a bug report is this. BugReport.Apple.com.

もしバグを見つけたらバグレポートを出しましょう。

<img width="636" alt="スクリーンショット 2016-12-01 10.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/543e36e2-6fe2-c232-0395-a2212e0edf25.png">

うまく行かなかったら http://bugreport.apple.com にバグレポートを。そのための開発者プレビューです。


## Asset Catalogsを使う

<img width="634" alt="スクリーンショット 2016-12-01 11.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/ac719a4d-9ede-2238-4f33-503f95748ec8.png">
まだアセットカタログを使っていない人は使いましょう。

<img width="635" alt="スクリーンショット 2016-12-01 11.17.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/b9496187-de6c-28f5-3129-cf9ef073c092.png">

マイグレーション機能もXcodeに用意されています。

Slicing機能を使って画像をリサイズしましょう。pdfで複数サイズに1つのファイルで対応しましょう。

<img width="846" alt="スクリーンショット 2016-11-30 22.14.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/b84e4d13-d0c9-fc94-8465-685557352422.png">

そのほかにも特定サイズだけ別の画像に変更したり、柔軟に対応が可能です。

## Dependency Injectionを取り入れよう

2016年、iOS界隈で話題になったDIをAppleも取り上げていました。

まず「キャストしてアクセスして取得するのが簡単だからと言ってAppDelegateにいろいろ持たせてアクセスするのはやめましょう」ということが語られていました。
<img width="850" alt="スクリーンショット 2016-12-01 22.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/110bea88-c1de-fdfa-0590-0da9d7a1ef9f.png">

身に覚えがあるような...。

<img width="847" alt="スクリーンショット 2016-12-01 22.33.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/546bae4d-84da-b9c6-a808-554feda97f96.png">

AppDelegateとViewControllerを疎結合にし、

<img width="849" alt="スクリーンショット 2016-12-01 22.33.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/b9d5b9de-e58e-2a9c-17b9-911c358e203d.png">

必要なデータを渡し、ViewController同士も互いに参照しないように。

このセッションだと狭い用途のDIしか説明されていなかった印象です。


[iOSアプリの設計とDependency Injection](https://speakerdeck.com/yonekawa/iosapurifalseshe-ji-todependency-injection)というスライドがDI Containerなどについてもわかりやすく解説されていておすすめです。

## 他のプラットフォームへの対応

Apple Watch、Apple TVに対応しましょう。

<img width="635" alt="スクリーンショット 2016-12-01 11.43.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/257ee9fd-a28b-76d5-205b-5b31989f1f97.png">

Human Interface Guidelineに目を通してプラットフォームにあったデザインをしましょう。モデル層を他のプラットフォームに切り出せるような設計にしましょう、ということが述べられています。

## まとめ

(いくつかのポジショントークを除くと)実践的な内容が多かったです。特にアセットカタログでできる多くのことは開発時の負担を大幅に軽減させてくれるものです。

上司や周りを説得する際に、「Appleが提唱しているのでベストなんです」とか言ってみると良いかもしれません。