cockscomblog?

cockscomb on hatena blog

iOSアプリ開発における便利OSSライブラリの選定について

f:id:cockscomb:20140506123733j:plain

(Andy Myers and the CocoaPods Dev team. Creative Commons - Attribution-NonCommercial 4.0 International)

iOSアプリを作るとき、今日ではCocoaPodsを用いて簡単に便利なライブラリの力を借りることができる。

ライブラリを利用するメリットは多い。自分でメンテナンスする必要がないので、放っておいても勝手に改善されていく。潜在的な問題があったとしても、多くの人が利用しているものなら誰かが気付いて直してくれる可能性も高い。また自分より優れたエンジニアの手によって、優れたインターフェースや実装になっているということも多い。何より、自分で実装する手間が省けるのがよい。

反面、デメリットについても考えなければならない。ライブラリがメンテナンスされなくなったとき、なにか問題が起こったり、あるいはAppleの気まぐれでコンパイルが通らなくなったらどうするのか。乗り換えるコストや、あるいは自分自身でメンテナンスすることを考慮する必要がある。またライブラリのインターフェースが全く変わってしまったら、これに対応するコストも必要である。リリースサイクルとの兼ね合いもある。

iOSアプリ開発においては、iOSが毎年大きなメジャーバージョンアップを繰り返すことや、言語仕様まで含めて開発環境が変わっていくことまで考慮しなければならない。もしアプリを一度リリースしてそれっきりで良いのなら何ら心配要らないだろう。しかし継続的なアップデートを数年にわたって続けていくつもりなら、無思慮なライブラリの選択はコードベースの寿命を縮める結果になりかねない。

ここで憚りながら、筆者のライブラリ選択の指針を公開する。参考になれば幸いである。

Effective Objective-C 2.0

Effective Objective-C 2.0

続きを読む

Web APIを利用するiOSアプリのテスト技法

もう先週ですが、表題のタイトルで「Consumer Service Engineer MeetUp Vol.1 ~iOS編~」という会でお話しさせていただきました。

このようなタイトルの発表にした理由についてですが、はてなとしてお話しするということで、ちょっと硬派な方に振ってみました。結果としては良いバランスだったのではないでしょうか。

発表資料を掲載します。

また以下に発表の概略を書いておきました。ご参考ください。

続きを読む

きょうの料理ビギナーズで勉強しています

きょうの料理ビギナーズは非常に良いシリーズです。料理というのは毎日続けないといけない家事であって、だからほんの一度すごく凝った料理を作るより、簡単でも毎日作り続けることが重要なのです。きょうの料理ビギナーズはちょうどそういう要件にマッチしていて、それで非常に良いのです。

昨今ではCookpadのようなサイトも利用しますが、食べたい、あるいは作りたいものが決まっているときに検索することが多い気がします。きょうの料理ビギナーズの良いところのひとつは、なんとなく眺めているうちにおいしそうに見えて作ってみようと思う、そういった偶発的な出会いをもたらしてくれるところでしょうか。

NHK きょうの料理ビギナーズ 2014年 04月号 [雑誌]

NHK きょうの料理ビギナーズ 2014年 04月号 [雑誌]

テキストが販売されているので毎月だいたい買っています。電子書籍版もありますが、iBooks StoreやKindle Storeといった最大手での販売はなく、またPDFなど将来にわたって安心できるフォーマットのものも見つからないので、諦めて紙の書籍を買って自炊しています。

これが本当の自炊ですね(笑)

DURODEX 自炊裁断機 ブラック 200DX

DURODEX 自炊裁断機 ブラック 200DX

FUJITSU ScanSnap iX500 FI-IX500

FUJITSU ScanSnap iX500 FI-IX500

brew servicesを使ってHomebrewでインストールしたMySQLを自動起動する

HomebrewでMySQLをインストールすると、post_installメッセージとして

To have launchd start mysql at login:
    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
    mysql.server start

このように表示されます。ここには、launchdというOS Xの仕組みを使ってMySQLを自動的に起動するやり方と、手動で毎回起動するやり方が書いてあります。

launchdは、OS Xの根幹を為す仕組みのひとつで、特にコマンドラインからはlaunchctlコマンドを使ってやり取りします。Property List形式のファイルを特定のディレクトリ、この場合は~/Library/LaunchAgentsディレクトリに置いて(ソフトリンクして)、これをlaunchctl loadすることで、launchdを使ったMySQL自動起動ができるようになります。

さて、ではこの自動起動をやめたくなったときどうしたらよいかというと、launchctl unloadしてソフトリンクを消したら元通りになります。launchctlコマンドに十分精通していればこれくらい簡単ですし、いま起動している一覧なども得ることができます。他にもman launchctlすると大変詳しい説明を読むことができます。

brew services

ここまで読むと、OS Xは非常に優れたOSで、launchdの柔軟さやlaunchctlコマンドの使いやすいインターフェースにただ感謝、という気持ちになったことと思います。

そうは言っても、他人のMacパソコンに親切でMySQLの自動設定をしてあげるのには躊躇われるものがあります。相手がlaunchdに詳しければよいのですが、launchctl unloadなどを知らなければ二度と元に戻すことができないでしょう。

そこで今日はbrew servicesコマンドを紹介します。このコマンドでMySQL自動起動するには

brew services start mysql

とするだけです。いま自動起動の設定をしているもの一覧は

brew services list

自動起動を止めたければ

brew services stop mysql

これだけのコマンドで先ほどのlaunchctlと同等のことが行えます。この方法ならlaunchdの柔軟な仕組みについてあまり明るくなくてもMySQL自動起動ができて便利です。またhomebrew/versionsのmysql55などを使っていたとしても、brew services start mysql55とすればよいようです。

この方法であればlaunchctlでなんの設定をしたかを忘れることもなく、リラックスしてMacパソコンを利用することができるので安心です。

Homebrewはこのように便利な仕組みを(こっそり)用意してくれていて侮れないものがありますね。こちらからは以上です。

参考

iOSアプリ開発関連書籍、大量入荷のお知らせと、おすすめの10冊まとめ

京都に本社を置きWebサービス事業を展開する会社で、WebサービスiOSアプリを作ったりしている。会社にはたくさんの技術書があるが、iOSアプリ開発関連の書籍がすこし足りないと感じていた。しかしながら読んでみたい本があったら自分で買ってしまうから、別に不自由すると言うこともなかった。というつもりだったのだけど、ちょっと気が変わって、会社にいい本が置いていないことは技術を重視するという社風から考えても好ましくない、という気になった。そこで上司に相談したところ、本はいくらでも買おう、ということだったので、買ってもらうことにした。

新しく買ってもらったものに加えて以前から会社にあったものも少し含むけれど、いま会社にあるいい本を以下に紹介します。

Objective-C

詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版

『詳解 Objective-C 2.0』は、Objective-C言語の言語仕様からFoundation.frameworkくらいまでをいわゆるObjective-Cと呼ぶとすると、そのほとんどすべてを正確にカバーしている。少し内容が古くなったとはいえ、そういうことは他の書籍で補うということにして、まず定番を抑えておくのがよい。

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

ARC・Blocks・GCDの3つのトピックについて専門的に書かれている。ARCの細かな挙動に気を配ることはメモリ関連の問題を減らすために必要となるし、BlocksやGCDの細かな部分は少し複雑かもしれないが便利な仕組みが多い。『エキスパートObjective-Cプログラミング』で詳しく学んでおいて損になることはない。

Effective Objective-C 2.0

Effective Objective-C 2.0

少し前までだったらここまでの2冊が特によかったと思うが、いまだったらこの1冊も推したい。コードを書く上で、言語毎に好ましい習慣があるように思う。そういったことを自力で習得するのは容易ではない。『Effective Objective-C 2.0』にはそういうことが丁寧に書かれている。

iOSのメジャーリリース毎に出ている書籍

iPhoneアプリ開発エキスパートガイド iOS 6対応

iPhoneアプリ開発エキスパートガイド iOS 6対応

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

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

iOSはメジャーバージョンが上がる毎にその開発環境も大きく変わっていく。昨今であれば、StoryboardやAuto Layoutなどは、大きく開発の仕組みを変えたといってよいだろう。そのときそのときで十分キャッチアップしていくのがいちばんよいし、これにはApple自身のドキュメントやサンプルコードが役立つ。とはいえ、細かい部分は見逃しがちであるし、ちょっと離れているとまるで分からなくなってしまう。そういったときにこのような書籍が役立つと思う。

単なるフレームワークの解説にとどまらず、便利なテクニックまで紹介されているのがよい。会社には新たにiOS 6とiOS 7の2冊を買ってもらったが、古いバージョン向けの『iOS4プログラミングブック』と『iOS5プログラミングブック』も役立つと思う。

もう少し特定の分野に絞った書籍

iOS Core Data徹底入門

iOS Core Data徹底入門

Core DataはiOS/OS Xで使われる標準的なデータベースの仕組みである。かなり高レベルに抽象化され、一種独特とも言える。その分iCloudとの連携など非常に高度な機能が備わっており、必要な場合に利用できることは大きな助けになる。そういうCore Dataについて、かなり網羅的に書かれているのが『iOS Core Data徹底入門』である。

最初の2/3ほどはあまりCore Dataと関係なく、データの永続化についてのいくつかのやり方やSQLiteを使う方法などが書かれており、残りでCore Dataを説明する。Core Dataについては簡単な利用法からマイグレーション、さらに例えば大きなバイナリデータをどうしても格納したいときにパフォーマンスをなるべく劣化させないテクニックといったところまで、かなり広く書かれている。

反対に、書かれていないこともある。例えばマルチスレッドからCore Dataを扱うということがよくあるが、NSManagedObjectContextが持っているキューを利用するやり方や、あるいはNSManagedObjectContextの親子関係を用いる方法といった、比較的新しい (といってもiOS 5から使える) 部分について特に記載がない。昔ながらのやり方だと煩雑なので、この辺りの記述がほしかった。またNSIncrementalStoreというおもしろいやつがあって、あまり使われることはないけれど、書いてあるとおもしろかったと思う。

とはいえ、日本語でCore Dataについてこれほどの情報源はなかなかないから、持っておくとよいと思う。マルチスレッドのときの新しいやり方はWWDC 2012のセッションがよかった。

iPhone/iPad グラフィックスプログラミング』はiOS/OS Xのグラフィックス関連のAPI群を紹介している。グラフィクス関連のフレームワークは非常に多く、Core GraphicsやCore ImageにCore Animation、ImageIOなど多岐にわたる。例えばアニメーションGIFを作るやり方みたいなところまで詳細に書かれており、便利なことも多いと思う。

開発手法

iOSデバッグ&最適化技法―for iPad/iPhone

iOSデバッグ&最適化技法―for iPad/iPhone

バグに繋がりやすい部分をよく理解し、効率的なデバッグのやり方を知っていると、開発の効率もよくなる。パフォーマンス上の問題にぶつかったとき、何より計測することが解決の近道である。そういうことを専門的に取り扱ったのが『iOSデバッグ&最適化技法』で、いくつかのトピックについて必要な情報が書かれている。ちょっと経験のある人だったら大体わかっているようなことが大体書いてあるので、とても役立つと思う。

UI

スマートフォンアプリのUIには一定の規則性がある。そういった規則を意識することで統一された使用感が得られる。『スマートフォンのためのUIデザイン』ではそういった規則を、実際のたくさんの事例を元に紹介している。どういったときにどういったUIコンポーネントが使われるのか、どういった意味合いがあるのか、といったことを学ぶことでいきなり異常なUIを作ることがなくなってよい。

iOS 7になってUIが全面的に見直された。いわゆるフラットデザインであるが、コンテンツを重視してUIパーツを従属的なものとし、リアリティのある奥行きの表現や物理法則の採用によって現実の延長線上にUIを位置づけた、といった風な大きな変更である。『iOS 7デザインスタンダード』はそういった変化を丁寧に説明している。好ましいことに、UIコンポーネントの名前が正確に記述されていて、コミュニケーションにも役立つと思う。

結びの言葉

上に紹介した書籍の多くは、自分で既に買っていてよかったものである。iOSアプリ開発関連の書籍をすべて読んでいるわけではないから、もっとよい本があるのを知らないということも多いだろうと思う。そういうのがありましたら是非、ご教示いただけたら幸いです。

今回紹介した10冊のうち2冊は以前から会社に置いてあったもので、8冊は新規に購入していただけた。これらの書籍からよく学び、またこの知識を拡大し、社内におけるさらなる技術向上に努めたい。そしてその結果を必ず製品に反映させたい。

iOS/OS Xアプリ開発関連の書籍について、昔からのよい本もあるけれど、やはり年々充実してきている。Objective-Cについて丁寧に書かれた本もどんどん増えていて、チェックが追いつかないほどになっている。そういった中で、すべての領域が網羅されたかと言えば決してそういうわけではない。書籍から学べる領域というのはいまもむかしも限定的で、必要に応じて自ら学び取っていかなければならない。

とはいえ、書籍でカバーされたら良いだろうと思う領域はある。例えばテストについて、テストは誰にでも関係あるのだから、そろそろ書籍としてまとめられても良いのではないか。『iOSテストについて書かれているおすすめ電子書籍情報(洋書) - laiso+iphone』ここで書かれているように、洋書ではいくつか書かれたものがある。少し特化すると、例えばiOSにおけるオーディオ処理について以前は『iPhone Core Audioプログラミング』というのがあったが、絶版となってしまった。

今後ますますよい本が発刊されていくことに疑いの余地はないし、とても楽しみである。

iOS 7におけるUIStatusBarStyleのベストプラクティス

photo by Janitors

前提

iOS 7からView Controller単位でステータスバーを設定しやすいようになりました。

ベストプラクティス

Info.plist

はじめに、Info.plistでUIViewControllerBasedStatusBarAppearanceNOになっていないことを確認します。NOだったらこれまでと同様

[UIApplication sharedApplication].statusBarStyle

で設定することになります。

アプリ起動時のDefaultイメージでは、Info.plistが優先されるので、Info.plistでUIStatusBarStyleを設定しておきます。

UIViewController

ここからView Controllerでの設定についてみていきます。重要なのはUIViewControllerのふたつのメソッドです。

preferredStatusBarStyle

ひとつめは

- (UIStatusBarStyle)preferredStatusBarStyle

で、これはそのView Controllerがどういうステータスバーが良いかを表現するためのメソッドです。適宜オーバーライドして、UIStatusBarStyleDefaultUIStatusBarStyleLightContentのどちらかを返します。

childViewControllerForStatusBarStyle

もうひとつは

- (UIViewController *)childViewControllerForStatusBarStyle

です。このメソッドでnilを返すと、上で説明したpreferredStatusBarStyleが使われます。なんらかのView Controllerを返したときは返したView Controllerの要求に従います。このメソッドはView Controllerのコンテナ的なView Controllerで使われます。例えばUITabBarControllerではこのメソッドが実装されていて、selectedViewControllerが返っているように見えます。

コンテナ

ここからが問題で、UINavigationControllerではchildViewControllerForStatusBarStylenilを返しています。とはいえNavigation Controllerを使っていてステータスバーのスタイルを変えたいとき、UINavigationControllerをサブクラスするのは感心しません。よりよいのは、UINavigationBar

@property(nonatomic, assign) UIBarStyle barStyle

を設定することです。UIBarStyleにはUIBarStyleDefaultUIBarStyleBlackがあります。これらが設定されたとき、UIStatusBarStyleはそれぞれUIStatusBarStyleDefaultUIStatusBarStyleLightContentになります。

追記(2016/07/01)

navigationBarHidden が真のとき、visibleViewControllerchildViewControllerForStatusBarStyle になるそうです。Navigation Bar の色合いなどを反映する必要がないので、納得ですね。

あとUISplitViewControllerのときはどうしたらいいのか分からなかった。サブクラスしてpreferredStatusBarStyleをオーバーライドする以外になんかできるなら知りたいので皆さまの知見を募集いたします。

参考

iOS Keys

Mastering iOS 7 UIStatusBarStyle (Example) | Coderwall