自作アプリにAWSの機能を組み込むのにAWS Mobile Hubを利用

# はじめに
AWS Advent Calendar 2015 16日目ということで「AWS Mobile Hub」を利用した話です。

AWS Mobile Hubでは画面上で機能を選択すると
AWS側の設定を自動生成してくれて、さらにiOS/Androidでそのまま動かせるファイルを吐き出してくれます。
この動作サンプルが便利！
目の前に実際に動作する物があると、それを動かしながら確認できるので話が早い！w

Amazon側の想定する使い方ではないかもしれませんが
こんな利用の仕方もあり、開発効率を上げるのに便利だった！という話です。

今回は
「自作iOSアプリに、S3利用し画像をアップロード・ダウンロードする機能を追加する場合」
にどんな手順を取ったかの記録です。

# Mobile Hubさんに動作するサンプルを生成してもらう
AWSログイン後、Mobile Hub画面にて「Create new mobile project」

![スクリーンショット 2015-12-15 12.49.07.png](https://qiita-image-store.s3.amazonaws.com/0/63205/65dbcdee-80ee-25de-a858-ed22ef98c081.png)

プロジェクト名は適当に「Sample20151216」などにしておきましょうか。
で「Create Project」でプロジェクト作成。

User Data Storageボタン選択。

![スクリーンショット 2015-12-15 12.50.05.png](https://qiita-image-store.s3.amazonaws.com/0/63205/c61bf08d-48f5-6466-c012-a373d1d746f5.png)

Store user dataを選択した状態で「Save changes」で保存。

![スクリーンショット 2015-12-15 12.50.16.png](https://qiita-image-store.s3.amazonaws.com/0/63205/048021a8-c054-e35a-39ba-acfa0dcc9de4.png)

画面左側メニューの「Build」から「iOS」を選択。

![スクリーンショット 2015-12-15 12.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/63205/fc69ca9e-ab78-8b38-ede0-13d6e7ebfd02.png)

しばらくAmazon側の自動生成を待つとダウンロードできるようになります。
(先程実行した時は約1分弱でした)

![スクリーンショット 2015-12-15 12.51.43.png](https://qiita-image-store.s3.amazonaws.com/0/63205/b7d916a9-1344-9a95-670c-d9b66d460e05.png)

ダウンロードしたらWeb上でやることは取り敢えず終了です。


# 自作iOSアプリにそれを組み込み

生成されたMySampleAppプロジェクトを開いて実行し動作することを確認。
そのプロジェクトを参考に、自作アプリのプロジェクトに手を入れていきます。

### ライブラリ追加

AWS関連FrameworkをMySampleAppから自作プロジェクト配下にコピー。
![スクリーンショット 2015-12-15 13.07.22.png](https://qiita-image-store.s3.amazonaws.com/0/63205/79ae4e03-d6ae-6365-5559-169947b6d5c9.png)

AWS関連に加えてその他のFrameworkも自作プロジェクトに追加。

![スクリーンショット 2015-12-15 13.10.51.png](https://qiita-image-store.s3.amazonaws.com/0/63205/b48e87e2-cc15-10f5-2955-60a64e27c350.png)

### AWS関連ソース追加
AmazonAwsフォルダを自作プロジェクト配下にコピー。
Add Files to でフォルダごと追加しました。

### 画像一覧画面追加
UserFilesフォルダを自作プロジェクト配下にコピー。
Add Files to でフォルダごと追加しました。

### AppDelegateに追記

```objc:AppDelegate.m
#import "AWSMobileClient.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return [[AWSMobileClient sharedInstance] didFinishLaunching:application withOptions:launchOptions];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[AWSMobileClient sharedInstance] applicationDidBecomeActive:application];
}
```

### 画面周り

動作確認用ボタンは横着してコードで生成してます。

```objc:ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(20, 200, 280, 30);
    [btn setTitle:@"S3画像一覧表示" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btn_action:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

- (void)btn_action:(UIButton *)sender
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"UserFiles" bundle:nil];
    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"UserFiles"];
    
    [self.navigationController pushViewController:viewController animated:YES];
}

@end
```

#### 余談
Single View Applicationで生成した場合、
初期のViewControllerはnavigationControllerの制御に乗っていません。

なので上記実装では画面が出ません。

以下の手順でnavigationControllerの画面制御に置きます。
1. StoryboardでNavigationControllerを追加。
2. NavigationControllerの「Is Initial View Controller」にチェック。
3. 自動でくっついてきているTableViewControllerを削除。
4. NavigationControllerのrootViewControllerにViewControllerを設定。

# おわりに
その他の機能も一度Mobile Hubで動く物を生成すれば
自作アプリへの応用の一手目が大分楽になると思います。