アプリをiOS 7対応する時に知っておきたいことまとめ

[＠himara2](https://twitter.com/himara2) です。[iOS Advent Calendar](http://qiita.com/advent-calendar/2013/ios) の20日目を担当します。
iOS 7対応時に知っておきたい情報をまとめます。

# はじめに

iOS 7が登場から3ヵ月が過ぎ、[普及率が75%を超えるほどiOS 7は浸透しています。](https://developer.apple.com/support/appstore/)
先日にはついにAppleが[「2014/2/1以降に申請するアプリはiOS 7に最適化されている必要がある」](https://developer.apple.com/news/index.php?id=12172013a)とアナウンスしました。

これからアプリのiOS 7対応は必須化していきます。
この記事ではこれからiOS 7対応をする方向けに、新APIやiOS 7対応時に助かるリンク集をまとめてみます。


# 1. 見た目関連のAPI

## Custom Transition

* ViewController間の遷移が簡単にカスタマイズできるようになった
* NavigationController, TabBarController, Modal などの遷移を自作できる
* **UIViewControllerTransitioningDelegate** や **UIViewControllerAnimatedTransitioning** プロトコルを使う
* [PinterestのiOS 7対応](http://blog-assets.pinterest.com/img/other/Transition-Small.gif)で紹介されている以下のようなTransitionが自作できる

* ![:alt](http://blog-assets.pinterest.com/img/other/Transition-Small.gif)

### もっと詳しく

 * [Custom Transitions Using View Controllers | Qiita](http://qiita.com/335g/items/94762b06a66cfb3be6ad)



## TextKit

* テキストの表現をより便利にしてくれるAPI
* これまでCoreTextを使っていた表現を UILabel や UITextView で実装できる
* アンカーテキストの装飾、文字の回り込みなどが指定できる
* ![:alt](http://cdn1.raywenderlich.com/wp-content/uploads/2013/09/ExclusionPath.png)

### もっと詳しく

* [Text Kit Tutorial](http://www.raywenderlich.com/50151/text-kit-tutorial)
* [NSAttributedString と TextKit](http://azu.github.io/slide/OCStudy/2013_November/nsattributedstring.html)


## Motion Effect

* iOS 7らしい視差効果を表現する
* 画面を傾けると奥行きが感じられるアレ
* ホーム画面の他、Safari のタブ切り替えの画面などで使われている

### もっと詳しく

* [魅せるUIの作り方](https://www.slideshare.net/techblogyahoo/5-ios7-workshopmakeupui)


## UIKit Dynamics

* UIKitに物理演算の動きを与えられるAPI
* 重力や張力、密度などを設定でき、バネやぷるぷるした動きを実装可能
* ゲーム用ではない（ゲーム用にはSpriteKitを使えとAppleは言っている）

### もっと詳しく

* [UIKit Dynamics を使用してViewを滑らかに移動する方法](http://www.zero4racer.com/blog/1135)
* [UICollectionView + UIKit Dynamics | objc.io](http://www.objc.io/issue-5/collection-views-and-uidynamics.html)
* [魅せるUIの作り方](https://www.slideshare.net/techblogyahoo/5-ios7-workshopmakeupui)


# 2. ロジック関連のAPI

## Background Fetch

* OSが定期的にバックグラウンドでアプリを起こし、コンテンツ更新等の処理を行ってくれる
* 発火の頻度はOSがユーザーのアプリ使用頻度から学習して適切なタイミングで実施
* SNSやニュースアプリなど、定期的にコンテンツが更新されるアプリで有効

### もっと詳しく

* [iOS 7対応アプリを作るなら知っておきたい「UXを向上させるBackground Fetchの使い方」](https://codeiq.jp/magazine/2013/12/3022/)
* [SmartNewのiOS 7対応](http://developer.smartnews.be/blog/2013/11/11/smartnews-ios-7/)
* [HBFav 2.6、バックグラウンドフェッチによるタイムラインの自動更新](http://d.hatena.ne.jp/naoya/20131209/1386562827)


## Silent Push Notification

* Remote Push Notificationの拡張版
* pushの受け取り時にバックグラウンドでアプリを起こしてコンテンツ更新等の処理を行う
* pushで流す値に `{content-availble: 1}` を指定すればSilent Pushとなる
* メッセージングアプリなど不定期にコンテンツを受け取るアプリで有効

### もっと詳しく

* [iOS7で強化されたRemote Notifications](http://iti.hatenablog.jp/entry/2013/10/29/181607)
* [アプリのバックグラウンド処理 | iOS 7エンジニア勉強会](http://www.slideshare.net/techblogyahoo/3-ios7-workshopmultitask-26997115)


## NSURLSession

* NSURLConnectionにとってかわる通信周りを司るクラス
* セッションの持ち方などが改善している
* バックグラウンドでもファイルのダウンロード・アップロードが可能（ただしWi-Fi only）
* ストレージサービスなど大容量ファイルを扱うアプリで有効

### もっと詳しく

* [iOS 7で一新された通信周り〜NSURLSessionってなに？〜](http://dev.classmethod.jp/references/ios-nsurlsession-1/)
* [NSURLSession Tutorial](http://www.raywenderlich.com/51127/nsurlsession-tutorial)


## Dynamic Type

* 画面に表示する文字サイズを動的に変更するAPI
* 標準の設定アプリでテキストサイズを指定すると全アプリ共通でサイズが変更される
* アプリ側では"Body"や"Headline"などのテキストスタイルを指定する

### もっと詳しく

* [iOSアプリで動的にフォントサイズを変更する「Dynamic Type」新機能の実装法](https://codeiq.jp/magazine/2013/12/3376/)


# 3. その他のAPI

## AVSpeech Synthesizer

* iOS 7から追加されたテキストを音声読み上げしてくれるAPI
* 日本語含む様々な言語で読み上げが可能

#### もっと詳しく

* [iOS 7で追加された音声読み上げ機能(AVSpeech Synthesizer)でiPhoneにお喋りさせる](https://codeiq.jp/magazine/2013/12/3360/)
* [AVSpeechSynthesizer による音声読み上げ](http://www.toyship.org/archives/1483)


# その他

## App Switcherについて

* App Switcherとは、ホームボタンを2回クリックした時に現れる起動中アプリ一覧画面のこと
* アプリの画面が大きく表示されるように変更され、UIが良いほどユーザは帰ってくるとAppleは言っている
* 口座情報などの秘密のデータを扱う場合はモザイクをつけたりもできる
    * [アプリの画面を開いているアプリケーションのプレビュー画面から隠す](http://qiita.com/griffin_stewie/items/0b7c0f750a7eb62b182c)
* ![:alt](http://f.cl.ly/items/1l0H3u3p3B31293F0F0u/appswitcher.png)


## iOS 7対応で発生する問題に対するベストプラクティス

* iOS 6の時と比べてステータスバーの20px領域分ずれてしまう
    * => [「既存のアプリをiOS 7に対応させる」３つのおすすめテクニック](https://codeiq.jp/magazine/2013/11/1580/)
* ステータスバーの色を変えたり消したりしたい
    * => [iOS 7におけるUIStatusBarStyleのベストプラクティス](http://cockscomb.hatenablog.com/entry/2013/11/12/190905)
* バックグラウンドで位置情報が取れない
    * iOS 7からは設定 > バックグラウンドの更新がONじゃないとLocation Services使えません
    * また、AppSwitcherで上スワイプでプロセス切られた場合も使えません


## iOS 7らしい"ぼかし効果"を得たい

* 標準のAPIには実装されていない
* iOS-blurというオープンソースを使う 
    * [iOS-Blur](https://github.com/JagCesar/iOS-blur)
* AppleのサンプルコードからUIImageのカテゴリを抜いてくる
    * [WWDC 2013 のサンプルコード](https://developer.apple.com/downloads/index.action?name=WWDC%202013) > iOS_UIImageEffects > UIImage+ImageEffects


## 既存のバージョンとiOS 7とを両立させる
* 分岐させる方法
    * マクロを使って分岐させる
        * [1行で iOS バージョン判定できる便利マクロ](http://qiita.com/shu223/items/dc1759fc9695cea27756)
    * respondsToSelector を使って分岐させる


# iOS 7から追加されたAPI一覧

* その他の変更についてはこちらをご覧ください。 
    * [What's New in iOS | iOS Developer Library](https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html)