はじめに
昨年の Advent Calendar で 日報ちゃんという
Apple Watch の App を作りました。
出社,お昼ごはん,退社などの各アクティビティを
Slack の勤怠チャンネルに投稿するというわざわざスマホやPCを使わずに
手首の操作で完結するアプリです。
WWDC19 で watchOS に大もきな変更がありました。
また,SwiftUI も発表されたので SwiftUI で作ってみようと思い取り組んでみました。
7月の iOS 開発合宿で作り始めたのですがしばらく放置されてしまってました。
Qiita Advent Calendar のおかげで 勤怠ちゃん としてようやく形にできました。
watchOS 6 のここに注目!
watchOS 6 から iPhone 側のアプリ実装が不要になった
watchOS 5 までは iPhone 側のアプリ実装が必要でしたが,
Watch App が単体で開発可能になりました。
iPhone 側のコンテンツありきの開発であったため,より自由な尖ったものを開発できます。
Xcode で新規プロジェクトを作る際に Watch App だけで開発を開始できます。
入力インターフェースにキーボードオプションが増えた
Apple Watch 単体でアプリが動くようになったのに加え,
残念だった入力インタフェースにキーボードオプションが追加されました。
この発表があったとき,ひとりで会場で感動してました。
| キーボードオプション | iPhoneなどで入力可能 |
|---|---|
![]() |
![]() |
ペアリングしている iPhone でキーボード入力する形になります。
Apple Watch 側でキーボードを選択すると通知が行き,ロック画面でも入力可能です。
ありそうでなかった機能です!
昨年の日報ちゃんは,アクティビティリストと Slack への投稿に
必要な情報(Webhook URL など)を iPhone 側で入力し,
Watch Connectivity の機能を使って Apple Watch に送っていましたが
これが不要になります。(iPhone 側のアプリいらない😎)
SwiftUI が使える
Watch App の UI 実装はとても窮屈でした。
初めから SwiftUI みたいな開発が可能であるべきだったと感じました。
StackViewに色々コンポネントを突っ込むパズルみたいな感覚でしたよね😅
watchOS 6 以降に絞れば,SwiftUI で開発可能です。
iOS 側のアプリはまだ iOS 12 未満は切れないことも多いと思うので,
SwiftUI でアプリを作ってリリースするという知見を得るのも
先行して可能だと思っています。
2,3年後いきなり案件で使うとなるとさすがに厳しいと思います。
Combine も同じことが言えるかもしれません。自戒を込めて。
日報ちゃん
昨年の Advent Calendar のネタに作った iOS/watchOS アプリで
出社やお昼休憩などといったアクティビティを Apple Watch の簡単な操作で
Slack の勤怠チャンネルに投稿できます。
| Watchで選択 | Slackに投稿 |
|---|---|
![]() |
![]() |
スマホや Mac の Slack アプリをわざわざ起動することなく
手首で完結する というのがウリです。
iPhone 側で投稿に必要な情報の入力,アクティビティの登録を行い,
Watch Connectivity の機能を使って Apple Watch 側にデータを渡しています。
Picker に表示されたリストからアクティビティを選んでボタンを押すと投稿完了です。
もしよろしければ,昨年の記事の方をご覧ください。
【オフィスハック】Apple Watchを使って日報の各アクティビティをSlackに投稿させてみる
https://qiita.com/MilanistaDev/items/b97cab77d6add96c96dc
今回作るアプリ
昨年作った日報ちゃんアプリと同じ機能を持ったアプリを作ります。
新規性は下記になります。
- Watch App Only
- Watch では新しく追加された
TextFieldを使いiPhone側で入力していたSlack投稿に必要データをWatch 側だけで完結させる
- Watch では新しく追加された
- SwiftUIを使う
- UI は SwiftUI で実現
-
Listのカルーセルタイプを使ってみる -
@ObservedObjectとObservableObjectと@Publishedを使う
画面数はアラートなどを除くと下記の6画面です。
- アクティビティリスト画面
- アクティビティ編集画面
- 設定一覧画面
- アクティビティ追加画面
- Slack投稿に必要な情報入力画面
- アプリバージョン画面
Picker からの選択がカルーセル形式のアクティビティリストからの選択に
変わるだけで投稿したいアクティビティを投稿するというのは変わりません。
iPhone 側で入力していたデータ(アクティビティと Slack 投稿に必要なもの)は
Watch 側で入力します。Slack に投稿する際は URLSession を用います。
よって iPhone 側との通信は不要ですので Watch App だけで開発します。
Slack の Webhook URL の取得は下記リンクからできます。
投稿時のアイコンとユーザネームはここで設定します。
https://slack.com/services/new/incoming-webhook
実装
開発環境
- macOS Catalina10.15.1
- Xcode 11.2.1
- iOS 13 or iPadOS 13 and later (文字入力補助のため)
- watchOS 6 and later
このアプリのコード
GitHub にコードがあります。
気になったらインストールして見てみてください。
コードは汚いです。改善点ばかりです。
こうした方がいいなどアドバイスいただけると勉強になります🙇♂️
https://github.com/MilanistaDev/NippochanSwiftUI
今回は,画面ごとに特徴ある実装だけ紹介して
コードの説明は絞っていきたいと思います。
画面
アクティビティリスト選択画面1
SwiftUI の List で Watch だけで使えるカルーセルを使ってみます。
カルーセルはすごくカッコいいので Watch App では積極的に使っていきたいです。
セルごとに止まるような感じです。CollectionView とかでよく実装するやつですね。
デジタルクラウンをグリグリした際の触覚フィードバックがクセになります☺️
var body: some View {
List {
// カルーセルビューにデータを渡す処理
}
.listStyle(CarouselListStyle())
}
リストのタップで Slack の投稿アクションとなります。
デフォルトの勤怠系アクティビティデータセットが用意されています。
ユーザが追加できるアクティビティは編集・削除可能です。
カルーセルの右側にある画像をタップするとアクティビティ編集ができます。
左側にスワイプするとリストから削除できます。
1番最後は設定用のカルーセルで設定画面に遷移します。編集・削除不可です。
List の削除はこんな感じで書けますね。移動(onMove)も実装した方がいいかもです。
var body: some View {
List {
// カルーセルビューにデータを渡す処理
}
.onDelete { index in
// 該当の index のデータを削除
self.activityData.remove(at: index)
}
}
設定画面2
設定画面は静的なリスト形式としカルーセルにはしていません。
実際は VStack で NavigationLink の Text View を 3つ並べてるだけです。
destinationView にそれぞれ アクティビティ追加画面,Slack 投稿用の情報入力画面,
アプリバージョン画面 の View を渡しているのでそれぞれ Push 遷移します。
アクティビティ追加/編集画面3
こちらはアクティビティの追加・編集機能で同じ View が使われます。
トップのリスト画面に表示するアクティビティリストに
新しいアクティビティを追加したり既存のアクティビティの編集ができます。
VStack と HStack を組み合わせる作ってて楽しい画面のひとつです。
日報ちゃんでは iPhone 側で入力していたところですが
watchOS 6 からキーボード入力ができるようになったため Watch 側で実装しています。
アクティビティ名と絵文字を設定して下部のボタンをタップするだけで編集・追加完了です。
追加の場合は,ActivityModel をひとつ作成してデータの Array に追加しています。
編集の場合は,リスト画面のセルタップで該当の ActivityModel を
この画面に渡してデータの再追加をしています。
Slack 設定画面4
この画面で Slack 投稿時に必要な情報を入力し,送信時のパラメタとして用います。
同じくテキスト入力はペアリングしている iOS 13 の iOS 端末で行います。
入力するのは,Slack の Webhook URL と GitHub のアカウント名,
ユーザネームとお好きな色コードです。
これらの情報は Slack に投稿した際の情報に使われます。








