LoginSignup
5

More than 5 years have passed since last update.

iOSのワークアウトデータを見せびらかしたい [その2]

Posted at

こんにちは。
SENSY株式会社のnkhrkです。

この記事はSensyAdventCalender2017の21日目の記事です。
なお、13日目の記事の続きとなります。

おさらい

前回は

  • iOSプロジェクト作成
  • ワークアウトデータを抽出
  • 抽出したデータを加工

までを行いました。

今回は、抽出したデータを元に、いよいよワークアウトデータを見せびらかすことに挑戦しましょう。

データを見せびらかす

Twitter, facebook, Instagramなど色々とSNSはありますが、
今回はエンジニア向けということで Slack へのPOSTを試してみます。

Slack側の設定

まずはSlackの設定を行います。

前提

  • 既にSlackチームが存在していること
  • そのチームにAppを登録できる権限があること

Slack Appを作成する

  • https://api.slack.com/apps?new_app=1 にアクセスする
  • Create a Slack App というウィンドウが開く
    • App Name
      • 作成するSlack Appの名前を入力
    • Development Slack Workspace
      • Appを登録する対象のSlackチームを選ぶ

スクリーンショット 2017-12-21 13.32.45.png

  • "Create App"を押すと、自動的にSettingsの画面へ遷移する
    • "Incoming Webhook" -> Activate Incoming Webhooks -> "On" に変更
    • 下に "Webhook URLs for Your Workspace" が出て来るので、 "Add New Webhook to Workspace" を押す

スクリーンショット 2017-12-21 13.41.04.png


スクリーンショット 2017-12-21 13.41.11.png

  • POST先のChannelを選ぶ
    • Authorizeを押す
      • 自動的に元の画面に戻り、 "Webhook URL" が追加されているため、控えておく

SwiftからSlackへPOSTする

結局、Slack設定で取得した "Webhook URL" にPOSTするだけです。

  • やってみる
    今回はHTTPリクエストを簡単にするため、Alamofireというライブラリを使用します。
    なお、インストール方法は割愛しますので、上記ページを参照してください。

  • いよいよSlackへのPOSTですが、以下の仕様とします。

    • App起動時に一番直近のワークアウトデータの以下データをPOSTする。
      • 日時
      • 距離
      • かかった時間
      • 平均ペース
      • 消費カロリー
  • POSTするfunctionを作成
    以下のようにして、POSTする部分を作成します。

ViewController.swift
// 追加
import Alamofire

~中略~

    // 追加
    // AlamofireでSlackへJSONをPOSTする
    func postToSlack(date: String, distance: String, time: String, pace: String, energy: String) {
        let parameters: Parameters = [
            "attachments": [
                [
                    "color": "#36a64f",
                    "text": "nkhrkさんはWorkoutを行いました。",
                    "fields": [
                        [
                            "title": "Date",
                            "value": date,
                            "short": true
                        ],
                        [
                            "title": "Distance",
                            "value": distance,
                            "short": true
                        ],
                        [
                            "title": "Time",
                            "value": time,
                            "short": true
                        ],
                        [
                            "title": "Pace",
                            "value": pace,
                            "short": true
                        ],
                        [
                            "title": "Energy Burn",
                            "value": energy,
                            "short": true
                        ]
                    ]
                ]
            ]
        ]
        let headers: HTTPHeaders = [
            "Content-Type": "application/json"
        ]

        Alamofire.request("[ここはSlackで取得したWebhook URL]",
                          method: .post,
                          parameters: parameters,
                          encoding: JSONEncoding.default,
                          headers: headers).responseString { response in print(response) }
    }

上記のfunctionが実装できたら、次は前回作成していた部分の viewDidLoad を少し修正します。

ViewController.swift
    override func viewDidLoad() {
    // ~中略~
    DispatchQueue.main.async(execute: { () -> Void in
        for workout in self.workouts {
            // 以下のように変更する
            let km_double = workout.totalDistance!.doubleValue(for: HKUnit.meter()) / 1000
            let averagespeed = self.calcAverageSpeedForMeter(interval: workout.duration, distance: km_double)
            self.postToSlack(
                date: String(format: "%@ ~ %@", workout.startDate as CVarArg, workout.endDate as CVarArg),
                distance: String(format: "%@", workout.totalDistance ?? "no data"),
                time: String(format: "%@", self.stringFromTimeInterval(interval: workout.duration)),
                pace: String(format: "%@ / km", averagespeed),
                energy: String(format: "%@", workout.totalEnergyBurned ?? "no data")
            )
            break
            // ここまで
        }
    });

− 起動する
ここまでできたら起動してみましょう。

デバッグコンソールに SUCCESS: ok と表示され、Slackの指定したChannelへ通知されれば成功です。
スクリーンショット 2017-12-21 15.24.26.png

おつかれさまでした!

最後に

ここまでできれば、あとは煮るなり焼くなりして、いい感じにPOSTできるアプリが作れそうですね。
これまでのものをベースとして、もう少しいい感じに改良したものを時間のある時にGithubに置いておきますので、よろしければそちらもどうぞ!

では、みなさま良いランニングライフを!:runner::runner::runner:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5