(初心者向け)Swift3.0で初アプリ - アプリからNode-REDヘアクセス

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[(初心者向け)Swift3.0で初アプリ - 外部ライブラリを使ってみる - CocoaPods, Carthage](https://qiita.com/egplnt/items/80760f5c6a009e109876)でAlamoFireを使えるようにしました
[(初心者向け)Swift3.0で初アプリ - iPhoneからMacbookへアクセス](https://qiita.com/egplnt/items/603673d6018b197c75ac)でiPhoneからMacbookへアクセスできるようにしました
[(初心者向け)Swift3.0で初アプリ - iPhoneからNode-REDヘアクセス](https://qiita.com/egplnt/items/5afb0448bf9d5419d408)でiPhoneからNode-REDへアクセスできるようにしました

次はiPhoneのアプリから自分のMacbookで稼働しているNode-REDへアクセスできるようにします

#1.Node-REDのフローを用意します
- Node-REDを起動します
- 下記のフローをコピペして動かします

``` :アプリからのリクエストを受信するフロー
[{"id":"386498ec.918b48","type":"debug","z":"6daf1ea.58ba66","name":"","active":true,"console":"false","complete":"false","x":350,"y":120,"wires":[]},{"id":"662f2b11.b3d67c","type":"http in","z":"6daf1ea.58ba66","name":"","url":"/test10","method":"post","upload":false,"swaggerDoc":"","x":170,"y":60,"wires":[["1cc428b9.c7b2ff","386498ec.918b48"]]},{"id":"f814e629.f0152","type":"http response","z":"6daf1ea.58ba66","name":"","statusCode":"","headers":{},"x":610,"y":60,"wires":[]},{"id":"1cc428b9.c7b2ff","type":"template","z":"6daf1ea.58ba66","name":"htmlを返す","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <body>\n        <h1>\n        祝！開通！！\n        </h1>\n    </body>\n</html>","output":"str","x":410,"y":60,"wires":[["f814e629.f0152"]]}]
```
<img width="953" alt="スクリーンショット 2017-10-05 15.53.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/169b1ea1-d523-918c-80d9-7e6724d0f9d0.png">

- 実はこのアプリは[(初心者向け)Swift3.0で初アプリ - iPhoneからNode-REDヘアクセス](https://qiita.com/egplnt/items/21524e1950e6e0d232c3) のフローの先頭（左端）の"http"ノード（黄色）をダブルクリックして、「GET」メソッドから「POST」メソッドへ変更した（だけ）です

#2. iPhoneアプリを用意します
- Xcodeを起動し、新しいSingle View Applicationを用意します
- ViewController.swiftへ下記をコピペします

```:Node-REDへデータを送付するフロー
import UIKit
import Alamofire

class ViewController: UIViewController {

    let url = "http://192.168.2.1:1883/test10"  //送付先を指定
    let headers: HTTPHeaders = [
        "name": "value"
    ]
    
    let button = UIButton()     // ボタンを定義
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // ボタンの位置とサイズ
        button.frame = CGRect(x: 120, y: 150, width: 120, height: 100)
        // ボタンの背景色
        button.backgroundColor = UIColor.lightGray
        // ボタンのタイトル
        button.setTitle("送信", for: .normal)
        // ボタンのタイトルのサイズ
        button.titleLabel?.font = UIFont.systemFont(ofSize: 30)
        // ボタン押下時のアクションとして送信処理("sendJson()")を指定
        button.addTarget(self, action: #selector(self.sendJson(sender:)), for: .touchUpInside)
        // 画面の背景色を指定
        view.backgroundColor = UIColor(red:1.0,green:1.0,blue:0.875,alpha:1.0)
        // 画面に追加
        view.addSubview(button)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // 送信処理
    @objc func sendJson(sender:UIButton){
        let parameters: Parameters = [
            "moji_param": "こんにちは",   // 文字パラメータの例
            "suji_param": 123,          // 数値パラメータの例
            "nested": [
                "nested_param": "ごきげんよう" // ネストしたパラメータの例
            ]
        ]
        // Alamofireでの送信処理
        Alamofire.request(url,
                          method: .post,    // POSTメソッド
                          parameters: parameters,
                          encoding: JSONEncoding.default,
                          headers: headers)
            .authenticate(user: "user", password: "password")
            .responseJSON { response in
                if
                    let json = response.result.value as? [String: Any],
                    let prop1 = json["prop1"] as? String
                {
                    debugPrint(prop1)
                }
                debugPrint(response)
        }
    }
}
```
- 必要に応じ下記の行の送付先URLを編集します

```
    let url = "http://192.168.2.1:1883/test10"  //送付先を指定
```
- Xcode画面左側のナビゲーターペイン（プロジェクト名やMain.storyboardなどが並んでいるところ）からInfo.plistを開きます
- リスト上部の「Information Property List」の右側にある「+」記号をクリックします
<img width="324" alt="スクリーンショット 2017-10-05 16.03.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/de71ec25-18f5-384d-3e1d-fa10bc7da931.png">

- 「NSAppTransportSecurity」と打ち込み、

<img width="274" alt="スクリーンショット 2017-10-05 16.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/a14af2e0-a7ab-9c0e-927b-4adc8c2ddb30.png">

- [Enter]キーを押下すると、「App Transport Security　Settings」に変化します

<img width="294" alt="スクリーンショット 2017-10-05 16.03.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/b40bff02-d9cb-bd62-46f4-046f59ec9a6c.png">

- この「App Transport Security Settings」の右側の「＋」記号をクリックすると、「Allow Arbitrary Loads」「Allow Arbitrary Loads in Web Content」の選択肢が表示されるのでこれらを追加します。右欄のValueには"YES"を指定します

<img width="313" alt="スクリーンショット 2017-10-05 16.04.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0241767a-0eee-3da6-4880-bb07b6d29ce2.png">

- 最終的に下記のようになることを確認します
<img width="473" alt="スクリーンショット 2017-10-05 16.04.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/a26caaa6-7159-22b4-7f97-aeb91485c6de.png">



#3. アプリを起動しNode-REDへデータを送付してみます
- [(初心者向け)Swift3.0で初アプリ - iPhoneからMacbookへアクセス](https://qiita.com/egplnt/items/8099fa3c6dfd1db785a9)、[(初心者向け)Swift3.0で初アプリ - iPhoneからNode-REDヘアクセス](https://qiita.com/egplnt/items/21524e1950e6e0d232c3)を参照し、iPhoneからNode-REDへアクセスできるようにしておきます
- Node-REDフロー画面のデバッグタブを開いておきます
- iPhoneでアプリを起動し、「送信」ボタンでデータを送付し、Node-REDへ届くことを確認します

<img width="1248" alt="スクリーンショット 2017-10-05 15.55.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/dbaaca6d-386b-2f5c-8158-c67e4e0d917c.png">