新年の挨拶と1年半ぶりにiOSアプリをバージョンアップした話

あけましておめでとうございます。コミケを見にきていただいた方はお疲れ様でした。


突然だがニコニコ実況っていうサービスが好きだ。日曜洋画劇場ニコニコ実況片手にみんなで見てる気分になるのが好きだった(最近は全く見なくなってしまった。理由は察してくれ)。ニコニコ実況っていうのは要はテレビ版のニコニコだ。俺の部屋のテレビとPCはそっぽ向くように置かれてるのでテレビ見てる時にパソコンを見るのが面倒だった。なのでiPhone版アプリを作った。

ニコ実

ニコ実

  • Satoshi Goto
  • エンターテインメント
  • 無料

12月後半、あるきっかけで休日の3連休にがっつり改修を行い、iTunes Connectのホリデーが終わってすぐアプリ申請、大晦日にリリースされた。iPadで文字が小さくなってしまう問題があったりもしたが(修正版を申請したのでもう少しお待ちください)、概ねレビューを見ると好評のようでアップデート作業をやってよかったなと思っている。

最後に更新してから1年半以上経ったアップデートになったわけだが、最初はリファクタリングのつもりだったんだがこれから書く変更点のせいで結局ほとんど1から書き直すことになった。この文章を書く前は「こうしたほうがいい」とかいう話にしようかなとおもったんだけど正月だしお酒飲んでてめんどくさくなってきたのでただの列挙になってしまった。ここまで読んでる人がいたら申し訳ない。

覚えてる大きな変更点

ARC

それまでのアプリは非ARCコードで書かれていたので、ARC対応にした(アップデート前はiOS 4.3対応だったため)。retain, release, autorelease, dealloc書かなくてよくなったのはほんとうに有難い。やはり面倒なことは一つでも少ない方がいい。行も短くなるし。

CocoaPods

以前は対応しているライブラリも少なく使ってなかったのだが、最近はかなり揃っているので使うことにした。使っているライブラリは次の通り。

  • AFNetworking
  • CocoaLumberjack
  • AFKissXMLRequestOperation
  • SSKeychain

空っぽなプロジェクトにAFNetworkingを追加すると、出来上がるバイナリサイズが370KBほど増えたので結構怖いなと感じた。何でもかんでも追加するとファイルサイズがどんどんでかくなっていくので使用するライブラリは必要最小限にするようにしたほうがいい。

今はMac / iOSのアプリを一つのxcworkspaceで作ってるんだが、そういったPodfileの定義する方法の情報が見つからなくて辛かった。ごちゃごちゃいじってたらできたんだが、ここでは書かない。興味ある人はそのアプリをOSSで公開する予定なのでそれを待ってほしい。

Storyboard

チーム開発ではコンフリクト解消が困難になるので使わないほうがいいだろうが、個人開発では使ったほうがいいと思う。ビュー間の移動をSegueでコード無しで追加できるのは楽だ。ただiPadのビューが6つあるとThunderbolt Displayを使っていてもStoryboardの編集は狭くて使いづらいのである程度ビューが少ないアプリじゃないときついかもしれない。

あと慣れてないのも悪いんだが、Auto layoutにかなり苦しめられた。親画面からの相対位置で右寄せ、下寄せさせたいだけなのに何度もXcodeに怒られながら修正をする必要があった。たまに警告なしの状態にしてもビルド時に失敗したことがあったので、なんかバグが残ってる気がする。前のバネで指定する方式は楽だったなあ。

Localize

前はUIのローカライズをするときにはxibをロケールの数作って編集していた気がするんだが、今はxib/storyboardとstringsファイルに分けて後者だけを編集すればいいようになっている。便利だなと思う一方で、自動生成されるstringsをみてもどの位置の文字列かパッとわからないこともあって辛かった。今後xib/storyboardいじったときにstringsのアップデートで苦しめられそうな未来が予想できる。

あと前もあったんだが、Localizable.stringsを追加してもシミュレータでは追加が反映されるのに実機では反映されないことが起きた。Option押しながらクリーンをやったら反映されるようになったんだが、原因がはっきりせずにもやもやしたままだったりする。

iOS 7の全画面ビュー

iOS 7からステータスバーの裏もビューとして使われるようになった。そのためコメントが流れる領域とステータスバーが被ってしまい、ステータスバーがとても読みにくくなった。ぐぐると一枚ビューを置いてTop Layout Guideを使ってステータスバー分だけずらすように設定しておけばStoryboardだけでもステータスバーには被らないように出来た。

delegateからBlocksへ

今回のアプリだと例えば「HTTP API叩いて通信結果が成功したらビューを更新して失敗したらエラーダイアログだす」みたいな処理が多い。今までまずは成功、失敗呼び出しを定義したプロトコルを作り、delegateを登録し、ってことをやってたんだがこれをBlocks型に書き換えた。 Blocksにしたことで「成功と失敗処理が同一メソッド内にあるので見やすい」「プロトコルを定義する必要がない・名前を考える必要がない」という楽さを感じた。ちょっと変わったことをやろうとすると苦労することもあるが(例えばBlocksで再帰呼び出しメモリリークしないように書く、とか)、ちょっとした通信処理とか書くときにはスッキリ書けるっていうだけでBlocksに変えてよかったなと思う。

終わりに

1年半ぶりのアップデートをやることでiOSの世界では1年半ってとても長いんだなというのを強く感じた。例えばNSArray, NSDictionaryなどのシンプルな糖衣構文や、上では書いてないがModulesも使うようになった。OSのメジャーバージョンも上がるのが早いし、開発者が追いついていくのもなかなか大変なものだ。それでも、いやだからこそiOSは新しいものが好きな開発者にとって楽しいプラットフォームなのかなと思ったのだった。