【MindHub開発ログ】 Vol.1 — 機能紹介とiCloud同期の裏側

はじめに

 こんにちは、hajiharuです。

 MindHub は「日々の出来事を記録し、自分の心と向き合う」ための個人開発アプリです。

 この開発ログシリーズでは、アプリに実装した機能や、開発中に直面した壁や学びを共有していきます。

 今回はアプリに実装済みの「ポジティブイベント記録・表示」機能「iCloud同期」 について紹介します。

機能その1:ポジティブな出来事を記録する

 現在のメイン機能は「ポジティブイベント記録機能」です。

 その日にあったポジティブな出来事を記録できるシンプルな機能です。人はネガティブな出来事の方に注意が向きやすいので、意識してポジティブなことに目を向けることによりメンタルが安定しやすくなります。

イベント追加画面
  • タイトルと詳細を入力して保存
  • 日付は自動で紐づく(必要なら変更することも可能)

機能その2:リスト&カレンダーで振り返る

 追加したデータはリスト表示カレンダー表示で振り返ることができます。

 リスト表示では、追加したデータが月ごとにグルーピングされて表示されます。展開・折りたたみができるシンプルなUIにしています。

リスト画面

コード(SwiftUI: 月ごとのグループ化処理)

private static func buildMonthSections(from events: [PositiveEvent]) -> [MonthSection] {
    var cal = Calendar(identifier: .gregorian)
    cal.timeZone = TimeZone(identifier: "Asia/Tokyo") ?? .current
    
    let byDay = Dictionary(grouping: events) { cal.startOfDay(for: $0.date) }
    let daySecs = byDay.map { DaySection(day: $0.key, items: $0.value.sorted { $0.date > $1.date }) }
    
    let byMonth = Dictionary(grouping: daySecs) { sec -> MonthKey in
        let c = cal.dateComponents([.year, .month], from: sec.day)
        return MonthKey(year: c.year ?? 0, month: c.month ?? 0)
    }
    return byMonth.map { MonthSection(key: $0.key, days: $0.value) }
}

 カレンダー表示では、追加したデータの件数が日付ごとに表示されます。日付を選択することでその日に追加したデータを見ることができます。

カレンダー画面

iCloud同期の導入

 次に取り組んだのが CoreData + CloudKit を利用したiCloud同期です。
同じApple IDでログインしているiPhone/iPad間でデータを共有できるようになりました。

Xcode >「Signing & Capabilities」に「iCloud」を追加

コード(CoreDataの設定)

let container = NSPersistentCloudKitContainer(name: "MindHub")
guard let desc = container.persistentStoreDescriptions.first else { fatalError() }

desc.cloudKitContainerOptions = .init(containerIdentifier: "iCloud.personal.MindHub")
desc.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
desc.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

container.loadPersistentStores { _, error in
    if let error = error { fatalError("CoreData load error: \(error)") }
}

リリース後にトラブル発生

 デバッグ中は問題なく同期されていたものの、リリース後にアプリを削除 → 再インストール するとデータが復元されない問題に直面しました。

 原因は CloudKit Database でスキーマをデプロイしていなかったこと。

 本番環境に反映させるには、CloudKit Database でスキーマをデプロイする必要がありました。(そもそもコンソールがあることすら知らなかった…)

 デプロイを実行すると、無事にリリース済みのアプリでiCloud同期が使用できるようになりました!

学びと気づき

  • CoreData + CloudKitはデバッグと本番で挙動が変わるので要注意
  • ローカル削除後も「iCloudから復元される」体験はユーザーにとって安心感につながる

今後の予定

  • リマインダー機能(指定時間に「今日のポジティブ」を記録する通知)
  • 感情トラッキング(現在の感情を素早く記録)
  • さらにUIをシンプルで柔らかいデザインに

まとめ

 今回は MindHub のメイン機能とiCloud同期について紹介しました。

 個人開発だからこそ試行錯誤も含めて公開していきたいと思います。

 次回は「リマインダー機能の検討」や「ユーザー体験の改善」に触れる予定です。それではまた!


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です