Agent skills for iOS, iPadOS, Swift, SwiftUI, and modern Apple framework development.
71
89%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Overflow reference for the homekit skill. Contains advanced patterns
that exceed the main skill file's scope.
@Observableimport HomeKit
import SwiftUI
@Observable
@MainActor
final class HomeStore: NSObject {
static let shared = HomeStore()
let homeManager = HMHomeManager()
var homes: [HMHome] = []
var primaryHome: HMHome?
var isAuthorized = false
override init() {
super.init()
homeManager.delegate = self
}
var accessories: [HMAccessory] {
primaryHome?.accessories ?? []
}
var rooms: [HMRoom] {
primaryHome?.rooms ?? []
}
func addHome(name: String) async throws {
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
homeManager.addHome(withName: name) { home, error in
if let error {
continuation.resume(throwing: error)
} else {
continuation.resume()
}
}
}
}
}
extension HomeStore: HMHomeManagerDelegate {
nonisolated func homeManagerDidUpdateHomes(_ manager: HMHomeManager) {
Task { @MainActor in
homes = manager.homes
primaryHome = manager.primaryHome
}
}
nonisolated func homeManager(
_ manager: HMHomeManager,
didUpdate status: HMHomeManagerAuthorizationStatus
) {
Task { @MainActor in
isAuthorized = status.contains(.authorized)
}
}
nonisolated func homeManager(
_ manager: HMHomeManager,
didAdd home: HMHome
) {
Task { @MainActor in
homes = manager.homes
}
}
nonisolated func homeManager(
_ manager: HMHomeManager,
didRemove home: HMHome
) {
Task { @MainActor in
homes = manager.homes
}
}
}struct AccessoryListView: View {
@State private var homeStore = HomeStore.shared
var body: some View {
NavigationStack {
Group {
if !homeStore.isAuthorized {
ContentUnavailableView(
"HomeKit Access Required",
systemImage: "house.fill",
description: Text("Grant access in Settings to manage your home.")
)
} else if homeStore.accessories.isEmpty {
ContentUnavailableView(
"No Accessories",
systemImage: "lightbulb",
description: Text("Add accessories using the Home app.")
)
} else {
accessoryList
}
}
.navigationTitle(homeStore.primaryHome?.name ?? "Home")
}
}
private var accessoryList: some View {
List {
ForEach(homeStore.rooms, id: \.uniqueIdentifier) { room in
Section(room.name) {
let roomAccessories = homeStore.accessories.filter {
$0.room?.uniqueIdentifier == room.uniqueIdentifier
}
ForEach(roomAccessories, id: \.uniqueIdentifier) { accessory in
AccessoryRow(accessory: accessory)
}
}
}
}
}
}
struct AccessoryRow: View {
let accessory: HMAccessory
var body: some View {
HStack {
Image(systemName: iconName)
VStack(alignment: .leading) {
Text(accessory.name)
.font(.headline)
Text(accessory.isReachable ? "Reachable" : "Not Reachable")
.font(.caption)
.foregroundStyle(accessory.isReachable ? .green : .secondary)
}
}
}
private var iconName: String {
switch accessory.category.categoryType {
case HMAccessoryCategoryTypeLightbulb: return "lightbulb.fill"
case HMAccessoryCategoryTypeThermostat: return "thermometer"
case HMAccessoryCategoryTypeLock: return "lock.fill"
case HMAccessoryCategoryTypeSwitch: return "light.switch.2"
default: return "house.fill"
}
}
}struct LightControlView: View {
let accessory: HMAccessory
@State private var isOn = false
@State private var brightness: Double = 100
private var lightbulbService: HMService? {
accessory.services.first {
$0.serviceType == HMServiceTypeLightbulb
}
}
private var powerCharacteristic: HMCharacteristic? {
lightbulbService?.characteristics.first {
$0.characteristicType == HMCharacteristicTypePowerState
}
}
private var brightnessCharacteristic: HMCharacteristic? {
lightbulbService?.characteristics.first {
$0.characteristicType == HMCharacteristicTypeBrightness
}
}
var body: some View {
VStack {
Toggle("Power", isOn: $isOn)
.onChange(of: isOn) { _, newValue in
powerCharacteristic?.writeValue(newValue) { _ in }
}
if isOn {
Slider(value: $brightness, in: 0...100, step: 1)
.onChange(of: brightness) { _, newValue in
brightnessCharacteristic?.writeValue(
Int(newValue)
) { _ in }
}
Text("Brightness: \(Int(brightness))%")
}
}
.padding()
.task { await readCurrentState() }
}
private func readCurrentState() async {
powerCharacteristic?.readValue { _ in
if let value = powerCharacteristic?.value as? Bool {
isOn = value
}
}
brightnessCharacteristic?.readValue { _ in
if let value = brightnessCharacteristic?.value as? Int {
brightness = Double(value)
}
}
}
}extension HomeStore: HMHomeDelegate {
nonisolated func home(
_ home: HMHome,
didAdd accessory: HMAccessory
) {
accessory.delegate = self
Task { @MainActor in
// Refresh accessory list
}
}
nonisolated func home(
_ home: HMHome,
didRemove accessory: HMAccessory
) {
Task { @MainActor in
// Refresh accessory list
}
}
nonisolated func home(
_ home: HMHome,
didAdd room: HMRoom
) {
Task { @MainActor in
// Refresh room list
}
}
nonisolated func home(
_ home: HMHome,
didUpdateNameFor room: HMRoom
) {
Task { @MainActor in
// Update room name display
}
}
}extension HomeStore: HMAccessoryDelegate {
nonisolated func accessory(
_ accessory: HMAccessory,
service: HMService,
didUpdateValueFor characteristic: HMCharacteristic
) {
Task { @MainActor in
// Update UI for the changed characteristic
let newValue = characteristic.value
print("\(accessory.name).\(characteristic.characteristicType) = \(newValue ?? "nil")")
}
}
nonisolated func accessoryDidUpdateReachability(
_ accessory: HMAccessory
) {
Task { @MainActor in
print("\(accessory.name) reachable: \(accessory.isReachable)")
}
}
nonisolated func accessoryDidUpdateName(
_ accessory: HMAccessory
) {
Task { @MainActor in
// Refresh name display
}
}
}// Find all thermostats in the home
let thermostats = home.servicesWithTypes([HMServiceTypeThermostat]) ?? []
for service in thermostats {
let currentTemp = service.characteristics.first {
$0.characteristicType == HMCharacteristicTypeCurrentTemperature
}
let targetTemp = service.characteristics.first {
$0.characteristicType == HMCharacteristicTypeTargetTemperature
}
currentTemp?.readValue { _ in
print("Current: \(currentTemp?.value ?? "?")")
}
}| Constant | Description |
|---|---|
HMServiceTypeLightbulb | Light control (on/off, brightness, color) |
HMServiceTypeThermostat | Temperature control |
HMServiceTypeLockMechanism | Door lock |
HMServiceTypeGarageDoorOpener | Garage door |
HMServiceTypeSwitch | Generic on/off switch |
HMServiceTypeMotionSensor | Motion detection |
HMServiceTypeTemperatureSensor | Temperature reading |
HMServiceTypeContactSensor | Door/window open/close |
| Constant | Value Type | Description |
|---|---|---|
HMCharacteristicTypePowerState | Bool | On/off |
HMCharacteristicTypeBrightness | Int (0-100) | Light brightness |
HMCharacteristicTypeHue | Float (0-360) | Light hue |
HMCharacteristicTypeSaturation | Float (0-100) | Light saturation |
HMCharacteristicTypeCurrentTemperature | Float | Celsius reading |
HMCharacteristicTypeTargetTemperature | Float | Celsius target |
HMCharacteristicTypeLockCurrentState | Int | Lock state (0=unsecured) |
HMCharacteristicTypeLockTargetState | Int | Lock target state |
import MatterSupport
final class MyMatterHandler: MatterAddDeviceExtensionRequestHandler {
override func validateDeviceCredential(
_ deviceCredential: DeviceCredential
) async throws {
// Validate the Device Attestation Certificate (DAC) against
// your Product Attestation Authority (PAA) root certificates.
let dac = deviceCredential.deviceAttestationCertificate
let pai = deviceCredential.productAttestationIntermediateCertificate
let cd = deviceCredential.certificationDeclaration
// If validation fails, throw an error to reject the device
guard isValidCertificateChain(dac: dac, pai: pai, cd: cd) else {
throw MatterCommissioningError.invalidCredential
}
}
override func rooms(
in home: MatterAddDeviceRequest.Home?
) async -> [MatterAddDeviceRequest.Room] {
// Fetch rooms from your backend for the given home
guard let home else { return [] }
let roomNames = await fetchRoomsFromBackend(homeName: home.displayName)
return roomNames.map { MatterAddDeviceRequest.Room(displayName: $0) }
}
override func configureDevice(
named name: String,
in room: MatterAddDeviceRequest.Room?
) async {
// Save device configuration to your ecosystem backend
await saveDeviceToBackend(
deviceName: name,
roomName: room?.displayName
)
}
override func commissionDevice(
in home: MatterAddDeviceRequest.Home?,
onboardingPayload: String,
commissioningID: UUID
) async throws {
// Commission the device into your Matter fabric
// using the Matter framework (MTRDeviceController)
try await commissionToFabric(
payload: onboardingPayload,
commissioningID: commissioningID
)
}
override func selectWiFiNetwork(
from networks: [WiFiScanResult]
) async throws -> WiFiNetworkAssociation {
// Use the system default network or specify one
return .defaultSystemNetwork
}
override func selectThreadNetwork(
from networks: [ThreadScanResult]
) async throws -> ThreadNetworkAssociation {
return .defaultSystemNetwork
}
}// Enable verbose logging during development
#if DEBUG
import os
let homeKitLog = Logger(subsystem: "com.example.app", category: "HomeKit")
func logAccessories() {
guard let home = homeManager.primaryHome else { return }
for accessory in home.accessories {
homeKitLog.debug("Accessory: \(accessory.name), reachable: \(accessory.isReachable)")
for service in accessory.services {
homeKitLog.debug(" Service: \(service.localizedDescription ?? service.serviceType)")
}
}
}
#endifskills
accessorysetupkit
references
activitykit
references
adattributionkit
references
alarmkit
references
app-clips
app-intents
references
app-store-optimization
app-store-review
apple-on-device-ai
appmigrationkit
references
audioaccessorykit
references
authentication
references
avkit
references
background-processing
references
browserenginekit
references
callkit
references
carplay
references
cloudkit
references
contacts-framework
references
core-bluetooth
references
core-data
core-motion
references
core-nfc
references
coreml
references
cryptokit
references
cryptotokenkit
references
debugging-instruments
device-integrity
references
dockkit
references
energykit
references
eventkit
references
financekit
references
focus-engine
gamekit
references
healthkit
references
homekit
references
ios-accessibility
ios-localization
ios-networking
ios-simulator
references
mapkit
metrickit
references
musickit
references
natural-language
references
paperkit
references
passkit
references
pdfkit
references
pencilkit
references
permissionkit
references
photokit
push-notifications
realitykit
references
relevancekit
references
scenekit
references
sensorkit
references
speech-recognition
spritekit
references
storekit
swift-api-design-guidelines
swift-architecture
swift-charts
references
swift-codable
swift-concurrency
swift-formatstyle
swift-language
swift-security
references
swift-testing
swiftdata
swiftlint
swiftui-animation
swiftui-gestures
references
swiftui-layout-components
swiftui-liquid-glass
references
swiftui-patterns
swiftui-performance
swiftui-uikit-interop
swiftui-webkit
tabletopkit
references
tipkit
references
vision-framework
weatherkit
references
widgetkit
references