Objective-C/iOSアプリ開発に触れてからもうすぐ3年が経とうとしてるんですが、
たった3年で色々変わったものがあると感じているので、
ここらで最近の開発環境を晒してみようと思います.
言語の文法とかはリファレンス見ればなんとかなるんですが、
開発で使うツール類とかってまとまってなかったりするので、
今からiOSアプリ開発始めるひとの助けになればっていうのがこの記事の目的です.
とか言いながら、
正直プロジェクト毎に変わってるところもあったりしてあくまでも暫定ってことで.
「ここはこうした方がいい」とか「自分はこうしてます」みたいなのあったら、
@huinまで教えていただけると助かります.
(ghostはまだディスカッション機能がない...)
じゃあ行きます.
目次
ツール
バージョン管理
- git (subversion忘れた)
- gitignore
- ポイント
- .xcodeproj内のユーザー設定を除外する.
- (Cocoapods使ってるなら)Podsディレクトリを除外する.
- 設定するのが手間なので...
- githubならリポジトリ作成時に"Objective-C"のgitignoreを使う.
- マニュアルでignore作るならgitignore.ioで作る.
- ポイント
- gitignore
- 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ファイルを作ることもある.
プロジェクトの構成
Cocoapods
- 外部ライブラリはすべてCocoapodsで管理したい派
- 余程の理由がなければ
git submodule
は使わない. Podfile
とPodfile.lock
のみをgitで管理 (Pods
ディレクトリは除外)
アプリの設定
- ARC必須.
- バージョン(
CFBundleShortVersionString
)とビルド番号(CFBundleVersion
)- デフォルトだと両方
1.0.0
だが、ビルド番号を整数値にしてリリース毎にインクリメントしている. - バージョン間の比較にミスが減ると思うので.("1.0.1"と"1.1.0"はどう比較するのが正解?)
- デフォルトだと両方
- プロジェクトによっては開発用とリリース用で別のBundleIdentifierを使う.
コーディングルール
- 影響を受けたコーディングルール
- Coding Guidelines for Cocoa
- 命名規則とか
- プライベートメソッドに"_"プレフィクスは付けない.
- Google Objective-C Style Guide
- 1行辺の文字数は80文字までにする. (努力目標として運用) => Xocdeでライン表示してる.
- メソッドの引数毎に改行する.
- RayWenderlich Objective-C Style Guide
- メソッドの実装の順番(Code Organization)あたり.
- Coding Guidelines for Cocoa
- 実際の運用
- インデント => 4 スペース (Xcode 5のデフォルト)
- プロパティ宣言
- 基本はプロパティ宣言
- 外部から変更されたくない場合は、ヘッダーで'readonly'で宣言したあと実装ファイルで'readwrite'で宣言し直す.
@synthesize
は使わない.
- メソッド宣言
- プライベートメソッドの宣言不要になったけど宣言している.
- フレームワークのimport
- Xcode 5以降のプロジェクトは
@import Foundation;
の形でimportする. (not use#import
)
- Xcode 5以降のプロジェクトは
- 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
- Functional Reactive Programmingのライブラリ
- まだまだ勉強中だけどうまく使えば便利そう.
- Mantle
- JSONデータをObjective-Cオブジェクトに変換するためのライブラリ.
- Crashlytics
- リモートでクラッシュログを取得してくれるサービス
- TestFlight
- AdHocビルドのOTA配信をラクにしてくれる.
- Houston
- コマンドラインからプッシュ通信を行える.
- 簡単なRubyスクリプトで動かせるので手元でテストしたいときに便利.
こんなところですかね.