iOS開発で苦労した点を振り返る

3月からずっとプログラミングを担当していたiOS向けアプリが本日ようやくAppStoreに申請完了しました。Xcode、Objective-Cはもとより、ポインタとかオブジェクト指向プログラミング自体が初めてで本当につまづきまくりでしたが、ホッと一息です。まぁ、まだ審査という大きな壁があるわけですが、とりあえず時間は少し余裕ができるのでこちらのブログもぼちぼち再開していきたいと。

さてまずは表題。PHP、VB.NETあたりはちょいちょいやってきた(だがOOP的なことはほとんどしたことがない)視点から。慣れてしまった今とはってはそれなりによくできてると思うし、何故当初そんなにつまづいたかも徐々に忘れつつあるのですが、なんとか思い出せる範囲で書き留めておこうと思います。同じようなところでつまづいてる人の参考になれば。あと今回教えてもらった人にも「何がわからんのかわからん」と言われたので、そんな指導する側の人にも初学者の陥りがちな(?)勘違いを知らしめる意味で、恥を晒しておきます。

・宣言ファイル.hと実装ファイル.m

初心者はまずここから躓きますw。新しいクラスhogeを作ると、hoge.h、hoge.m(そしてViewControllerの場合はさらに.xibも)というファイルができます。VB脳からするとなんぞこれ?ですよね。実際のところ宣言と実装という言葉でほとんど説明できてしまってるんですが、最初はとにかく情報量が多すぎるのでこれだけでもビビります。VB的に実際のコードを書くのが実装ファイル(.m)ですね。じゃぁ.hは何かというと、そのオブジェクトが内包しているプロパティオブジェクトやメソッドの一覧が記された設計仕様書という感じ。他のクラスから利用する場合にこの.hファイルをimportしといてやると、そのクラスがもっていないメソッドを呼ぼうとした時にXcodeがそいつはそんなメソッド知らんってよ?と警告してくれます。まぁ、実際には.m側を精査すれば同じ内容は得られるんでしょうし、むしろ.mではちゃんと実装してるのに.hに書いてないからエラーになるなんて本末転倒なこともあったりするんですが、作業面でもまず.hに「こんなメソッド作るぞ-」とかToDo的に書いておけば、未実装の分はやはり警告が出るので便利っちゃ便利です。

・Interface Builder

これも慣れてしまうとどうってことないんですが、Objective-C自体がよくわかってない状態ではハマりました。Interface Builder(以下IB)で配置したボタンなどのオブジェクトを、そっくりコードの上でも宣言して、それを紐づけてやらないといけない、というのはVBにはなかったので。しかもIBAction(GUI部品から操作イベントを受け取るメソッド)とIBOutlet(コードから部品に表示を反映させる先)の双方向を別々にとか。でその方法がCtrl+ドラッグだったりと、あんまし直感的じゃなかったり。なんでもインスペクタからするVB的感覚とだいぶ違いますね。勢い解説書でもひたすら手順を説明するに留まって、読んでる方はすごく「やらされ感」が募ります。D&D操作って静止画のみの書籍での解説とは相性悪いのもあるんでしょうかね。

ただ慣れたせいかもですが、途中で導入したXcode4になってから随分やりやすくなった気がします。前バージョンだとIBは独立アプリという感じで、コードを保存しないでウインドウだけ移っても反映されてない、とか色々不便でしたし。ちょっといじってみようという人には有料になっちゃいますが、これから入門するならXcode4オススメです(一気にDeveloper Programにお布施しちゃうぞー、って人はタダです)。

個人的理解度がいまだにあやしいのはMainWindows.xibの扱いですね。まぁ、各種テンプレートを使ってプロジェクトを作った場合はほとんど触ることなさそうですが。

・delegate

これは悩みました。ググればなんなのかはいくらでも記述があるんですが、どう嬉しいのか、どういう場面で使うべきかがいまいちピンとこない。当初、親ビューなどスコープの届かない別オブジェクト(例えば大元のAppDelegate.m)の中のプロパティに上手くアクセスすることができず、仕方ないのでメソッド自体をその別オブジェクト側に移してそこで処理する為のものだと思って利用してました。だって一番最初のクラスの名前についてるしw。グローバル変数的なプロパティとそれにアクセスするメソッドを全部集めるべきか、とかw。

だが先輩プログラマ(同級生だけど)にそうではないと教わりました(hogeAppDelegate内のプロパティにアクセスする簡単な方法も教わった)。標準のクラスとはちょっとだけ違う振る舞いをするオブジェクトが欲しい時に、次々にカスタムオブジェクトを作っていくと大変(.h/.mペアがどんどん増える)なので、それをまとめて1つの.h/.mで処理するって感じですね。特にUIButton等のGUIパーツをIB上で配置すると本来は.hや.mはいらない訳ですが、そこに1つだけ特殊なことするメソッドが欲しい、なんて時に、そのボタンのdelegate(代行)先を親ビューであるViewController.mにして、そこにメソッドを書く、なんてことをします。うん、今ならこれがないと大変だということがわかる。特にUITableViewはOS側から呼ばれるイベントハンドラが多い(総行数の問い合わせとか)ので、それを実際のデータをもってるオブジェクトに“転送”したりするのに使いまくりでした。うん、イベントハンドラの転送、と考えるとしっくり来る。

・ポインタ

十数年間もσ(^^)が各プラットフォームでネイティブアプリを書く障壁となってきたポインタは、Objective-Cでは思ってたほど意識する必要なかったみたいです。宣言する時に、オブジェクトかどうか見極めて*をつけるかどうか判断する位。INTやBOOLでは不要だけど、文字列(NSString)はオブジェクトだからつけないとダメとか。プロパティやメソッドの引数を宣言するところ以外では*つけなくてもいいので、普段はあんまり意識しなかったです。

ただ高速列挙という、ある配列内のオブジェクトを順に取り出して順に処理していく方法の中で、一次変数オブジェクト作ってそれを取り出して変更を加えた後、元変数に書き戻さないといけないと思ってましたが、実際には取り出してなくてポインタをコピーしてただけなので書き戻し操作は不要だった、なんてことがありしました。

あと開発後半でリーク対策をしようという段になって、ちゃんと理解してないとダメだなと思いました。変数の感覚でポンポン“代入”をしてると、Leakテストした時にビックリしますw。

でもまぁとりあえず始めるにあたっては他のC系言語ほど怖がらなくてもヨサゲ、ってことだけは言えます(って他のC系言語実際に挑戦すらしてないけど)。

・@propertyと@synthesize

この辺も訳わか
らないウチは、なんで同じ様な宣言をあちこちで何度もやらされるんだろう?と混乱しますね。.hファイルの中でプロパティを宣言した上で、同じファイルのすぐ下で@propertyで繰り返し宣言をし、さらに.mで@synthesizeですよ。これらは主にクラス外からプロパティにアクセスする時に必要なもので、@propertyはそのヘッダーファイルをimportした他クラスに対して、自分はこんな“プロパティ”を外部に公開してるよー、と知らしめる為で、クラス内部でしかアクセスしないならなくてもいい。また@synthesizeは.mファイル側で実際にset/getするメソッドを自動で“シンセサイズ”(生成)するためのもの。@synthesize hoge;とするだけなので超簡単ですが、これを使わずに自前でメソッドを作ってもいいので、やっぱりプログラマが任意で書かなきゃダメって訳です。似てるんだけどそれぞれ役割が違う。

 

とまぁこの辺がちょっと壁だったような気がします。というかまだ間違ってるかも知れないので、そこは皆さん追々ちゃんと調べて勉強していって下さい(^^;)。とりあえずこんな感じで理解したら少し前に進めた気がする、ってことで。

Appleの開発者登録手続きが清々しいまでにヒドい件

iOSプログラミングに慣れてきて当然実機で動かしてみたくなります。早速有償のiOS Developer Programに登録申請してみました。

がこのフローがヒドい。友人からの事前情報で、Apple IDに日本語が含まれているとアクティベーションにコケて、メールで修正依頼をしたりして長いこと待たされることがわかってたので、色々ググってみました。要約すると、

  • Apple IDの登録情報に2バイト文字があるとアクティベーションに失敗する
  • 逆にすべて英語だと日本のApple Storeでの決済手続きがエラーになる

もうこれだけでもヒドい話です。どうしてこんな簡単な問題が何年も放置されてるんでしょうね?

なんとか問い合わせ手続きしなくて済むようにと、先人達の記録を参考に、開発専用の新規Apple IDを取得してすべて英語で記入するところから始めてみました。開発者申請のページから新規にApple IDを登録するとこから始める選択肢があるのでそれを使います。メール認証をして登録完了。続けて有償ライセンスの購入に進むと、カートにライセンスが入った状態で日本のApple Store画面にリダイレクトされます。そのまま決済に進むと、名前や住所を日本語で入れ直すよう促されます。これで無事決済は完了。午前零時前後に手続きしたところ、数時間後の翌朝6時半くらいにアクティベーションコードがメールで届きました。

が、結局お約束のエラー!

新しくApple IDとった意味なし。愚痴をたれつつも、エラー画面内の「Contact Us」というリンクから行ける問い合わせフォームで連絡。こちらからアクションを起こさない限り向こうはなにもしてくれないそうなので。で、最短で手続きが進む様に、あらかじめネットで調べて必要事項(Apple Storeの注文履歴画面から、

  1. 『ご請求、ご連絡先』
  2. 注文番号 (W+数字8桁)

をコピペ。またメールにあったEnrollment IDも添えて送信したのが朝9時。返事が来たのが午後2時過ぎ(日本語)。あろうことか、上記の情報を知らせろと書いてきています。だからコピペしたでしょ?とメールに添付されたフォーム記入文面を見る。なんと、

2バイト文字が全て抜け落ちてます。

コピペした「We are unable to activate」というエラーメッセージ、住所の中の部屋番号と番地と郵便番号、注文番号、Enrollment IDという英数字のみの意味不明な送信文です。おそらくエラーメッセージから問い合わせ内容を類推して返信してきてるんでしょう。

日本語入れると全部抜かれて送られるフォームなんてナナメ上過ぎ。

これまた知人から「Appleは開発者に優しくない会社」と聞いてましたが、確かにその通りかも。あるいは非1バイト文字圏軽視しすぎ。

 

結論としては、「一発申請は不可能。あれこれ悩むより余裕もって申請して、さっさとエラー出してContact Usから連絡。RegionにJapanを選択し、上記エラーメッセージさえ貼り付けておけば用件は通る。日本語は書いても無駄。詳細はその後のメールへの返信で記入」ってとこですかね。もしかするとContact Usフォームに請求、連絡先情報を英語表記にして貼ればいいのかも知れませんが、たぶんApple Storeの表示とマッチしないとNG食らう気がします。

iOS開発修行中に参考になった本を紹介

■木下誠 「たのしいCocoaプログラミング」

iPhoneのSDKが一般公開された頃から、自分でアプリ作ってみたいと思ってMac miniまで買いそろえたりしていたものの、昔から「C」と名のつく言語(というかポインタ?)が苦手だし、オブジェクト指向も概念はわかるもののいまいちとっつきにくくて、長らく放置していました。

が、MacBook Airを買ったり、ちょっと仕事絡みで相談を受けたりを機にようやく重い腰をあげてみたのがこの年末年始。でもやっぱりObjective-CもXcodeも敷居が高くてTwitterでプログラマの友人達に助言を請うたりしつつ、1月は本当に頭を悩ませていました。本を何冊も買っては、説明がスッキリしなかったりサンプルのビルドが通らなかったりで投げ出したりの繰り返し。

そんな中で急速にObjective-CやXcodeに関する理解が進んだ感があったのが、木下誠氏の「たのしいCocoaプログラミング」でした。この本は正確にはiOS開発について触れた書籍ではなく、MacOSXに関するものです。ただObjective-CやXcodeに関しては共通事項もおおいということで、随分前にTiger版を買ってあったのを手にとってパラパラと読み返してみたところ、その前に何冊か読んでいてイマイチすっきりしてなかったところが急激に納得いくようになりました。Xcode 2.xと現行の3.xでは随分作法もかわっているということなので改訂されたLeopard版を速攻で注文。

以前友人向けにVB.NETで作った簡単なWindowsアプリをOSXにさっくり移植できてしまいました。最初からこれ一冊で足りたかどうかは定かではありませんが、断片的だった知識をこの本が再構成してくれた感は高いです。特に他の書籍ではXcodeやInterface Builder上での操作が手順でしか示されていなかったのに対し、この本ではその意味についても触れてくれていたのが大きいような気がします。.hファイルと.mファイルがペアで1つのクラスを表している、といった極基本的な事も、この本でようやく気付いたというレベル(他の本は.hにこう書け、.mにこう書け、ほら動いたでしょ、というノリ)。Objective-Cについても、例えばimport文で宣言ファイルを指定するのに、<>で括るのと””で括る意味の違いまで触れていたのはこの本が初めてでした。そういうレベルの入門者には、(iOS開発を目的とした場合やや遠回りに思えるかも知れませんが)一読の価値があると思います。

■所友太「iPhoneプログラミング UIKit詳細リファレンス」

続けて重宝したのがこちら。「たのしい~」でObjective-CとXcodeの雰囲気がつかめたので、あとはiOS特有の部分を差分的に読めればいいやってことで。iOS 3.x世代の解説本ですが、入門レベルの要素は網羅されているので支障はない気がします。まぁ、もしかするとiOS4.xなら同じことをより簡単にできるようになったりはしてるかも知れませんが。

この本を参考にして、相談を受けた極簡単なアプリのデモ版を完成させることができました。データ保存もネット通信もしないごくごくプリミティブなアプリですが、何冊も投げてきたσ(^^)としては、格段の進歩という気がしています。詳しい人にソースを見せると、とてもオブジェクト指向的とは言えないような作りかも知れませんが、それは今までのVB.NETで作ってきたツールも同じだしw。

「あとは本でもネットでも公式リファレンスでも見ながら猿真似していけば(σ(^^)個人が作る規模のアプリなら)なんとかなるんじゃないか?」という気がVB並にしてきたのは(錯覚だったとしても)大きい。あとはそのドキュメントがVBに比べるとやはり少ないのが難点ですね。

■てことで逆引き本2冊

というワケで、やりたいことがサクっと調べられるよう、いわゆる逆引き本をObjective-CとiOSで1冊ずつ買って見ました。これらはまだ活用には至ってないので、(「原則として自分で使ってみたものをレビューする」という本ブログの主旨には反しますが)紹介まで。

1冊目はObjective-Cという言語に関するもの。「文字列を文字列で分割する」とかそういうレベルの調べもの用。おそらく現時点で日本語で読める逆引き本としては唯一なんじゃないかと。先日立ち寄った書店でも2010年のプログラミング関連書籍ランキングで3位になってました。

もう1冊はiOS特化の方で、「アプリ内から写真撮影をするには」とかいったAPIレベルのノウハウが数多く収録されているようです。世代的にもiOS4.x対応なので心強いです。

 

当面この後マスターしたいのはテーブルビュー(リスト画面)とCoreData(データの保存関係)ですね(フルグラフィックなアプリを作ることはないだろうし)。それを習得できれば簡単な実用アプリは書けるようになる気がします。なんか手頃なお題を物色中。

iOS対応高機能MP4を簡単に作るdgMP4Muxer完成

世間は三連休だったようですが、σ(^^)的には発生イベント皆無だったので、家に籠もって手持ちソフトをこないだ習得した方法でiOS対応MP4にしこしことエンコードしていました。

で、さすがにDOS窓でコマンドを手打ちするのに嫌気がさし、フロントエンドGUIツールdgMP4Muxerを作成、公開してみました。

画面写真

例によって我が家のローカルルールに特化した部分があるのであまり汎用性はないかも知れませんが、逆にそのルール(素材ファイルの命名規則)に従っておけば、簡単確実にiOS(iPhoneやiPad)で認識する音声多重、チャプター入りMP4ファイルが作れます。

mp4boxやmp4chapsに渡すオプションを自由に設定できるようにしてあるので、細かく指定した人にはyambより便利なんじゃないかと思います。

ただ、字幕系についてはほとんど考慮してません。現状でも適当なオプションを書いてやれば使えるかも知れませんが、それでもダメな時は要望として挙げてもらえれば対応してみます。

MP4タグ一括書き込みツールを公開しました

前エントリでも触れた、MP4にタグ情報をAtomicPersleyを使って一括で書き込むGUIフロントエンドツールを公開してみました。我が家ルールでの運用を前提にしてあまり汎用性がない作りなので、どれくらい役に立つかわかりませんが、、、

現状、日本で役立たずなiTunes/iPhone/iPadの「テレビ番組」画面を自炊動画で活用した方はお試し下さい。

”画面写真”

 

かんたんな利用イメージはこちらのマニュアルにて。