最近のiOSアプリ開発環境

Objective-C/iOSアプリ開発に触れてからもうすぐ3年が経とうとしてるんですが、
たった3年で色々変わったものがあると感じているので、
ここらで最近の開発環境を晒してみようと思います.

言語の文法とかはリファレンス見ればなんとかなるんですが、 開発で使うツール類とかってまとまってなかったりするので、 今からiOSアプリ開発始めるひとの助けになればっていうのがこの記事の目的です.

とか言いながら、 正直プロジェクト毎に変わってるところもあったりしてあくまでも暫定ってことで. 「ここはこうした方がいい」とか「自分はこうしてます」みたいなのあったら、 @huinまで教えていただけると助かります. (ghostはまだディスカッション機能がない...)

じゃあ行きます.

目次

ツール

バージョン管理

  • git (subversion忘れた)
    • gitignore
      • ポイント
        • .xcodeproj内のユーザー設定を除外する.
        • (Cocoapods使ってるなら)Podsディレクトリを除外する.
      • 設定するのが手間なので...
        • githubならリポジトリ作成時に"Objective-C"のgitignoreを使う.
        • マニュアルでignore作るならgitignore.ioで作る.
  • github
    • 一人でやるならBitBucketでもいいと思う.
  • ブランチの切り方
    • 基本は git-flow に従う.
    • githubのissue単位でfeatureブランチを切るとかそれくらい.
    • サブミットのバージョンごとにtagを付けておけばそこまで拘らなくていいかも.

Xcode

  • フォント : Ricty使ってます.
  • プロジェクトの構成 => 下記画像参照
    • AppDelegate, ViewControllers, Views, Models, Resourcesを大きく分けている感じ.
    • Cocoapodsで入れられない外部ライブラリはVendorディレクトリに突っ込んでいる.
    • カスタムビューが増えてきた場合はViewControllersの下に画面ごとにフォルダを切ってその中にViewsを作ることもある.
  • 設定
    • Preferences > Text Editing > Page guide at column をチェック. 80文字のところに線を引いてます.
  • Storyboard/Interface Builder
    • Storyboardはほぼ必須. (Auto Layout使いたいので)
    • UITableViewCellなどの部品用に.xibファイルを作ることもある.

プロジェクトの構成

xcode-project-organization

Cocoapods

  • 外部ライブラリはすべてCocoapodsで管理したい派
  • 余程の理由がなければgit submoduleは使わない.
  • PodfilePodfile.lockのみをgitで管理 (Podsディレクトリは除外)

アプリの設定

  • ARC必須.
  • バージョン(CFBundleShortVersionString)とビルド番号(CFBundleVersion)
    • デフォルトだと両方1.0.0だが、ビルド番号を整数値にしてリリース毎にインクリメントしている.
    • バージョン間の比較にミスが減ると思うので.("1.0.1"と"1.1.0"はどう比較するのが正解?)
  • プロジェクトによっては開発用とリリース用で別のBundleIdentifierを使う.

コーディングルール

  • 影響を受けたコーディングルール
  • 実際の運用
    • インデント => 4 スペース (Xcode 5のデフォルト)
    • プロパティ宣言
      • 基本はプロパティ宣言
      • 外部から変更されたくない場合は、ヘッダーで'readonly'で宣言したあと実装ファイルで'readwrite'で宣言し直す.
      • @synthesizeは使わない.
    • メソッド宣言
      • プライベートメソッドの宣言不要になったけど宣言している.
    • フレームワークのimport
      • Xcode 5以降のプロジェクトは@import Foundation;の形でimportする. (not use #import)
    • Block
      • ブロックを引数にもつメソッドはブロック自体が省略されていないか確認する. (下記参照)
    • モダンなObjective-Cシンタックス
      • NSArray, NSDictionary, NSNumberのリテラル.
      • 列挙型はNS_ENUM, NS_OPTIONを使う.
    • 定数は#defineではなくstatic constを使う.
    • メソッドの実装部分に{だけの行を作るべきか悩んでいる(clangだと入れないっぽい.)

Blockの引数チェック

- (void)taskWithBlock(void (^)(id arg1, id arg2))block
{     
    // do something

    block ? block(arg1, arg2) : nil;
}

テスト

  • 今のところKiwi
    • Xcode 5対応が遅れていて悩ましい.
    • モデル部分のテストだけならXCTest.frameworkでいいと思う.

外部ライブラリ/サービス

  • SDWebImage
    • 画像の非同期取得→表示(UIImageの拡張なので使いやすい)
  • AFNetworking
    • ネットワーク処理系のデファクトスタンダード
  • ReactiveCocoa
  • Mantle
    • JSONデータをObjective-Cオブジェクトに変換するためのライブラリ.
  • Crashlytics
    • リモートでクラッシュログを取得してくれるサービス
  • TestFlight
    • AdHocビルドのOTA配信をラクにしてくれる.
  • Houston
    • コマンドラインからプッシュ通信を行える.
    • 簡単なRubyスクリプトで動かせるので手元でテストしたいときに便利.

こんなところですかね.