Version: 1.0.0 Platforms: macOS, iOS, tvOS Created by: Jordan Koch Date: 2025-11-21
| Platform | Minimum Version | Versions Supported |
|---|---|---|
| macOS | 13.0 (Ventura) | macOS 13, 14 (Sonoma), 15 (Sequoia) |
| iOS | 16.0 | iOS 16, 17, 18 |
| tvOS | 16.0 | tvOS 16, 17, 18 |
MACOSX_DEPLOYMENT_TARGET = 13.0
IPHONEOS_DEPLOYMENT_TARGET = 16.0
TVOS_DEPLOYMENT_TARGET = 16.0
✅ Fully Supported
- Full window management
- Mouse/trackpad interaction
- Keyboard shortcuts
- Menu bar integration
- Camera QR scanning
- Multi-window support
✅ Fully Supported
- Touch gestures
- Camera QR scanning
- Portrait/landscape orientation
- Dynamic Type support
- Accessibility features
- Compact and regular size classes
✅ Supported with Adaptations
- Siri Remote navigation
- Focus engine optimization
- Large, touch-friendly UI
- ❌ No camera (manual entry only)
- Card-based navigation
- Distance viewing optimization
// Window sizing
.frame(minWidth: 800, minHeight: 600)
.windowStyle(.hiddenTitleBar)
// Fixed window size with resize capability// Full screen with safe area insets
// Adaptive layout for different device sizes
// Support for split view and slide over// Focus-driven navigation
.focusable(true)
.buttonStyle(.card)
// Larger hit targets
// Distance-optimized text sizes| Element | macOS | iOS | tvOS |
|---|---|---|---|
| Header | 28pt | 34pt | 52pt |
| Body | 14pt | 16pt | 29pt |
| Caption | 11pt | 12pt | 23pt |
| Element | macOS | iOS | tvOS |
|---|---|---|---|
| List Item Padding | 12pt | 16pt | 24pt |
| Card Corner Radius | 8pt | 12pt | 16pt |
| Icon Size | 60pt | 60pt | 80pt |
#if os(macOS)
// macOS-specific code
import AppKit
typealias PlatformColor = NSColor
#elseif os(iOS)
// iOS-specific code
import UIKit
typealias PlatformColor = UIColor
#elseif os(tvOS)
// tvOS-specific code
import UIKit
typealias PlatformColor = UIColor
#endif// Camera scanning
#if os(tvOS)
// tvOS doesn't have camera - show manual entry only
#else
// macOS and iOS support camera scanning
#endif
// Window management
#if os(macOS)
.windowStyle(.hiddenTitleBar)
#endif
// Focus engine
#if os(tvOS)
.focusable(true)
#endif-
Open in Xcode:
cd /Volumes/Data/xcode/HomeKitAdopter open HomeKitAdopter.xcodeproj -
Select Target:
- Choose "HomeKitAdopter" scheme
- Select destination:
- "My Mac" for macOS
- iPhone/iPad simulator for iOS
- Apple TV simulator for tvOS
-
Enable Code Signing:
- Select target → Signing & Capabilities
- Enable "Automatically manage signing"
- Select your Team
- Xcode will configure provisioning profiles
-
Add HomeKit Capability:
- Click "+ Capability"
- Add "HomeKit"
- Entitlements added automatically
xcodebuild \
-project HomeKitAdopter.xcodeproj \
-scheme HomeKitAdopter \
-destination 'platform=macOS' \
-configuration Release \
buildxcodebuild \
-project HomeKitAdopter.xcodeproj \
-scheme HomeKitAdopter \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
-configuration Release \
buildxcodebuild \
-project HomeKitAdopter.xcodeproj \
-scheme HomeKitAdopter \
-destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation)' \
-configuration Release \
build-
No Camera Support
- QR code scanning not available
- Users must enter 8-digit code manually
- UI automatically hides scan button
-
No Keyboard
- Text entry via on-screen keyboard
- Consider using digit-by-digit entry for codes
-
Focus-Driven Navigation
- All interactive elements must be focusable
- Requires card-style buttons
- Test with Siri Remote
-
Distance Viewing
- Larger fonts required
- Higher contrast needed
- Bigger hit targets (min 250pt)
-
Device Sizes
- Support iPhone SE (small) to iPhone 15 Pro Max (large)
- iPad support with split view
- Landscape and portrait orientations
-
Camera Privacy
- Request camera permission
- Handle denial gracefully
- Provide manual entry fallback
-
Background Behavior
- App may be suspended
- HomeKit operations may timeout
- Implement state restoration
-
Window Management
- Support resizing
- Handle multiple windows
- Remember window position
-
Input Methods
- Keyboard shortcuts
- Menu bar actions
- Mouse/trackpad gestures
<key>NSHomeKitUsageDescription</key>
<string>HomeKit access is required to discover, pair, and manage HomeKit accessories.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>Local network access is required to discover HomeKit accessories on your network.</string>
<key>NSBonjourServices</key>
<array>
<string>_hap._tcp</string>
<string>_hap._udp</string>
<string>_homekit._tcp</string>
</array><key>NSCameraUsageDescription</key>
<string>Camera access is required to scan HomeKit setup codes (QR codes) from device labels.</string>- Window resizing works
- Menu bar items functional
- Keyboard navigation
- Camera scanning (if available)
- Multi-window support
- Dark mode support
- iPhone sizes (SE, standard, Plus/Max)
- iPad sizes (regular, Pro)
- Portrait orientation
- Landscape orientation
- Split view
- Slide over
- Camera scanning
- Dynamic Type
- VoiceOver
- Dark mode
- Siri Remote navigation
- Focus engine behavior
- Button focus states
- Manual code entry
- Large text readability
- Distance viewing (10 feet)
- Card button styling
- No camera features shown
- Window Size: Minimum 800x600
- Click Targets: Minimum 44x44 points
- Typography: SF Pro Text
- Color: Support light and dark mode
- Spacing: 8pt grid system
- Touch Targets: Minimum 44x44 points
- Typography: SF Pro Text with Dynamic Type
- Safe Area: Respect safe area insets
- Spacing: 8pt grid system
- Accessibility: Support all accessibility features
- Focus Targets: Minimum 250x90 points
- Typography: SF Pro Display (larger sizes)
- Viewing Distance: Optimize for 10 feet
- Focus Engine: All interactive elements must be focusable
- Spacing: 50pt minimum between elements
HomeKitAdopter/
├── PlatformHelpers.swift # Platform abstractions
├── HomeKitAdopterApp.swift # Entry point (all platforms)
├── ContentView.swift # Main view (adaptive)
├── Managers/
│ ├── HomeKitDiscoveryManager.swift # Platform-agnostic
│ ├── HomeManagerWrapper.swift # Platform-agnostic
│ └── LoggingManager.swift # Platform-agnostic
└── Views/
├── AccessoryRowView.swift # Adaptive layout
├── PairingView.swift # Adaptive layout
├── AccessorySetupView.swift # Adaptive layout
└── SetupCodeScannerView.swift # Platform-conditional
// In PlatformHelpers.swift
struct PlatformConstants {
static var isTV: Bool {
#if os(tvOS)
return true
#else
return false
#endif
}
static var isMac: Bool {
#if os(macOS)
return true
#else
return false
#endif
}
static var isiOS: Bool {
#if os(iOS)
return true
#else
return false
#endif
}
}- Code signed with Developer ID
- Notarized by Apple
- Hardened runtime enabled
- Sandbox entitlements configured
- Privacy manifest included
- App Store icon (1024x1024)
- Launch screen
- App privacy details
- Screenshot for all device sizes
- App Store description
- App Store icon (1280x768)
- Top Shelf image
- tvOS-specific screenshots
- Focus on large display experience
- Siri Remote usage documented
Issue: Window doesn't appear Solution: Check window level and z-order
Issue: Camera not working Solution: Grant camera permission in System Preferences
Issue: Layout issues on different devices Solution: Use adaptive layout with size classes
Issue: App crashes on iPad Solution: Test with both split view and full screen
Issue: Can't navigate with remote
Solution: Ensure all buttons have .focusable(true)
Issue: Text too small Solution: Use tvOS-specific font sizes (see table above)
- Use efficient window management
- Minimize redraws
- Optimize for Retina displays
- Support low power mode
- Optimize for battery life
- Handle memory warnings
- Optimize for focus changes
- Preload focus states
- Large image optimization
- watchOS companion app
- iPad Pro Magic Keyboard support
- macOS Touch Bar support (if available)
- visionOS support (spatial computing)
- Handoff between devices
- iCloud sync for homes/settings
| Feature | macOS | iOS | tvOS |
|---|---|---|---|
| Network Discovery | ✅ | ✅ | ✅ |
| Manual Code Entry | ✅ | ✅ | ✅ |
| QR Code Scanning | ✅ | ✅ | ❌ |
| Home Management | ✅ | ✅ | ✅ |
| Room Management | ✅ | ✅ | ✅ |
| Accessory Pairing | ✅ | ✅ | ✅ |
| Multi-Window | ✅ | ❌ | ❌ |
| Split View | ❌ | ✅ | ❌ |
| Focus Engine | ❌ | ❌ | ✅ |
Last Updated: 2025-11-21 Maintained by: Jordan Koch
For questions or issues, refer to the main README.md or check the logs at:
- macOS/iOS:
~/Library/Application Support/HomeKitAdopter/Logs/ - tvOS: Not accessible (use Xcode console)