質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1777閲覧

歩数のデータをカレンダーに反映させる方法

.koji

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/09/18 07:52

編集2019/09/18 10:46

前提・実現したいこと

現在HealthKitを使ったアプリを作成しております
HealthKitの基本的な使い方は理解しています
イメージ説明

上記の画像のようにカレンダーにHealthKitの歩数データをいれ、
カラーアニメーションを実装したいです

試したこと

1,iosライブラリのFSCalendarを使いカレンダーの実装をここのみた

2,FSCalendarではデータの橋渡しなどができるようなサンプルが見つからないため
カレンダーを自作しデータの反映をこころみた

3、個別でカレンダーを作るのと、HealthKitのデータを取得をすることはできるが、
カレンダーに反映することができない

補足情報(FW/ツールのバージョンなど)

やり方がいまいちわかりません
どなたか教えていただけたらと思います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/09/18 08:59

状況がよくわかりませんが、HealthKitからデータを取得できるが、表示できないことが問題なのに、歩数データの取得方法を変更したいということでしょうか? 表示がうまくできないということであれば、まずは歩数データは忘れて、固定的で良いので、表示を意図したようにできることを確認してからにした方が、進めやすいかと思います。
.koji

2019/09/18 10:29

ご回答ありがとうございます。 質問の仕方に問題がありました。 申し訳ありません。 根本的な部分で、 ユーザーの、1日分の歩数データを取得することは、 HealthKit、CoreMotion 両方の取得方法が可能でして、 HealthKitのHKStatisticsCollectionQueryで 何日〜何日までの歩数を取り出し、 UICollectionView、UITableViewなどをつかって、実際にViewにCellを自動生成させて、 期間指定分の歩数を表示させることは可能なのですが、 上記の画像のように、 カレンダーのCellに歩数を表示させる方法が分からない状態であります わかりにくい質問で申し訳ありません。
t_obara

2019/09/18 10:47

> カレンダーのCellに歩数を表示させる方法が分からない のですよね?であれば、まずはそこから単体でトライしてみては?という提案です。
.koji

2019/09/18 11:00

ご回答ありがとうございます。 何度も申し訳ありません。 出直してまいります。
guest

回答1

0

ベストアンサー

https://github.com/BlueEventHorizon/CalendarManager
こちらにサンプルを上げてみました。

1) Info.plistにカレンダーへのアクセス理由を記述します。NSCalendarsUsageDescriptionがキーになります。
2) コードは以下のようなものです。
まずはカレンダーへのアクセスを許可するための処理です。

swift

1import EventKit 2 3lazy private var eventStore: EKEventStore = { return EKEventStore() }() 4 lazy private var defaultCalendar = { return eventStore.defaultCalendarForNewEvents }() 5 lazy public private(set) var calendars: [EKCalendar] = { return [EKCalendar]() }() 6 7// 認証ステータスを取得 8 public func authorize(completion: ((_ result: Bool) -> Void)? ) { 9 guard InfoPlistUtil.calendarsUsageDescription != nil else { 10 logger.fatal("No info.plist property for Calendar") 11 return 12 } 13 14 // 認証ステータスを取得 15 let status = EKEventStore.authorizationStatus(for: .event) 16 17 switch status { 18 case .notDetermined: 19 // 未決定なのでOSダイアログを表示 20 eventStore.requestAccess(to: .event, completion: { (granted, _) in 21 completion?(granted) 22 }) 23 24 case .denied: 25 logger.debug("denied") 26 completion?(false) 27 28 case .authorized: 29 logger.debug("authorized") 30 completion?(true) 31 32 case .restricted: 33 logger.debug("restricted") 34 completion?(false) 35 @unknown default: 36 logger.error("no switch case") 37 } 38 }

  
3)カレンダーへの書き込みは以下のようになります。

swift

1public func addEvent(title: String, start: Date, end: Date? = nil) { 2 let defaultCalendar = eventStore.defaultCalendarForNewEvents 3 // イベントを作成して情報をセット 4 let event = EKEvent(eventStore: eventStore) 5 event.title = title 6 event.startDate = start 7 event.endDate = end ?? Calendar.standard.date(byAdding: .hour, value: 2, to: start) 8 event.calendar = defaultCalendar 9 // イベントの登録 10 do { 11 try eventStore.save(event, span: .thisEvent) 12 } catch let error { 13 print(error) 14 } 15 }

くらしくは、Githubのコードを動かしていただいた方が分かり易いかもしれません。

投稿2019/09/18 12:04

k2moons

総合スコア184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.koji

2019/09/18 12:38

回答ありがとうございます! 早速動かしてみます
k2moons

2019/09/19 10:03

そう言えば、上のコードでCalendar.standardは自作のextensionでした! Calendar.currentで大丈夫かと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問