iOS9対応を見据えて、MKNetworkKitを使ってGETを行うサンプルをいまさら作ってみた


## まえがき
今自分が関わっているアプリでMKNetworKitを使っていて、2016年頭のIPv6対応を視野に入れないとまずい！という状況です。でも私はライブラリの導入方法すら知らない状態でしたので、そこから学習しはじめて、iOS9対応、特にiPV6対応の方法を現在検討しています。
その第一弾が、昨日投稿した[「[初心者向け]SwiftでもObj-cでも、CocoaPodsを使ってiOSライブラリを使って開発効率をアップさせる」](http://qiita.com/yonell/items/dae698f0e3bc30930765)です。これでライブラリの導入方法はとりあえずわかるようになりました汗。
この続編として今回の記事では、HTTP通信を行うライブラリの一つであるMKNetworKitを使ってAPIを叩いてJSONデータを取得する事を行っています。

## MKNetworkKitでのiOS9対応への懸念
MKNetworKitは、AFNetworkingと並んでHTTP通信を行う代表的なライブラリとして少し前は有名だったようです。このライブラリもIPv6対応の必要があるのですが、9/22現在でgithubに[issue](https://github.com/MugunthKumar/MKNetworkKit/issues)があげられていないようで、IPv6対応どうするんですか？という状態です。
ひょっとしたら対応予定なのかもしれないですが、まだわからないため使い続けるのも、今から使いはじめるのも個人的には不安があります。

## そもそもMKNetworKitでIPv6対応とは??
2016年頭からは、IPv6に対応した作りになっているかを審査でチェックされるようです。ひょっとしたら非対応だとリジェクトされる可能性があるかもしれないという認識です。
詳細は[「iOS9 で必要な IPv6 only Network への対応」](http://qiita.com/shao1555/items/4433803419dfc72bf80b)をご参考ください。
さて、今回サンプルを作っているMKNetworkKitの中で呼んでいるReachabilityでは、IPv4を前提とした構造体のsockaddr_inが使われています。そのため、IPv6では問題がありそうです。じゃあどうするかということですが、ちょっと調べてみたら、sockaddr_in6に変えれば問題なさそうなのですが、あまり調べきれていない現状です。
他の打ち手として、他のライブラリに乗り換えるか、ライブラリを使わずに対応するか、など検討中です。


## サンプル
ソースコードの中のコメントでもろもろ解説しています。
ライブラリの導入方法がわからない方は、[こちら](http://qiita.com/yonell/items/dae698f0e3bc30930765)をご参照ください。不明点や間違いなどあれば、コメントにてご指摘お願い致します。

```Objective-C:ViewController.m
#import "ViewController.h"
#import "MKNetworkKit.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // お天気情報を取得するAPIをたたきます。
    // (ref) http://www.touch-code-magazine.com/asihttprequest-is-dead-now-what/
    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"api.openweathermap.org" customHeaderFields:nil];
    // 東京の天気情報を取得したいので、クエリ文字列を作成します
    // request parameters
    NSDictionary *params = @{@"q":@"Tokyo"};

    // create operation
    MKNetworkOperation *operation = [engine operationWithPath:@"data/2.5/weather" params :params httpMethod:@"GET" ssl:NO];

    // set completion handler
    // 成功した時と失敗した時の処理を書きます
    // 今回はログを出力しているだけです
    [operation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        NSLog(@"json: %@", [completedOperation responseJSON]);
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"%@", error);
    }];

    // send request
    [engine enqueueOperation:operation];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end
```

## ソースコードはgithubへ
githubに今回作ったサンプルのソースコードをあげてあります。
https://github.com/tatsuya-yokoyama/MKNetworkKitSample

Xcode7.1Betaで作っていて、それより前のバージョンのXcodeでは動作は試してません。ATS対応もしてあるのでそのままビルドすれば動くかと。ATS対応については、[iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)をご参照ください。

## 参考サイト
* [iOS9 で必要な IPv6 only Network への対応](http://qiita.com/shao1555/items/4433803419dfc72bf80b)
* [iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)
* [iOS Framework:MKNetworkKitの概要](http://odoruinu.net/blog/mknetworkkit/)
* [ASIHTTPRequest is dead, now what?](http://www.touch-code-magazine.com/asihttprequest-is-dead-now-what/)
* [今回使用したサンプルコード@github](https://github.com/tatsuya-yokoyama/MKNetworkKitSample)