わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

iOSの開発情報の、収集と更新および追従

今回の講義の内容

11月の6回の講座で、iOSの教科書)を使い、Xcodeの使い方、Objective-Cの文法とメモリ管理、Model-View-Controllerモデル、シングルトンを学び、カウンタアプリを作り、それに機能を追加していきました。

アプリ開発は、この作業の繰り返しです。あとは、フレームワークごとの知識を身につけていきます。フレームワークは、アプリ開発に必要となる機能、カメラや加速度センサーなど、の利用に必要なライブラリとヘッダファイルをアーカイブしたものです。

今回は、Xcodeでフレームワークの概要およびコーディングのための必要な情報の入手方法を紹介します。つぎに、Appleが公開しているiOSのCoreImageの動画を見ます。動画は、要所要所で日本語で解説を、またはまりやすい点を述べます。

ホワイトボード

フレームワークの情報の入手

フレームワークは、リンクするライブラリファイルとヘッダファイルを1つにアーカイブしたもので、カメラやグラフィック描画、あるいはソーシャルネットワーク利用など、アプリ開発に必要な機能を1つのかたまりにして、提供しています。

iOSアプリ開発である機能が必要になれば、その機能を提供するフレームワークを使います。そのフレームワークについての情報は、Appleが公開する1次資料、そして書籍やブログなどの、2次、3次資料から得られます。

自分が必要な情報は何か?

情報を入手するときは、どの立場にあるかで、求めるものが違います。独断で区分してみると:

  • 開発者(ネイティブ・アプリ、ウェブ・サイト、ウェブ・アプリ)
    • 機能するコードを書くことが必要です。WWDCの動画、およびプログラミング・ガイドの熟読と、実際のコードを書くために、サンプルコードの読み込みとクラスの詳細説明の理解が必要です。
  • 開発指揮
    • 開発者に適切に仕事を振り分けて、その実装内容を指示するために、そのフレームワークで何ができるか、どの程度の処理能力が実現できるかを把握している必要があります。
  • 企画立案
    • iOSでその機能が実現可能か、またアルゴリズムの実装難易度や要求速度を満たせるかを判断できるほうが、あとで実装できないなどのトラブルを回避できるでしょう。そのためには、その機能が不可能なものか、頑張ればできるのか、あるいはAppleのサンプルコードを使える容易なものかの、自分たちにとっての開発難易度を推測するための知識が必要です。

Apple社の出している1次資料だけでも膨大です。全てに目を通すのは、一人では、無理でしょう。役割や利用目的に合わせた、必要な分の情報を得ましょう。

iOSは毎年機能が更新されて、去年までの知識を更新しないといけないことも、よくあります。”What’s new~”のような更新情報は、目を通しておきます。

英語は必要です

Appleの1次情報は英語です。もしも1次資料を読めなければ、日本語に翻訳された情報、または解説記事などの2次資料を待つほか、ありません。

1次資料からそれら2次資料が作られるまで、半年単位の時間がかかります。そのiOSが公開前ならば、Appleと開発者間に秘密保持契約(NDA)があるので、一般に公開されることはありません。英語ができない=新機能を半年から1年知ることはできない、です。

プレゼンテーションの動画と資料から、内容を理解することが必要です。ここで、動画の英語を一句一文字すべて聞き取れる必要はありません。また、動画を止めては辞書を引いてもいいですし、なにかの自動字幕生成や翻訳ソフト、あるいは翻訳者を雇ってもよいでしょう。英語が得意な開発者を中心にして勉強会を開催するのも、よい方法です。

内容を理解する、ことができればよいのです。適切な手段を工夫してください。

概要から詳細に進みましょう

iOSの機能や開発方法を俯瞰できる資料は、WWDCの動画です。プログラミングの詳細情報は、フレームワークそれぞれのプログラミング・ガイドとクラス詳細の文書です。まず、全体を俯瞰して、そして開発者でコーディングが必要ならば、次に、文書を読み進めましょう。

WWDCの動画

iOS開発者プログラムに参加していれば、WWDCの動画を[Development Videos APple Developer]から入手できます。次の3つのコースがあります:

  • WWDC2010
  • WWDC2011
  • WWDC2012
  • iOS Videos

2010年から2012年まで3年間のすべてのWWDCの動画が公開されています。iOSは変化しつづけています。そのために、あるフレームワークの現在を知るのに、どの年のプレゼンテーションを見ればよいか、初めてでは分かりにくいです。そのときは、iOS Videosを見てください。現在のiOSアプリ開発に使える動画が、掲載されています。フレームワークごとの“最新”情報は、それぞれの年のWWDCの動画から、探してください。

WWDCの動画入手は、[Development Videos APple Developer]のそれぞれの年から、”iTunesで開く”のリンクを開けば、iTunesからダウンロードできます。オンラインでも見られますが、ネットワークが切断する、あるいは閉じると、動画を見ていた位置が失われて最初から再生されるので、不便です。ダウンロードするのが、おすすめです。

iTunesでダウンロードしたすべての動画を保存するには、端末の容量が不足するときは、見たいコンテンツを選択して同期します。

WWDC2012のサンプルコードは、ページ左カラムのリンクから入手できます。WWDC2011のサンプルコードは、項目を開くと、動画やプレゼンテーション資料とともに、サンプルコードへのリンクがあります。WWDC2010のサンプルコードは、このページから入手はできません。WWDC2011以前のサンプルコードは、Xcodeのドキュメントで表示されるサンプルに、登録されている、っぽい、です。

動画のジャンル

ジャンルは、以下4つです。見たままです。

Essentialは、基本的な事柄についてのプレゼンテーションがまとまっています。少なくともタイトルをチェックして、必要だと思ったものはチェックします。

開発ツールはXcodeの効率的な使い方や、Instrumentsの新機能など、開発ツール紹介です。開発者のうち誰が一人が見て、まとめ情報を共有すれば、よいでしょう。

Core OSは、低レベルなライブラリの説明です。ネットワークや音や動画像処理などが紹介されています。

Internet&Webは、ウェブアプリやウェブサイトについて、またHTTP Streamingの動画配信などが紹介されています。

  • Essential
  • Developer Tools
  • Core OS
  • Internet&Web

CoreImage

iOS Dev Videoを見てみる。動画: Using Core Image on iOS

CoreImageは、画処理のフィルタを提供するライブラリである。iPhotoができることを提供していると思えばよい。カメラからの動画のリアルタイム処理、ファイルやUIの画像の処理に使える。

ドキュメント:

サンプルコード

入出力

入力:

  • ファイル (ドキュメントフォルダのファイル、アプリにバンドルされた画像リソース)
  • バイナリ・データ(NSData *)
  • ライブ・カメラ

出力:

  • CGImageRef (UIImageに変換、写真ライブラリに保存)
  • EAGLContext (OpenGLのテクスチャ)
  • CVPixelBufferRef (CoreVideoのフレーム)
  • void* (任意のバイト配列)

メモ

基本のクラスとその働きは、CIImageが入出力、CIFilterがフィルタ、CIContextがレンダリングの設定とその実行を行うクラス。

iPhotoにある基本的な画像処理ができる。さらに高度な処理がある。1つは、顔検出(顔の位置、鼻や目の位置、そして顔の回転向きと回転角度)。また、デジタルカメラによくある、赤目修正、肌色修正、逆光補正などを実現するフィルタを自動構築する仕組みがある。

画像のorientation。iOSの画像の回転は、画像データ自体を操作しない。画像の向きを表す、メタデータで、設定している。そのため、画像処理にそのorientationのメタデータを渡していないと、特に画像の向きが結果に直接影響する、顔検出で想定した動作をしない。

CIImageとCIContextはimmutable。スレッド間で安全に利用できるCIFilterはmutable。スレッド間での同時利用はできない。

CIFilterの入出力を接続して、必要な画処理をするフィルタを構築する。使えるフィルタは、iOSでは48種類。ユーザがフィルタを実装することは、iOSではできない。

CIImageをUIImageにするには、UIImageクラスに、CIImageからの変換のクラス・メソッド(+ imageWithCIImage: ,+ imageWithCIImage:scale:orientation:)を利用するのがいい UIImage Class Reference

CIFilter。フィルタのインスタンスは、文字列で指定して生成する。フィルタごとにCIFilterを継承したクラスがあるわけではない。

CIFilterそれぞれの、パラメータは、文字列をキーとして、値を指定する。フィルタごとのパラメータ詳細はCore Image Filter Referenceに解説がある。

この文字列で指定するオブジェクト指向っぽくない実装方法は、Coreなんとかでは、ところどころで見られる。よく知らないけど、Obj-Cの文化?

レンダリングはCIContextでおこなう。CIContexのインスタンスは1つを使いまわす。

写真ライブラリへの保存は、レンダリングにCPUを使う。GPUだと、機種ごとにGPUが処理できる最大画像サイズが異なる。またCPUにしておけば、バックグラウンドでの処理ができる。

メモリ管理。CIFiterやCIImageはObjective-CのARCでメモリ管理されている。だが、CGImageRefは、メモリ領域のポインタ。C言語の仕組みで管理されている。なんとかRefとあるのは、たいてい、開発者が開放してやらないといけない。

CGImageRefは開発者自身が開放してやらないといけない。もしも開放し忘れていると、メモリがリークして、そのうちにアプリが使えるメモリがなくなり、アプリが落ちる。メモリリークは、あとから見つけるのは手間なので、忘れず開放するように、コードを書くときの習慣づけとするのがよい。