Xcode,プロジェクト設定これだけはしておくといいかも(初心者向けかも)

iOSアプリ開発をやってきて最初に設定しておいたほうがいいことがある程度まとまったので、書いていきます。

想定環境

|環境| バージョンとか|
|:-----------|------------:|
|Xcode |6.4|
|言語|Objective-C|
|cocoapods|0.38.2|


参考プロジェクトファイル
https://github.com/ppengotsu/iosSettingSample


# Xcode設定

## タブ切り替え
プログラム実行時に、プログラムがなにかを理由に停止した際に、mainメソッドで止まったりすることがあります。また、デバッグ中は、ログ取得結果画面を大きく表示したいなどがあると思います。なので以下のように、xcode設定してください。
![スクリーンショット 2015-08-23 22.38.32.png](https://qiita-image-store.s3.amazonaws.com/0/24266/f540d87b-bb20-d307-42a7-7110668e4055.png "スクリーンショット 2015-08-23 22.38.32.png")

次に、下記のように、コマンドキー+Tキーでタブ作り、Debugというなのタブを作ります。
![スクリーンショット 2015-08-23 22.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/24266/61192f9d-3525-5051-a44a-29b111feb48f.png "スクリーンショット 2015-08-23 22.40.42.png")
このようにすることで、プログラムが停止するとDebugタブに自動遷移します。


## 画面の色設定
個人によりますが、僕は背景が白色だと目が痛くなるためでうす。
![スクリーンショット 2015-08-23 22.38.23.png](https://qiita-image-store.s3.amazonaws.com/0/24266/00dd4491-c00c-71df-0e84-cfa08e68ae35.png "スクリーンショット 2015-08-23 22.38.23.png")



# プロジェクト設定
## cocoapods の設定
iOS,MacOSXアプリ開発で、ライブラリを管理する方法として、cocoapodsがあります。

プロジェクトのディレクトリのルートで下記コマンドを実装してください。(”プロジェクト名”.xcodeprojファイルがあるところで実行)

```sh:cocoapods
$ pod init  #Podfile作成
$ pod install #プロジェクト全体をpodに合わせて設定
```

| 作成されたもの | Pod |
|:-----------|------------:|
| Podfile| ライブラリで何を入れたりするかの設定ファイル|
| Podfile.lock| インストールしたライブラリの設定|
| *.xcworkspace|ワークスペースファイル。次回起動するときは、このファイルを開いてください。|
| Podsディレクトリ|ライブラリ本体がある。 |

cocoapodsは、外部ライブラリの管理と更新が簡単にできるので絶対入れたほうがよい。
現在は、carthageという管理ツールもでているようです。ただし、対応しているライブラリが少ない、動かないものもあるようです。swiftでは使ったほうがいいらしい。コンパイルの時間が節約できるためです。

## PROJECT,TAGETS内の設定
### アプリの最低サポートOSバージョンを決定しよう。
アプリをリリースした際に、最低インストールできるOSバージョンは、XcodeのDeploy ment Targetに依存します。なので以下、２箇所を変えましょう。これによって、サポートすべきAPIが変化します。
![スクリーンショット 2015-08-24 2.06.58.png](https://qiita-image-store.s3.amazonaws.com/0/24266/0aa27501-4836-80b8-d799-378dbd554877.png "スクリーンショット 2015-08-24 2.06.58.png")
![スクリーンショット 2015-08-24 2.07.04.png](https://qiita-image-store.s3.amazonaws.com/0/24266/ea73d0d6-d87d-e9e2-d7a6-5f14ed267279.png "スクリーンショット 2015-08-24 2.07.04.png")

### アプリの向きを決定
大抵のアプリは、縦向きのみなので、Portraitだけにチェックしましょう。
もし、横画面に対応するならLandscapeの２つをチェックです。
![スクリーンショット 2015-08-24 2.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/24266/8d65e52b-e506-7427-fb1b-925b218127f9.png "スクリーンショット 2015-08-24 2.34.25.png")

### アプリアイコンとスプラッシュスクリーンの設定
アイコンは、アプリの顔となりやる気維持にもつながるので設定しましょう。仮でもいいです。サイズなどは、参照、引用を参考にしてください。
スプラッシュスクリーンもアイコン同様に、あるとアプリっぽいです。
今は、xib形式で読み込みるので、プログミングができない状態からでもカッコよくできると思います。よくあるのは、中心にロゴ設置して背景を一色で染めるやつですねー。

![スクリーンショット 2015-08-24 2.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/24266/480ba34d-2daf-2f19-5a1f-b5233ee224c0.png "スクリーンショット 2015-08-24 2.37.28.png")

![スクリーンショット 2015-08-24 2.37.36.png](https://qiita-image-store.s3.amazonaws.com/0/24266/2041c8e6-cb4c-cf7f-b71d-879a89ddf70b.png "スクリーンショット 2015-08-24 2.37.36.png")




## schemeの共有
schemeは、プロジェクトの実行時の細かな設定することできます。例えば、実行時にバックグラウンドで開始するなどです。(今見てみると、scheme設定にGeoJSONの設定もあるので設定できるのかも)
参考先を見てみると、Debug,Releaseの切り替えを簡易にするために使うこともあるようですね。


![スクリーンショット 2015-08-23 23.09.24.png](https://qiita-image-store.s3.amazonaws.com/0/24266/5f1cd7d8-55b2-e6ae-8083-5d7e98866e23.png "スクリーンショット 2015-08-23 23.09.24.png")

共有するには、以下のようにしてください。
Sharedにチェックを入れるだけです。
![スクリーンショット 2015-08-23 23.07.01.png](https://qiita-image-store.s3.amazonaws.com/0/24266/4f428c23-1bae-4831-c50b-85402c0c7f68.png "スクリーンショット 2015-08-23 23.07.01.png")
![スクリーンショット 2015-08-23 23.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/24266/964c0f42-c3fb-73bd-bea7-4e527828d832.png "スクリーンショット 2015-08-23 23.07.11.png")

## Configurationsの複製
+ボタンで増やしてください。Configurationsは、設定のリストとようなものです。
これで、デバッグ用のURLに接続や本番のURLに接続に分けることができます。
名前は自由です。
![スクリーンショット 2015-08-26 1.14.46.png](https://qiita-image-store.s3.amazonaws.com/0/24266/f6d41453-d0b6-0308-b965-102e648d94cc.png "スクリーンショット 2015-08-26 1.14.46.png")
![スクリーンショット 2015-08-26 1.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/24266/eeea2f17-08de-9d1d-6d85-75cc88869488.png "スクリーンショット 2015-08-26 1.18.02.png")

また、下記のようにBuild Settingのプリプロセッサの設定を変えてください。
これは、プロジェクト内のマクロ定義をそれぞれに設定しています。
DEBUGはもう少しわかりやすくかえてもいいかも。
![スクリーンショット 2015-08-26 1.18.38.png](https://qiita-image-store.s3.amazonaws.com/0/24266/776c7948-2c1e-ff69-965f-3ae29fe2c972.png "スクリーンショット 2015-08-26 1.18.38.png")

![スクリーンショット 2015-08-26 1.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/24266/d5fe4cbf-8dd2-cbed-c20f-84230795e28a.png "スクリーンショット 2015-08-26 1.23.24.png")

また、Podの方も追加してください
![スクリーンショット 2015-08-26 1.24.29.png](https://qiita-image-store.s3.amazonaws.com/0/24266/3c06ff65-c762-c8de-f934-ddd2968cd82a.png "スクリーンショット 2015-08-26 1.24.29.png")

このおかげで

```Objctive-C:ConfigTemp.m
#ifdef DEBUG1
	//Debug1のとき
	static NSString *imageUrl = @"https://ppen.info";
	
#endif

```

のようにできます。



## TARGETSの複製
プロジェクトの設定一式を複製しておきましょう。
下記写真のように、targetを複製しましょう。
![スクリーンショット 2015-08-26 2.44.33.png](https://qiita-image-store.s3.amazonaws.com/0/24266/836218eb-1b8d-8ff5-1563-a0564b294821.png "スクリーンショット 2015-08-26 2.44.33.png")

このようにすることで、
![スクリーンショット 2015-08-26 3.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/24266/1137f4c4-03eb-9ff1-45b6-a46f3d9a9148.png "スクリーンショット 2015-08-26 3.01.45.png")

上記のように簡単にDebug設定などを切り替えることができます。
また、info.plistが作られているはずなので、それぞれ名前をかえたら、BuildSettingsを設定し直しましょう。(info.plistでBuildSettingを検索してみるとわかると思います。）

# URL Schemeの設定
インターネットのアドレス(例：http://ppen.info )のように、iOSもアプリを指すアドレスを設定できます。ただし、これは、アプリごとに別のものになっている保証はないようです。また、
下記だと、”iossample://”とsafariにアドレス入力するとアプリが起動します。
”iossample://”を”iossample://dataid=1000”のようにすると文字列を渡すことができます。どこから起動したのかや指定した画像を表示するなどに使えます。
![スクリーンショット 2015-08-26 22.05.08.png](https://qiita-image-store.s3.amazonaws.com/0/24266/6efce8b1-33d9-0442-e819-b0bafb980907.png "スクリーンショット 2015-08-26 22.05.08.png")
TARGETSを複製して、info.plistが複数ある場合は、それぞれに設定する必要があります。


# アプリ言語設定(他言語設定)
プロジェクト作った状態だと、英語のみになっています。
![スクリーンショット 2015-08-26 22.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/24266/4faf47be-5b15-6383-e22f-75169e80afee.png "スクリーンショット 2015-08-26 22.23.06.png")

このままでは、itunes storeにアプリを出した際に対応言語が、英語になってしまうので、日本語などそれぞれに変更しましょう。また、英語と日本語の両方いれるとそれぞれ端末設定によって、表示する文字列を変えることができます。アプリ内に設定がない言語の場合は、基準とした言語で表示されます。
![スクリーンショット 2015-08-26 23.54.38.png](https://qiita-image-store.s3.amazonaws.com/0/24266/b28c1b2d-2893-a55e-7599-8fe279aecbdd.png "スクリーンショット 2015-08-26 23.54.38.png")
![スクリーンショット 2015-08-26 23.54.45.png](https://qiita-image-store.s3.amazonaws.com/0/24266/5c25c350-beec-c22e-c3e4-40c1033dfe5f.png "スクリーンショット 2015-08-26 23.54.45.png")

xliffファイルやstringsファイルを使うことで、コードで設定した文字列の多言語かもできます。(詳しくは、参考の多言語対応のリンク先みてください)

## その他思いついたら書く

# コード設定
ここから下は、あとでコードにおとす

## 起動時の処理を短くしよう

アプリは、アップデートしていく過程で、DBのマイグレーションなどによって起動が遅くなることがあります。しかし、iOSアプリは起動時に１０秒程度メインスレッドで処理し続けると、アプリが落ちるようになっています。そのため、アプリ起動時は、最初の画面が表示しきるまで重い処理はしないようにしましょう。だけど、DBマイグレーションなどのアプリ全体に影響してしまうようなものを実行中はユーザに操作してほしくないと思います。
なので、
アプリ起動→スプラッシュ→メイン画面
ではなく
アプリ起動→スプラッシュ→更新画面→メイン画面
とすることで、解決できます。
また、ユーザからしたら起動時間が延びたことに変わりないので、できる限り必要になったときにマイグレーション処理などをしたほうが良いかもしれません。

## 強制アップデートの導入
アプリをアップデートしていくと、APIなどが変化していくと思います。それに合わせてアップデートをすると思うのですが、すでにリリースしたアプリをユーザの端末から消すことはできません。そのため、市場に古いAPI対応のアプリと新しいAPI対応のアプリが居る状態になります。アップデートすればするほど、メンテナンスが大変になります。
そのため、アプリを起動したときやなにかにアクセスしたときにサーバにアクセスして、サポートする最低のバージョンをjsonなどで返してもらい、操作を続行するか決めましょう。

## その他思いついたら書く




# 参考
scheme1 - http://nanananande.helpfulness.jp/post-1500/
scheme2 - http://dev.classmethod.jp/smartphone/iphone/xcode-scheme-shared/
scheme3 - http://dev.classmethod.jp/smartphone/iphone/ios-user-defined/

carthage - 

アイコンサイズ - http://qiita.com/Yuta/items/98b9ea2739718b9184de

url schemeについて - http://www.appbank.net/2013/03/24/iphone-news/567531.php

多言語対応 - http://seeku.hateblo.jp/entry/2015/04/12/153149




# 感想とか
他にも便利なものがあったら、コメントなどで教えください。こちらで調査してのせます。
こちらも思いついたりしたら書きます！
ああ、もうSwiftだけにしたい。