Complete rename across all bundle IDs, App Groups, CloudKit containers, StoreKit product IDs, data store filenames, URL schemes, logger subsystems, Swift identifiers, user-facing strings (7 languages), file names, directory names, Xcode project, schemes, assets, and documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
250 lines
7.5 KiB
Markdown
250 lines
7.5 KiB
Markdown
# Apple Platform Features
|
|
|
|
This document covers the new Apple-specific features integrated into Reflect, including how to trigger and test each one.
|
|
|
|
---
|
|
|
|
## 1. Control Center Widget
|
|
|
|
**File:** `ReflectWidget/ReflectMoodControlWidget.swift` (ReflectMoodControlWidget)
|
|
|
|
**What it does:** Adds a quick-access button to Control Center that opens Reflect to log your mood.
|
|
|
|
### How to Add to Control Center
|
|
1. Open **Settings** > **Control Center**
|
|
2. Scroll down to find **Reflect - Log Mood**
|
|
3. Tap the **+** button to add it
|
|
4. Alternatively: Swipe down from top-right, tap **+** button, find Reflect
|
|
|
|
### How to Test
|
|
1. Add the widget to Control Center (steps above)
|
|
2. Open Control Center (swipe down from top-right corner)
|
|
3. Tap the "Log Mood" button
|
|
4. Reflect app should open
|
|
|
|
### Implementation Details
|
|
- Uses `ControlWidget` and `StaticControlConfiguration`
|
|
- `OpenReflectIntent` (AppIntent) handles the button tap
|
|
- `openAppWhenRun = true` ensures the app opens
|
|
|
|
---
|
|
|
|
## 2. HealthKit State of Mind API
|
|
|
|
**File:** `Shared/HealthKitManager.swift`
|
|
|
|
**What it does:** Syncs mood entries to Apple Health using the State of Mind API, allowing users to see mood correlations with sleep, exercise, and other health metrics.
|
|
|
|
### Setup Required
|
|
1. Enable HealthKit in **Settings** > **Reflect** > **Health**
|
|
2. Grant write permission for "State of Mind"
|
|
|
|
### How to Test
|
|
1. Go to Reflect settings and enable HealthKit sync
|
|
2. Log a mood entry
|
|
3. Open **Apple Health** app
|
|
4. Go to **Browse** > **Mental Wellbeing** > **State of Mind**
|
|
5. Your mood entry should appear with the corresponding valence
|
|
|
|
### Mood to Valence Mapping
|
|
| Mood | Valence | HealthKit Labels |
|
|
|------|---------|------------------|
|
|
| Horrible | -1.0 | stressed, anxious |
|
|
| Bad | -0.5 | sad, discouraged |
|
|
| Average | 0.0 | peaceful, content |
|
|
| Good | 0.5 | happy, joyful |
|
|
| Great | 1.0 | excited, grateful |
|
|
|
|
### Implementation Details
|
|
- Uses `HKStateOfMind` with `kind: .dailyMood`
|
|
- Valence ranges from -1.0 (very unpleasant) to 1.0 (very pleasant)
|
|
- Automatically syncs when mood is logged (if enabled)
|
|
|
|
---
|
|
|
|
## 3. App Intents / Siri Shortcuts
|
|
|
|
**File:** `Shared/AppShortcuts.swift`
|
|
|
|
**What it does:** Enables voice-activated mood logging via Siri and adds shortcuts to the Shortcuts app.
|
|
|
|
### Available Shortcuts
|
|
|
|
#### Log Mood
|
|
- **Phrases:**
|
|
- "Log my mood in Reflect"
|
|
- "Log mood as [mood] in Reflect"
|
|
- "Record my mood in Reflect"
|
|
- "I'm feeling [mood] in Reflect"
|
|
- "Track my mood in Reflect"
|
|
|
|
#### Check Today's Mood
|
|
- **Phrases:**
|
|
- "What's my mood today in Reflect"
|
|
- "Check today's mood in Reflect"
|
|
- "How am I feeling in Reflect"
|
|
|
|
#### Get Mood Streak
|
|
- **Phrases:**
|
|
- "What's my mood streak in Reflect"
|
|
- "Check my streak in Reflect"
|
|
- "How many days in a row in Reflect"
|
|
|
|
### How to Test
|
|
1. Say "Hey Siri, log my mood in Reflect"
|
|
2. Siri will prompt you to select a mood (Horrible, Bad, Average, Good, Great)
|
|
3. Confirm selection
|
|
4. Siri responds with confirmation and shows a visual snippet
|
|
|
|
### How to Add to Shortcuts App
|
|
1. Open **Shortcuts** app
|
|
2. Tap **+** to create new shortcut
|
|
3. Search for "Reflect"
|
|
4. Available actions: Log Mood, Check Today's Mood, Get Mood Streak
|
|
|
|
### Implementation Details
|
|
- `MoodEntity` provides the mood options for Siri parameter selection
|
|
- `LogMoodIntent` saves to DataController and optionally syncs to HealthKit
|
|
- `MoodLoggedSnippetView` shows visual confirmation in Siri
|
|
|
|
---
|
|
|
|
## 4. Custom Tips System
|
|
|
|
**Files:**
|
|
- `Shared/ReflectTips.swift` (Tips definitions and manager)
|
|
- `Shared/Views/TipModalView.swift` (Modal UI)
|
|
|
|
**What it does:** Shows themed modal tips to help users discover features throughout the app. Tips appear as beautiful sheets that match the app's current theme.
|
|
|
|
### Available Tips
|
|
|
|
| Tip | Location | Trigger |
|
|
|-----|----------|---------|
|
|
| CustomizeLayoutTip | Customize screen | First visit |
|
|
| AIInsightsTip | Insights tab | After 7 moods logged |
|
|
| SiriShortcutTip | Settings | After 3 mood logs |
|
|
| HealthKitSyncTip | Settings | After viewing settings |
|
|
| WidgetVotingTip | Day view | After 2 days usage |
|
|
| TimeViewTip | Day view | First visit |
|
|
| MoodStreakTip | Day view | When streak >= 3 |
|
|
|
|
### How to Test
|
|
1. Tips appear automatically based on conditions (one per session)
|
|
2. To reset tips for testing:
|
|
```swift
|
|
ReflectTipsManager.shared.resetAllTips()
|
|
```
|
|
3. To disable tips globally:
|
|
```swift
|
|
ReflectTipsManager.shared.tipsEnabled = false
|
|
```
|
|
|
|
### Implementation Details
|
|
- `ReflectTipsManager.shared.resetSession()` called in `ReflectApp.init()`
|
|
- Each tip has `isEligible` property based on user activity parameters
|
|
- Tips show as themed modal sheets with gradient headers
|
|
- Only one tip shown per app session
|
|
|
|
---
|
|
|
|
## 5. Live Activities
|
|
|
|
**Files:**
|
|
- `Shared/MoodStreakActivity.swift` (Manager + Attributes)
|
|
- `ReflectWidget/ReflectMoodControlWidget.swift` (Widget views)
|
|
|
|
**What it does:** Shows mood streak progress on the Lock Screen and Dynamic Island.
|
|
|
|
### How to Start a Live Activity
|
|
```swift
|
|
// In your code where you want to start tracking
|
|
await LiveActivityManager.shared.startStreakActivity(
|
|
streak: currentStreak,
|
|
lastMood: todaysMood,
|
|
hasLoggedToday: true
|
|
)
|
|
```
|
|
|
|
### How to Update After Mood Log
|
|
```swift
|
|
LiveActivityManager.shared.updateActivity(
|
|
streak: newStreak,
|
|
mood: loggedMood
|
|
)
|
|
```
|
|
|
|
### How to End Activity
|
|
```swift
|
|
await LiveActivityManager.shared.endAllActivities()
|
|
```
|
|
|
|
### Live Activity Views
|
|
|
|
#### Lock Screen View
|
|
- Shows flame icon with streak count
|
|
- Displays today's mood with color indicator
|
|
- Shows "Don't break your streak!" prompt if not logged
|
|
|
|
#### Dynamic Island
|
|
- **Compact:** Flame icon + streak number
|
|
- **Expanded:** Full streak info, mood status, voting window countdown
|
|
- **Minimal:** Flame icon only
|
|
|
|
### How to Test
|
|
1. Ensure Live Activities are enabled: **Settings** > **Reflect** > **Live Activities**
|
|
2. Start a Live Activity (see code above)
|
|
3. Lock your phone to see Lock Screen view
|
|
4. On iPhone 14 Pro+, check Dynamic Island
|
|
|
|
### Requirements
|
|
- iPhone with iOS 16.1+ (Lock Screen)
|
|
- iPhone 14 Pro/Pro Max+ for Dynamic Island
|
|
- `NSSupportsLiveActivities = true` in Info.plist (already configured)
|
|
|
|
### Implementation Details
|
|
- `MoodStreakAttributes` defines the activity data structure
|
|
- `ActivityConfiguration` renders both Lock Screen and Dynamic Island
|
|
- Activities automatically end at midnight via `scheduleActivityEnd()`
|
|
|
|
---
|
|
|
|
## Entry Types
|
|
|
|
New entry types added to track mood entry sources:
|
|
|
|
| Type | Raw Value | Description |
|
|
|------|-----------|-------------|
|
|
| `.siri` | 7 | Logged via Siri voice command |
|
|
| `.controlCenter` | 8 | Logged via Control Center widget |
|
|
| `.liveActivity` | 9 | Logged via Live Activity tap |
|
|
|
|
---
|
|
|
|
## Entitlements & Info.plist
|
|
|
|
### Entitlements (`Reflect (iOS).entitlements`)
|
|
- `com.apple.developer.healthkit` - HealthKit access
|
|
- `com.apple.developer.healthkit.access` - health-records
|
|
|
|
### Info.plist (`Reflect--iOS--Info.plist`)
|
|
- `NSSupportsLiveActivities` - Enables Live Activities
|
|
- `NSHealthShareUsageDescription` - HealthKit read permission description
|
|
- `NSHealthUpdateUsageDescription` - HealthKit write permission description
|
|
|
|
### Widget Info.plist (`ReflectWidgetExtension-Info.plist`)
|
|
- `NSSupportsLiveActivities` - Enables Live Activity widget
|
|
|
|
---
|
|
|
|
## Testing Checklist
|
|
|
|
- [ ] Control Center widget appears and opens app
|
|
- [ ] Siri responds to "Log my mood in Reflect"
|
|
- [ ] Siri shows mood options and confirms selection
|
|
- [ ] HealthKit sync writes State of Mind entries
|
|
- [ ] Tips appear at appropriate times
|
|
- [ ] Live Activity shows on Lock Screen
|
|
- [ ] Dynamic Island updates (iPhone 14 Pro+)
|
|
- [ ] Entry types correctly recorded in database
|