swift初心者がSmartNews風ニュースアプリを作ってみる過程を晒す(4) - Carthageを用いてAlamofireとSwiftyJSONを導入する


## はじめに

前回は、こんな記事を書きました。
[swift初心者がSmartNews風ニュースアプリを作ってみる過程を晒す(3) - PageMenuライブラリを改造して外観をブラッシュアップ - Qiita](http://qiita.com/tjnet/items/dc0ee7cb9ccfaa7111d8)

## 現在の進捗

現在の進捗はこんな感じです。

![pagemenu.gif](https://qiita-image-store.s3.amazonaws.com/0/34321/1ac31392-4938-5b44-5700-87c8086fb05b.gif "pagemenu.gif")


ソースコードは下記コマンドで取得できます。

``git clone --branch v1.2 https://github.com/tjnet/NewsAppWithSwift.git``


## 今回、作るもの

今回は、Carthageを用いて、ニュース記事の取得に用いる通信用のライブラリAlamofire, SwiftyJSONを取得します。
[Alamofire](https://github.com/Alamofire/Alamofire)は、swift製のHTTP通信を担当するライブラリです。[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)はSwift製のライブラリで、JSONのハンドリングを容易にするためのものです。

今回はCarthage(カルタゴ)という依存関係管理ツールを使用してAlamofire, SwiftyJSONを導入します。

## 依存関係管理

各ライブラリを手動でダウンロードして、プロジェクトに導入することもできますが、Carthageのようなライブラリ管理ツールを用いるのには、大きく3つの理由があると思います。

- 手動でライブラリの存在するリポジトリを探し、ダウンロードし、設置する手間を省くことができます。
- また、ライブラリ管理ツールのコマンドを叩くだけでライブラリの導入が完了するため、チーム内でライブラリの導入手順を揃えることが可能となります。
- 依存関係を定義したファイルさえあれば、ライブラリそのものをバージョン管理システムに保持する必要がなくなります。

## Carthage vs CocoaPods (CocoaPods is easy, Carthage is simple)

iOSアプリの開発においては、既に広く知られた[CocoaPods](https://cocoapods.org/)というものがありますが、CarthageはCocoaPodsとは違ったアプローチで設計されており、CocoaPodsよりシンプルなライブラリ管理ツールとして開発されました。Carthageは依存性管理にフォーカスしており、インテグレーション作業は開発者自身にお任せしています。

こちらの記事によれば、Carthageはビルド時間の短縮という恩恵も享受できるようです。
[Electron - メッセージングアプリSync開発の舞台裏(iOS) - Qiita](http://qiita.com/susieyy/items/079be0df5cd72953b21b)

## Carthageの内部動作

- Cartfileの解析
- 依存関係グラフの解決
- 全ての依存するパッケージのダウンロード
- それぞれのframeworkをビルド

詳細は、[こちらのスライド](https://speakerdeck.com/jspahrsummers/ruthlessly-simple-dependency-management-with-carthage)をご確認下さい。


## Carthageのインストール

.pkgインストーラもしくは、Homebrewパッケージマネージャを用いてインストールできます。ここではHomebrewを利用してインストールを行います。

```
brew update
brew install carthage
```

正常にインストールされているか確認するために、以下のコマンドを実行してみます。

```
carthage version
```

## Cartfileを作成する

まずはCartfileを作成します。Cartfileには使用したいライブラリの情報を記述していきます。CocoaPodsでのPodfileにあたるものです。

```
github "Alamofire/Alamofire" ~> 3.0
github "SwiftyJSON/SwiftyJSON" ~> 2.3.0
```

CartfileはOGDLという言語のサブセットで書かれており、

- ターゲットとなるリポジトリ
- 使用したいライブラリのversion

を記述します。

ライブラリのバージョン指定のフォーマットは、いくつか用意されています。

- ``github "Alamofire/Alamofire" == 3.0``は、ちょうどversion 3.0を使用します。
- ``github "Alamofire/Alamofire" >= 3.0``は、version 3.0もしくは3.0より後のversionを使用します。
- ``github "Alamofire/Alamofire" ~> 3.0``は、version 3.0と互換性のあるversionを使用します。

## ライブラリを取得してビルドする

ターミナルから、下記のコマンドを入力します。

```
carthage bootstrap --platform iOS
```


## Frameworkをプロジェクトに追加する

```
open Carthage
```
を実行して、事前にライブラリが格納されているディレクトリを開いておくと、以降の操作が楽になります。

プロジェクトのtarget -> 上部のgeneralタブを選択し、 最下部のLinked Frameworks and Librariesセクションまでスクロールします。
Finder上のCarthageディレクトリ直下のBuild\iOSに移動し、Alamofire.frameworkとSwiftyJSON.frameworkをXcode上のLinked Frameworks and Librariesセクションにドラッグ&ドロップ
します。

![スクリーンショット 2015-11-27 0.10.37.png](https://qiita-image-store.s3.amazonaws.com/0/34321/399ab358-dbbe-c2e3-ffd4-aecbed12754b.png "スクリーンショット 2015-11-27 0.10.37.png")



これで各ライブラリをimportできるようになります。

target上の“Build Phases”から“+” icon をクリックして以下のような“New Run Script Phase”を作成します。 

```
/usr/local/bin/carthage copy-frameworks
```

 “Input Files” にはフレームワークのパスを指定します。
 
```
$(SRCROOT)/Carthage/Build/iOS/AlamoFire.framework
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework
```

![スクリーンショット 2015-11-26 23.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/34321/d24622cd-d01d-d091-2bf7-8d145fb34842.png "スクリーンショット 2015-11-26 23.16.10.png")

では、アプリケーションコード内でライブラリの機能を使用してみます。
viewDidLoadメソッドの最後に、以下のコードを記述して、シミュレータを起動してみましょう。

```ViewController.swift
Alamofire.request(.GET, "http://qiita-stock.info/api.json").responseJSON {
    response in
    if response.result.isSuccess {
        print(response)
    }
}
```


## 動作確認

iOS9、Xcode7、swift2で動作確認を行っています。
シミュレータを起動して、xcode上のログを確認すると、以下のエラーメッセージが表示されています。

```
2015-11-26 23:14:36.134 NewsApp[4444:245357] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

### 原因

ATS(App Transport Security)に抵触し、HTTPアクセスできなかったことが原因と考えられます。
詳細は、下記をご参照ください。[App Transport Security](https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW14)


### 対応

ここではエラー回避のため、いったん``Info.plist``の最下部に以下のエントリを追記します(推奨されている対応方法ではありませんので、詳細については次回、回を改めて書いてみたいと思います)。

```
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
```

もう一度ビルドしてアプリを起動すると、、、できました!
qiitaのAPIから取得したresponseの内容が表示されています。

![スクリーンショット 2015-11-27 0.07.15.png](https://qiita-image-store.s3.amazonaws.com/0/34321/f2a570ba-14c2-d9b5-900f-3f6f4f7de286.png "スクリーンショット 2015-11-27 0.07.15.png")


ソースコードは下記コマンドで取得できます。

``git clone --branch v1.3 https://github.com/tjnet/NewsAppWithSwift.git``

## 参考

- [Carthage Tutorial: Getting Started - Ray Wenderlich](http://www.raywenderlich.com/109330/carthage-tutorial-getting-started)
- [REST API Calls with Alamofire & SwiftyJSON - Grok Swift](https://grokswift.com/rest-with-alamofire-swiftyjson/)
[How to use Alamofire and SwiftyJSON with Swift? – Swift 2 – iOS 9 – Xcode 7 | Ashish Kakkad](http://ashishkakkad.com/2015/10/how-to-use-alamofire-and-swiftyjson-with-swift-swift-2-ios-9-xcode-7/)

- [How do I load an HTTP URL with App Transport Security enabled in iOS 9? - Stack Overflow](http://stackoverflow.com/questions/30731785/how-do-i-load-an-http-url-with-app-transport-security-enabled-in-ios-9)
- [How do I load an HTTP URL with App Transport Security enabled in iOS 9?](http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http)
- [シンプルなパッケージ管理ツール Carthage - Realm is a mobile database: a replacement for SQLite & Core Data](https://realm.io/jp/news/swift-dependency-management-with-carthage/)
- [Switch Cocoapods to Carthage](http://chaoruan.me/switch-cocoapods-to-carthage/)
- [Working with a Static Library/Framework vs Embedded Framework — Hacking iOS — Medium](https://medium.com/hacking-ios/working-with-a-static-library-framework-vs-embedded-framework-9ca7cd77b4f9#.dokktfw9n)
- [仕事で使える魔法のLAMP（7）：ダイナミックリンクとスタティックリンク - ＠IT](http://www.atmarkit.co.jp/ait/articles/1105/27/news111.html)
- [Ruthlessly Simple Dependency Management with Carthage // Speaker Deck](https://speakerdeck.com/jspahrsummers/ruthlessly-simple-dependency-management-with-carthage)