統計情報(30日間)


最新情報をツイート

人気の投稿

【書評】上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編

このエントリーをはてなブックマークに追加

【追加情報】サンプルコードが公開されていました
インプレス・ダウンロードページ



待望の iOS7本が出た。

@hkato193さん・インプレスジャパンより献本。

以下、内容紹介。

Chapter 01 iOS 7の新機能(加藤氏担当)


iOS7 の新機能のウォークスルー。
最初に最も変化の大きかったUIデザインの変更について解説あり。iOS7で重要な3つのデザインテーマについて取り上げている。
・Deference(服従、謙虚)
・Clarity(明確さ)
・Depth(深さ、奥行き)
続いて iOS7で導入された新しい機能・APIの概要。UIKit Dynamicsや TextKitの他、OpenGL ES 3.0対応、音楽データのアプリ間通信などの紹介。Xcode5の新機能にも触れられている。Auto Layout設定の改善やアセットファイルほか。この辺りは既に多くの人が触っているはず。

知っていたようで知らないこともいろいろあってこの章は役に立った。iOS7の開発情報を押さえておくのにいい。


Chapter 02 画面遷移(西方氏担当)


iOS7から導入された新しい画面遷移の仕組みについて。
まず新しく導入されたクラスとプロトコルの解説。
画面コーディネーター
UIViewControllerTransitionContext, UIViewControllerTransitionCoordinator

画面遷移デリゲート
UIViewControllerTransitioningDelegate(モーダル時利用), UINavigationControllerDelegate, UITabBarControllerDelegate

画面遷移コントローラ
UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning, UIPercentDrivenInteractiveTransition

遷移コンテキスト
UIViewControllerContextTransitioning
ほとんどが UIViewControllerが頭についたプロトコル。他に関連で UICollectionViewTransitionLayout など。

メモ)iOS7ではスプリングアニメーション用のメソッドが追加されていてこれを画面遷移でも利用することが可能らしい。
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
リファレンス
ほー。

カスタム画面遷移

続いてカスタム画面遷移の作り方。カスタム遷移を実装するには
(1) アニメーションコントローラ <UIViewControllerAnimatedTransitioning> を作成して

(2) 遷移元のコントローラなどで画面遷移デリゲート <UIViewControllerTransitioningDelegate>を実装し、(1)のインスタンスを返す
画面遷移時には自動的に(1)が呼び出され遷移アニメーションが動き出す。アニメーションの実装はアニメーションコントローラに書く(transitionDuration: & animateTransition:)。

アニメーションは独自に実装する他、表示中のビューのスナップショットを利用することも可能。本では遷移元の画面が自動扉のように左右に開き、下から遷移先の画面が出てくるサンプルが紹介されている。

画面遷移のカスタマイズは西方氏ご自身のホームページでも解説がある。導入としてはこちらの方がわかりやすいかも。
[iOS 7] 簡単にできる画面遷移のカスタマイズ

インタラクティブ画面遷移

インタラクティブ画面遷移はジェスチャーに合わせた画面遷移を指す。ナビゲーションコントローラで画面を左から右へスワイプした時に前画面へ戻れる、あの動作のやつ。

これを実現するには UIViewControllerInteractiveTransitioning に適合するインスタンスを実装する。このプロトコルを実装したクラス UIPercentDrivenInteractiveTransition が iOS7では用意されていて通常はこれをサブクラス化して使うらしい。
UIPercentDrivenInteractiveTransition
これを使うと指で画面をパン(ドラッグ)しながらスライドさせるおなじみの画面遷移が可能になる。本ではジェスチャーによって遷移をコントロールする方法がサンプルコードとして紹介されている。

Collection Viewのレイアウト変更

最後に Collection View のレイアウト変更とナビゲーショコントローラ連動の話。ここはかなり複雑で理解するにはかなり骨が折れるところだが、図とサンプルコードを使って簡潔にうまく説明してくれてる。ここまで実装できるとかなり凝った表現が可能。


Chapter 03 UIKit Dynamics(西方氏担当)


UIKit Dynamics はユーザインターフェイスで現実世界の動き(物理運動)を表現する為のフレームワーク。画面上の動きをよりリアルに質感のあるものとして表現するのを強力にサポートする。iOS7では見た目がフラットデザイン寄りになった一方で、動きはよりリアルにと体感的なフィードバックを重要視しているのがこのAPIを標準で提供するところからもわかる。

Animator, Behavior, Item の3つのレイヤーから構成される。
イメージ
UIDynamicAnimator → id <UIDynamicAnimatorDelegate>
 |
 |--UIDynamicBehavior
 |   |--id <UIDynamicItem>
 |   |--id <UIDynamicItem>
 |   :
 |--UIDynamicBehavior
 |   |--id <UIDynamicItem>
 |   |--id <UIDynamicItem>
 |   :
 :
このうち動きを司るのが UIDynamicBehaivor。標準で様々なサブクラスが用意されている。
UIGravityBehavior 落下運動
UICollisionBehavior 衝突
UISnapBehavior 終了時に振動を伴う
UIPushBehavior 対象物を押す
UIAttachmentBehavior 2つのitem/アンカーポイントを結合(連結)
UIDynamicItemBehavior item設定
本では UIPushBehaviorと UICollisionBehavior の2つ組み合わせて磁石のような動作を表現するサンプルが紹介されている。

後半では、カスタムBehavior によるCollction Viewのレイアウトのサンプルとして、縦に連なるセルが振り子のように揺れるサンプルコードが解説されている。UIKit Dynamics が UICollectionView と連携できるとは眼から鱗。いいアイディアですね。また UIKit Dynamics を利用した画面遷移として、UIGravityBehavior, UICollisionBehavior, UIAttachmentBehavior の3つを組み合わせて画面が下へ落下しバウンドするようなサンプル解説がある。UIKit Dynamics を使うといろいろな画面遷移が可能になるという好例で面白い。UIKit Dynamics は強力ならがらも構成がシンプルな為に他のビューとの連携がしやすい。それゆえ応用範囲が広くさまざまな場面での利用が期待できそう。UIKit Dynamics を使った人間の感覚に沿ったフィードバックは(確か)Appleも使用を推奨していたので、iOS7以降のユーザインターフェイスの標準要素と考えておいた方が良い気がする。

iOS7のユーザインターフェイスの新しい特徴のうち「静」がフラットデザインなら、「動」が UIKit Dynamics といった感じか。


Chapter 04 Text Kit(西方氏、高丘氏担当)


iOS7から、String Drawingが排除され、新しく TextKitが導入された。またWebKitがUIWebView専用に。
iOS6

iOS7

Text Kit は、従来低レベルAPIである Core Textを直接使わないと実現できなかったテキスト表現を、Objective-CベースのAPIで使いやすく提供したもの。主な機能は次の通り。
フォント :フォント作成、検索、Dynamic Type
表示   :リンク埋め込み、画像埋め込み、テキスト回り込み、リッチテキスト編集
レイアウト:ページング、マルチカラム、テキスト省略のカスタマイズ
デザイン :エフェクト、カーニング、行間、文字間隔指定

フォントと属性付き文字

UIFontDescriptorによるフォント属性情報の管理、Dynamic Typeへの対応方法など。Dynamic Type では文字属性を指定するのにフォント名やサイズではなく、スタイル(UIFontTextStyle)で指定することができる。UIFontTextStyleHeadline や UIFontTextSytleBody, UIFontTextStyleCaption1 など HTMLのタグ指定に似ている。スタイルを利用することで Dynamic Type による実行時のフォントサイズ変更にきめ細かく対応することが可能になる(例えば本文だけ文字サイズを変更するなど)。

各種情報検出、画像の埋め込み

従来から提供されていた UIDataDetectorTypeで定義されている各種情報(リンク、電話番号や住所、カレンダーイベントなど)の検出機能が強化され、文字属性を変更したりタップされた時の処理をカスタマイズできるようになった。NSAttributedString内に画像を埋め込むこともできるようになったらしい。

高度なテキスト表現

後半は Text Kit を構成するコアクラス(NSTextContainer, NSLayoutManager, NSTextStorage)についての解説と、さまざまなレイアウト方法について解説されている。exclusionPaths を使うとテキストの回り込みも可能になる。こんなやつ↓
そのほか NSTextContainerを使ったマルチカラムレイアウトなど。
最後に NSTextStorageのサブクラス化による文字属性の動的変更(例えばキー入力中に色を変えるとか)の紹介。こんなことまで簡単にできるのか。

iOS7はコンテンツが主役と言われてるだけに、その主要情報であるテキスト表現APIも従来に比べると格段に良くなっている。今後 Text Kitを活用したリッチなテキスト表現が当たり前になるということか。

(参考)[iOS7] Text Kit チュートリアル

※画像は下記から引用
Text Kit Tutorial


Chapter 05 マルチタスキング・通信(藤川氏、鈴木氏)


iOS7アプリ開発者向けの裏の(?)目玉機能であるマルチタスキング・通信周りの強化についての解説。
Background Fetch
NSURLSession
Multipeer Connectivity
サイレントプッシュ通知

Background Fetch

Background Fetch自体はシンプルな仕組み。必要な手順は多くない。
・Info.plistでの宣言
・Fetch Intervalの指定
・Fetch処理の実装(UIApplicationDelegate)
のたった3点。

ただアプリの実行中は様々な状態遷移が発生する為、それぞれの状態における Background Fetchの振る舞いを抑えて置く必要がある。本書では様々な状態における Background Fetchの実行/停止状況や、そのタイミングなどを簡潔に整理してある。Background Fetch プログラミング時には本書を手元においておきたい。

NSURLSession

NSURLSession は、通信セッションと、サーバとのデータ通信(リクエスト/レスポンス)を受け持つタスクから構成される。NSURLSession で扱うことができるセッションは4種類。
1. shared     アプリ内共有セッション
2. default    独自定義セッション
3. ephemeral   一時的セッション(キャッシュやCookie、認証情報を残さない)
4. background  バックグラウンド動作(nsnetworkdに委任)
通常は用意されたファクトリクラスメソッドでセッションを取得して使いまわす。このセッションを元に実際のデータ通信を行うタスクを紐付けて実行させる。

タスクは3種類
1. NSURLSessionDataTask RESTやAPIコールなど
2. NSURLSessionUploadTask   ファイルダウンロード
3. NSURLSessionDownloadTask ファイルアップロード
いずれも NSURLSession に生成メソッドが用意されている。
(例)
NSURLSessionDataTask* task =
    [[NSURLSession sharedSession] dataTaskWithRequest:request
                                    completionHandler:^(NSData* data, NSURLResponse *response, NSError* erro) {
                                         :
    }];

[task resume];   // タスク実行
・NSURLSessionDataTask はオンメモリで軽量
・NSURLSessionUploadTask と NSURLSessionDownloadTask はファイルを介したデータ渡し
・タスクのコールバックは Delegate/Blocksから選択可能。
・バックグラウンド処理や、プログレスバーや認証リダイレクト等細かい対応を行いたい場合は Delegateを利用する。
本章では5つの delegateメソッドについてそれぞれサンプルが解説されている。
後半はファイルアップロードとダウンロードの具体例や nsnetworkdでのダウンロード継続についての解説など。あとセッション定義に認証。Fetchno連携や分割実行など、時間がかかる処理への具体的な対策などのノウハウが書かれてる。こういうのは地味に役立つ。

Multipeer Connectivity

同時に8台までのiOSデバイス同士間での通信を可能にするフレームワーク。基本要素は4つ。
ServiceAdvertiser サービス利用可能を広報
Browser 接続相手を探す
Session 接続セッション
PeerID  エンドポイント識別子
それぞれを表すクラスが提供されている(MCで始まるクラス群)。

通信にあたっては最初に MCAdvertiserAssistantのインスタンスを作成して、他デバイスに対して開始可能を通知する。自分のデバイスは MCPeerIDで表す。相手のデバイスから接続要求が来ると MCAdvertiserAssistantDelegate が呼び出される。この中のメソッドで要求への反応を行う。相手先を探す目的で簡易的なユーザインターフェイスが標準で用意されている。MCBrowserViewControllerというやつ。これを組み込むだけで候補端末のリストを簡単に表示できる。セッションが確立できたら MCSessionを使ってデータを送信する。受信は MCSessionDelegateで受ける。サンプルソースではストリームデータの送受信についても解説されている。なお MCAdvertiserAssistant の代わりに MCNearbyServiceAdvertiser を使うと自動接続も可能。これはユーザの利便性を上げるのに役立ちそう。

サイレントプッシュ通知

サイレントプッシュ通知の前提となるプッシュ通知の説明から始まり、Goole App Engine を使ったプッシュ通知の実装の具体例を解説。最後にサイレントプッシュ。どちらかというとプッシュ解説がメインになってましたね。


Chapter 06 Sprite Kit(高丘氏、加藤氏)


Sprite Kit の基本として、Xcode付属のテンプレート("SpriteKit Game")のソースコードを解説。押さえるべきキーワードとしては
・シーン(ゲーム画面)
・ノード(シーン上のオブジェクト)
・アクション/トランジション(ノード動作)
その他注意点としては座標系が UIKitと異なりY軸の正方向が上になっている(↑→)。UIKitは↓→

ノードの種類

SKSpriteNode :スプライト(画像)
SKLabelNode :文字表示
SKEmitterNode:パーティクル(爆発・花火)
SKShapeNode :パス表示
SKCropNode  :マスク
SKEffectNode :Core Image フィルタ
SKVideoNode  :ビデオ
おー、Core Imageにビデオまであるのか。
それぞれのノードについてサンプル付きで丁寧に解説されている。Xcode5ではパーティクルエディタが用意されていてパラメータ設定の結果をリアルタイムに視覚確認できるらしい。

アクション

最初にシーン内のノード管理方法についての解説。シーン内のノード検索にはノード名を条件として * や [ ] といったワイルドカードの利用も可能。検索でみかったノードに対して順に処理を適用することもできる。
アクションは SKActionで定義する。使い方は、移動や回転、拡大縮小といった機能毎に SKActionのインスタンスを作り、それをノードへ適用する。複数の SKAction をグルーピングする事もできる(SKActionは複数の子SKActionをぶら下げられる)。

(例)
SKAction *actionRotate = [SKAction rotateByAngle:M_PI*6 duration:1];
SKAction *actionMove = [SKAction moveTo:CGPointMake(300, 300) duration:1];
SKAction *spinMove = [SKAction group:@[actionMove, actionRotate];
[node runAction:spinMove]

SKTransitionを使うとトランジションによるシーン切替も可能。章の最後には物理計算エンジンにも言及。この辺りは2ページの割り当てしか無く、物足り無い(でもいずれSpritKit本が出る予感も...)。


Chapter 07 拡張機能(鈴木氏、西方氏担当)


この章ではその他のiOS7でのトピックを取り扱っている。

Core Data, Keychain の iCloud共有

Core Dataの基礎から始まり、iCloudとの連携が解説されている。iCloud へのデータ変更、データ読み込み、iCloudからの変更反映など。後半は iCloud Keychainに関して。知らなかったが APIからもこれ使えるのか(というかデバイスの[iCloud]設定でキーチェーンをオンにするだけで同期とのこと。)。

Core Bluetooth

セントラルとペリフェラルの解説から始まり、ペリフェラルの接続→セントラルの接続→データ送信→データ要求→データ送信とコンボで詳細な解説。1つの独立した章にできそう。最後にバックグラウンド時の注意点にも触れられている。

Map Kit / Core Loaction

新しい 3Dビューで利用可能なマップカメラ(MKMapCamera)、MKOverlayView(Deprecated)の代わりに用意された MKOverlayRendererなど。iOS7からは MKDirections を使って経路検索がAPIから可能なった。MKDirectionsRequestに出発点・目的地、時刻や移動方法などを設定して問い合わせると、非同期で経路結果がMKDirectionsResponseとして帰ってくる。結果に含まれる MKPolyline と MKOverlayRenderを組み合わせると地図上に経路を描くことも可能。経路を地図上に描くサンプルが紹介されている。その他、CLBeaconの紹介、サンプルなど(発信、検出)。

Core Motion

「モーション検出はシステムにより常に実行されており、過去7日間分のデータを蓄積している」
この情報は CMMotionActivityManager と CMMotionActivity を使って取得することができる。アクティビティの状態変化をリアルタイムに通知を受け取れることもできる。状態の種類は CMMotionActivityのプロパティで取得可能。
unknown
walking
running
automotive
stationary
その他、CMStepCounterで歩数計測の利用可能。

UIKeyCommand

UIKeyCommand を使うと外付けのキーボードの修飾キーのハンドリングが可能。あらかじめ扱いたいキーコンビネーションのパターンをUIKeyCommandで定義しておき(複数可)、それを UITextFieldや UITextView、UIViewControllerの新しいプロパティ keyCommands<NSArray>にセットするだけ。目的のキーコンビネーションが押されるとあらかじめUIKeyCommandに定義しておいたaction(@selector)が呼び出される。使う上ではいろいろと癖があるようで本章には細かい注意点が上げられている。利用する際は参考になる。


Appendix(加藤氏、高丘氏担当)


最後の補遺では各章に収まらなかったいくつかの変更点に関して取り上げられている。重要なTipsもあるのでここもチェックしておくといい。

・各種アイコンサイズ・形状の変化(デバイス x OSバージョン毎のアイコンサイズ表)
・ビューの前後方向への重なり #バージョンアップ困った問題トップのあれです
・ステータスバー表示/非表示の管理単位 #同上
・UIAlertViewへのサブビュー追加が無効化 #これは知らなかった。多分セキュリティ上の理由か
・バックグラウンドタスク持続時間の大幅短縮10分→3分 #なんと!
・64bit化(対応デバイス、注意点〜データ型サイズの違い、他注意点など)
・Apple LLVMコンパイラとiOS7 SDK(llvm-gcc除外、モジュールの導入→(参考)Objective-C に Modules がやってきた!、Auto Vectorization、静的アナライザの機能強化、などなど)
・ゲームコントローラ


- - - - - - - - - - - - - - - - - - - - - - - -
書評というよりまとめになってしまった。ただそのおかげでひと通り内容に目を通すことができた。iOS7 SDKはやっぱり面白い。
上で紹介したようにiOS7関連の技術情報が広く網羅されているので系統的に新機能を知るには現時点でベストな書籍といえる。iOS7のAPIをフル活用したい方には是非お勧めの書籍。新鮮なうちにどうぞ。




Leave a Reply