SkillAtlasSkill 详情

sensorkit

86 agent skills optimized for iOS 26+ development with Swift 6.

审核状态:已审核Quality 80Security 88

复制安装命令

用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。

复制前请先查看来源、License 和安全提示。

项目 README

来源文件:README.md

抓取于 2026年8月22日

Swift iOS Skills — Agent Skills for iOS 26+ & SwiftUI Development

GitHub stars Swift 6.3 Platform Claude Code OpenAI Codex Agent Skills tessl License: PolyForm Perimeter

86 agent skills optimized for iOS 26+ development with Swift 6.3 and modern Apple frameworks. All code examples, patterns, and guidance target the latest APIs -- Liquid Glass, approachable concurrency, Foundation Models, StoreKit 2, SwiftData, async/await URLSession, and more. No deprecated patterns.

Compatible with Claude Code, OpenAI Codex, Cursor, GitHub Copilot, and 40+ other agents. Follows the open Agent Skills standard.

Every skill is self-contained. No skill depends on another. Install only what you need.

Release history: CHANGELOG.md.

Contents

Install

Recommended: any agent via skills CLI

The skills CLI is the recommended install method.

Interactive install (recommended):

npx skills add dpearson2699/swift-ios-skills

Running the default command opens the skills CLI UI so you can choose which skills to install and which agent(s) to install them for.

Install everything for any coding agent:

npx skills add dpearson2699/swift-ios-skills --all

Use --all when you want the full set of 86 skills installed automatically for any coding agent.

Install specific skills directly:

npx skills add dpearson2699/swift-ios-skills --skill <skill-name> --skill <skill-name>

Check for updates to installed skills:

npx skills check

Update installed skills to the latest versions:

npx skills update

Use these after installing through the skills CLI.

Claude Code (via plugin marketplace)

Add the marketplace (one-time):

/plugin marketplace add dpearson2699/swift-ios-skills

Install everything:

/plugin install all-ios-skills@swift-ios-skills

Or install a themed bundle (bundles limit how many skills load into the context window — if you want everything, use all-ios-skills above instead of installing multiple bundles):

/plugin install swiftui-skills@swift-ios-skills
/plugin install swift-core-skills@swift-ios-skills
/plugin install ios-app-framework-skills@swift-ios-skills
/plugin install ios-data-framework-skills@swift-ios-skills
/plugin install ios-ai-ml-skills@swift-ios-skills
/plugin install ios-engineering-skills@swift-ios-skills
/plugin install ios-hardware-skills@swift-ios-skills
/plugin install ios-platform-skills@swift-ios-skills
/plugin install ios-gaming-skills@swift-ios-skills
/plugin install apple-kit-skills@swift-ios-skills

OpenAI Codex

$skill-installer install https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/<skill-name>

Claude Web App / Claude Desktop

  1. Download the skill folder(s) you want from this repo
  2. Zip each skill folder
  3. Go to Settings > Capabilities and enable "Code execution and file creation"
  4. Go to Customize > Skills, click +, then Upload a skill
  5. Upload the zip

ChatGPT

  1. Download the skill folder(s) you want from this repo
  2. Zip each skill folder
  3. Click your profile icon in ChatGPT and select Skills
  4. Click New skill and select Upload from your computer
  5. Upload the zip

Plugin Bundles (Claude Code)

PluginSkills included
all-ios-skillsAll 86 skills
apple-kit-skills39 skills spanning Apple Kit frameworks plus CarPlay
swiftui-skillsfocus-engine, swiftui-animation, swiftui-gestures, swiftui-layout-components, swiftui-liquid-glass, swiftui-navigation, swiftui-patterns, swiftui-performance, swiftui-uikit-interop, swiftui-webkit
swift-core-skillscore-data, swift-api-design-guidelines, swift-architecture, swift-codable, swift-charts, swift-concurrency, swift-formatstyle, swift-language, swift-testing, swiftdata
ios-app-framework-skillsactivitykit, adattributionkit, alarmkit, app-clips, app-intents, avkit, carplay, mapkit, paperkit, pdfkit, photokit, push-notifications, storekit, tipkit, widgetkit
ios-data-framework-skillscloudkit, contacts-framework, eventkit, financekit, healthkit, musickit, passkit, weatherkit
ios-ai-ml-skillsapple-on-device-ai, coreml, natural-language, speech-recognition, vision-framework
ios-engineering-skillsapp-store-optimization, app-store-review, authentication, background-processing, cryptokit, debugging-instruments, device-integrity, ios-accessibility, ios-ettrace-performance, ios-localization, ios-memgraph-analysis, ios-networking, swift-security, swiftlint, ios-simulator, metrickit
ios-hardware-skillsaccessorysetupkit, core-bluetooth, core-motion, core-nfc, dockkit, pencilkit, realitykit, sensorkit
ios-platform-skillsappmigrationkit, audioaccessorykit, browserenginekit, callkit, cryptotokenkit, energykit, homekit, permissionkit, relevancekit, shareplay-activities
ios-gaming-skillsgamekit, scenekit, spritekit, tabletopkit

Skills

SwiftUI

SkillWhat it covers
focus-engine@FocusState, defaultFocus, focusSection, focused scene values, focus restoration, UIFocusGuide
swiftui-animationSpring animations, PhaseAnimator, KeyframeAnimator, matchedGeometryEffect, SF Symbols
swiftui-gesturesTap, drag, magnify, rotate, long press, simultaneous and sequential gestures
swiftui-layout-componentsGrid, LazyVGrid, Layout protocol, ViewThatFits, custom layouts
swiftui-liquid-glassiOS 26 Liquid Glass, glassEffect, GlassEffectContainer, morphing transitions
swiftui-navigationNavigationStack, NavigationSplitView, programmatic navigation, deep linking
swiftui-patterns@Observable, state ownership, environment wiring, view composition, async loading, MV-pattern architecture
swiftui-performanceRendering performance, view update optimization, layout thrash, Instruments profiling
swiftui-uikit-interopUIViewRepresentable, UIHostingController, Coordinator, incremental UIKit-to-SwiftUI migration
swiftui-webkitWebView, WebPage, navigation policies, JavaScript calls, local content, custom URL schemes

Core Swift

SkillWhat it covers
swift-api-design-guidelinesSwift API Design Guidelines -- argument labels, mutating/nonmutating pairs, documentation comments, naming conventions
swift-architectureArchitecture patterns: MV (@Observable), MVVM, MVI, TCA, Clean Architecture, Coordinator, decision framework
swift-codableSwift Codable, JSONDecoder, JSONEncoder, CodingKeys, custom decoding, nested JSON
swift-chartsBar, line, area, pie, donut, and 3D charts, scrolling, selection, annotations
swift-concurrencySwift 6.2 concurrency, Sendable, actors, structured concurrency, data-race safety
swift-formatstyleFormatStyle protocol, number/currency/date/duration/measurement formatting, custom styles
swift-languageSwift 6.3 language idioms, result builders, property wrappers, typed throws
swift-testingSwift Testing framework, @Test, @Suite, #expect, parameterized tests, mocking
core-dataCore Data persistence, NSPersistentContainer, NSFetchedResultsController, batch operations, staged migration
swiftdata@Model, @Query, #Predicate, ModelContainer, migrations, CloudKit sync, @ModelActor

App Experience Frameworks

SkillWhat it covers
activitykitActivityKit, Dynamic Island, Lock Screen Live Activities, push-to-update
adattributionkitPrivacy-preserving ad attribution, postbacks, conversion values, re-engagement
alarmkitAlarmKit system alarms and countdown timers, Lock Screen, Dynamic Island, Live Activities
app-clipsApp Clips, invocation URLs, NFC, QR, App Clip Codes, App Group handoff
app-intentsApp Intents for Siri, Shortcuts, Spotlight, widgets, and Apple Intelligence
avkitAVPlayerViewController, VideoPlayer, Picture-in-Picture, AirPlay, subtitles
carplayCarPlay templates, navigation, audio, communication, EV charging apps
mapkitMapKit, CoreLocation, annotations, geocoding, directions, geofencing
paperkitPaperMarkupViewController, markup editing, drawing, shapes (iOS 26)
pdfkitPDFView, PDFDocument, annotations, text search, form filling, thumbnails
photokitPhotosPicker, AVCaptureSession, photo library, video recording, media permissions
push-notificationsUNUserNotificationCenter, APNs, rich notifications, silent push, service extensions
storekitStoreKit 2 purchases, subscriptions, SubscriptionStoreView, transaction verification
tipkitFeature discovery tooltips, contextual tips, tip rules, tip events
widgetkitHome Screen, Lock Screen, and StandBy widgets, Control Center controls, timeline providers

Data & Service Frameworks

SkillWhat it covers
cloudkitCKContainer, CKRecord, subscriptions, sharing, CKSyncEngine, SwiftData sync
contacts-frameworkCNContactStore, fetch requests, key descriptors, CNContactPickerViewController, save requests
eventkitEKEventStore, EKEvent, EKReminder, recurrence rules, EventKitUI editors and choosers
financekitApple Card, Apple Cash, Wallet orders, transaction queries, account balances
healthkitHKHealthStore, queries, statistics, workout sessions, background delivery
musickitMusicKit authorization, catalog search, ApplicationMusicPlayer, MPRemoteCommandCenter
passkitApple Pay, PKPaymentRequest, PKPaymentAuthorizationController, Wallet passes
weatherkitWeatherService, current/hourly/daily forecasts, alerts, attribution requirements

AI & Machine Learning

SkillWhat it covers
apple-on-device-aiFoundation Models framework, Core ML, MLX Swift, on-device LLM inference
coremlCore ML model loading, prediction, MLTensor, compute unit configuration, VNCoreMLRequest, MLComputePlan
natural-languageNLTokenizer, NLTagger, sentiment analysis, language identification, embeddings, Translation
speech-recognitionSpeechAnalyzer, SpeechTranscriber, SFSpeechRecognizer, on-device recognition, audio buffer processing
vision-frameworkVision text recognition, face/barcode detection, image segmentation, VisionKit DataScannerViewController

iOS Engineering

SkillWhat it covers
app-store-optimizationASO keyword strategy, description writing, screenshot optimization, Custom Product Pages, A/B testing
app-store-reviewApp Review guidelines, rejection prevention, privacy manifests, ATT, HIG compliance
authenticationSign in with Apple, ASAuthorizationController, passkeys, biometric auth (LAContext), credential management
background-processingBGTaskScheduler, background refresh, URLSession background transfers
cryptokitSHA-2/SHA-3, HMAC, AES-GCM, ChaChaPoly, HPKE, ML-KEM/ML-DSA, P256/Curve25519 signing, ECDH, Secure Enclave
debugging-instrumentsXcode debugger, Instruments, os_signpost, MetricKit, crash symbolication
device-integrityDeviceCheck (DCDevice per-device bits), App Attest (DCAppAttestService attestation and assertion flows)
ios-accessibilityVoiceOver, Dynamic Type, custom rotors, accessibility focus, assistive-technology support
ios-ettrace-performanceETTrace launch/runtime capture, exact-build dSYM matching, processed flamegraph JSON, comparable verification
ios-localizationString Catalogs, pluralization, FormatStyle, right-to-left layout
ios-memgraph-analysisSimulator memgraph capture, leak ownership paths, reachable heap growth, raw evidence preservation
ios-networkingURLSession async/await, REST APIs, downloads/uploads, WebSockets, pagination, retry, caching
swift-securityKeychain Services, CryptoKit symmetric/asymmetric, biometric authentication, Secure Enclave, certificate trust, credential storage, OWASP compliance · Based on ivan-magda/swift-security-skill
ios-simulatorxcrun simctl commands, device lifecycle, push/location/privacy simulation, log streaming, simulator limitations
metrickitMetricManager async reports, hang/crash diagnostics, production performance telemetry
swiftlintSwiftLint setup, .swiftlint.yml, build tool plugin, rule selection, baselines, suppressions, CI integration

Hardware & Device Integration

SkillWhat it covers
accessorysetupkitPrivacy-preserving BLE/Wi-Fi accessory discovery, ASAccessorySession, picker UI
core-bluetoothCBCentralManager, CBPeripheral, BLE scanning/connecting, services, characteristics, background modes
core-motionCMMotionManager, CMPedometer, accelerometer, gyroscope, activity recognition, altitude
core-nfcNFCNDEFReaderSession, NFCTagReaderSession, NDEF reading/writing, background tag reading
dockkitDockAccessoryManager, camera subject tracking, motor control, framing
pencilkitPKCanvasView, PKDrawing, PKToolPicker, Apple Pencil drawing and annotation
realitykitRealityView, entities, anchors, ARKit world tracking, raycasting, scene understanding
sensorkitResearch-grade sensor data, ambient light, keyboard metrics, device usage (approved studies)

Platform Integration

SkillWhat it covers
appmigrationkitCross-platform data transfer, AppMigrationExtension export/import (iOS 26)
audioaccessorykitAudio accessory features, automatic switching, device placement (iOS 26.4)
browserenginekitAlternative browser engines (EU), process management, web content extensions
callkitCXProvider, CXCallController, PushKit VoIP registration, call directory extensions
cryptotokenkitTKTokenDriver, TKSmartCard, iOS 26 NFC smart cards, certificate-based auth
energykitElectricityGuidance, EnergyVenue, grid forecasts, load event submission, electricity insights
homekitHMHomeManager, accessories, rooms, actions, triggers, MatterSupport commissioning
permissionkitAskCenter, PermissionQuestion, child communication safety, CommunicationLimits
relevancekitWidget relevance signals, time/location-based relevance providers (watchOS 26)
shareplay-activitiesGroupActivity, GroupSession, GroupSessionMessenger, coordinated media playback

Gaming

SkillWhat it covers
gamekitGame Center, GKLocalPlayer, leaderboards, achievements, real-time and turn-based multiplayer
scenekitSCNView, SCNScene, 3D geometry, materials, lighting, physics, SceneView
spritekitSKScene, SKSpriteNode, SKAction, physics simulation, particle effects, SpriteView
tabletopkitMultiplayer spatial board games, pieces, cards, dice, Group Activities (visionOS)

Structure

Each skill follows the open Agent Skills standard:

skills/
  skill-name/
    SKILL.md              # Required — instructions and metadata
    references/           # Optional — detailed reference material
      some-topic.md

SKILL.md contains YAML frontmatter (name, description) and markdown instructions. The references/ folder holds longer examples, advanced patterns, and lookup tables that the main file points to.

This repository contains original instructional content and examples for Apple platform development. Where Apple frameworks, APIs, documentation, WWDC sessions, or trademarks are referenced, those materials remain the property of Apple Inc. The license for this repository applies to this project's original content only and does not claim ownership of or relicense Apple's documentation, trademarks, sample code, or other third-party materials.

Compatibility

These skills work with any agent that supports the Agent Skills standard, including:

Upgrading from v2.x

v3.0 is a major release. If you previously installed v2.x skills, note the following changes:

  • Skill count: 57 skills in v2.2.0, 76 skills in v3.0.0.

  • Skill renames: 12 existing skills renamed to use Apple Kit framework names. Old skill paths no longer resolve. Uninstall all skills and reinstall to upgrade.

    v2.x namev3.0 name
    live-activitiesactivitykit
    mapkit-locationmapkit
    photos-camera-mediaphotokit
    homekit-matterhomekit
    callkit-voipcallkit
    metrickit-diagnosticsmetrickit
    pencilkit-drawingpencilkit
    passkit-walletpasskit
    musickit-audiomusickit
    cloudkit-synccloudkit
    eventkit-calendareventkit
    realitykit-arrealitykit
  • 19 new Kit framework skills: avkit, gamekit, cryptokit, pdfkit, paperkit, spritekit, scenekit, financekit, accessorysetupkit, adattributionkit, carplay, appmigrationkit, browserenginekit, dockkit, sensorkit, tabletopkit, relevancekit, audioaccessorykit, cryptotokenkit.

  • New bundles: apple-kit-skills (all 39 Apple Kit framework skills) and ios-gaming-skills (GameKit, SpriteKit, SceneKit, TabletopKit).

  • PaperKit standalone: PaperKit content removed from pencilkit and is now its own paperkit skill.

  • Beta frameworks: permissionkit, energykit, paperkit, relevancekit, appmigrationkit, and audioaccessorykit require iOS/watchOS 26 beta and are subject to API changes before GM.

  • All skills remain self-contained: No skill references or depends on another.

To upgrade via the skills CLI:

npx skills add dpearson2699/swift-ios-skills

To upgrade Claude Code bundles, reinstall the bundles you use (old skill paths will no longer resolve).

Support

If these skills save you time or improve your workflow, you can support ongoing maintenance through GitHub Sponsors.

Support helps keep the collection current with new Apple releases, evolving framework APIs, updated examples, and compatibility work across Claude Code, Codex, Cursor, Copilot, and other agents.

Sponsors

Thanks to the following people for supporting this project:

Anthony Jr.

License

PolyForm Perimeter 1.0.0 -- see LICENSE

What this means in practice:

  • Using these skills to build your iOS app -- allowed
  • Using these skills inside a closed-source commercial workflow -- allowed
  • Forking the repo and contributing back -- allowed
  • Sharing the skills with a teammate -- allowed
  • Taking the skills, rebranding them as "Premium iOS Agent Skills," and selling them -- not allowed (that's a competing product)

This project is not affiliated with, endorsed by, or sponsored by Apple Inc.

数据与 AI研究与检索

中风险

  • 来源需自行核对维护者身份。
  • 未检测到明显脚本安装指令。
  • 未检测到明显外部权限要求。
  • 未检测到高风险命令。
  • 扫描发现:1 条。

Codex — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/sensorkit" 文件夹复制到 Codex 的 skills 目录中。
  4. 重启 Codex 让新的 skill 生效。

Codex — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Codex 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Codex 让新的 skill 生效。

Claude Code — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/sensorkit" 文件夹复制到 Claude Code 的 skills 目录中。
  4. 重启 Claude Code 让新的 skill 生效。

Claude Code — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Claude Code 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Claude Code 让新的 skill 生效。

Cursor — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/sensorkit" 文件夹复制到 Cursor 的 skills 目录中。
  4. 重启 Cursor 让新的 skill 生效。

Cursor — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Cursor 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Cursor 让新的 skill 生效。

GitHub Copilot — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/sensorkit" 文件夹复制到 GitHub Copilot 的 skills 目录中。
  4. 重启 GitHub Copilot 让新的 skill 生效。

GitHub Copilot — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 GitHub Copilot 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 GitHub Copilot 让新的 skill 生效。

Windsurf — Git Clone 安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 克隆仓库:git clone https://github.com/dpearson2699/swift-ios-skills.git
  3. 将 "skills/sensorkit" 文件夹复制到 Windsurf 的 skills 目录中。
  4. 重启 Windsurf 让新的 skill 生效。

Windsurf — 手动复制安装

  1. 安装前请先查看来源仓库和风险报告。
  2. 从源仓库下载 SKILL.md 及相关文件。
  3. 在 Windsurf 的 skills 目录中创建新文件夹。
  4. 将所有 skill 文件复制到新文件夹中。
  5. 重启 Windsurf 让新的 skill 生效。
查看 SKILL.md 原文
name: sensorkit
description: "Access research-grade sensor data using SensorKit for approved studies. Use when an app needs SensorKit entitlement setup, Research Sensor & Usage Data authorization, ambient light, recorded motion, device usage, keyboard metrics, visits, speech, face, wrist temperature, ECG, PPG, acoustic settings, or sleep-session data. Route ordinary motion to CoreMotion and health records/workouts to HealthKit."

SensorKit

Choose the exact SRSensor and verify its individual availability. Use CoreMotion for ordinary motion/activity features and HealthKit for health records and workouts.

Contents

Overview and Requirements

SensorKit enables research apps to record and fetch sensor data across iPhone and Apple Watch. The framework requires:

  1. Apple-approved research study -- submit a proposal at researchandcare.org.
  2. SensorKit entitlement -- Apple grants com.apple.developer.sensorkit.reader.allow only for approved studies.
  3. Manual provisioning profile -- Xcode requires an explicit App ID with the SensorKit capability enabled.
  4. User authorization -- the system presents a Research Sensor & Usage Data sheet that users approve per-sensor.
  5. Delayed retrieval -- design fetch timing around the canonical Data Holding Period.

An app can access up to 7 days of prior recorded data for an active sensor.

Entitlements

Add the SensorKit reader entitlement to a .entitlements file. List only the sensors Apple approved for the study. Common entitlement values include:

<key>com.apple.developer.sensorkit.reader.allow</key>
<array>
    <string>ambient-light-sensor</string>
    <string>motion-accelerometer</string>
    <string>device-usage</string>
    <string>keyboard-metrics</string>
</array>

Load the Entitlement and Usage-Detail Catalog when selecting the exact entitlement string and NSSensorKitUsageDetail key for each approved sensor. Recheck specialized sensors against their individual SRSensor pages.

For manual signing, set Code Signing Entitlements to the entitlements file, Code Signing Identity to Apple Developer, Code Signing Style to Manual, and Provisioning Profile to the explicit profile with SensorKit capability.

Info.plist Configuration

Three keys are required:

<!-- Study purpose shown in the authorization sheet -->
<key>NSSensorKitUsageDescription</key>
<string>This study monitors activity patterns for sleep research.</string>

<!-- Link to your study's privacy policy -->
<key>NSSensorKitPrivacyPolicyURL</key>
<string>https://example.com/privacy-policy</string>

<!-- Per-sensor usage explanations -->
<key>NSSensorKitUsageDetail</key>
<dict>
    <key>SRSensorUsageMotion</key>
    <dict>
        <key>Description</key>
        <string>Measures physical activity levels during the study.</string>
        <key>Required</key>
        <true/>
    </dict>
    <key>SRSensorUsageAmbientLightSensor</key>
    <dict>
        <key>Description</key>
        <string>Records ambient light to assess sleep environment.</string>
    </dict>
</dict>

If Required is true and the user denies that sensor, the system warns them that the study needs it and offers a chance to reconsider.

Use the exact usage-detail dictionary for each requested sensor. Load the Entitlement and Usage-Detail Catalog when mapping sensors beyond the motion and ambient-light examples above.

Authorization

Request authorization for the sensors your study needs. The system shows the Research Sensor & Usage Data sheet on first request.

import SensorKit

let reader = SRSensorReader(sensor: .ambientLightSensor)

// Request authorization for multiple sensors at once
SRSensorReader.requestAuthorization(
    sensors: [.ambientLightSensor, .accelerometer, .keyboardMetrics]
) { error in
    if let error {
        print("Authorization request failed: \(error)")
    }
}

Use one status handler both for the initial check and delegate changes:

private func applyAuthorizationStatus(
    _ status: SRAuthorizationStatus,
    to reader: SRSensorReader
) {
    switch status {
    case .authorized:
        reader.startRecording()
    case .denied:
        reader.stopRecording()
        // Direct the user to Settings > Privacy > Research Sensor & Usage Data.
    case .notDetermined:
        break // Request authorization first.
    @unknown default:
        break
    }
}

applyAuthorizationStatus(reader.authorizationStatus, to: reader)

func sensorReader(_ reader: SRSensorReader, didChange authorizationStatus: SRAuthorizationStatus) {
    applyAuthorizationStatus(authorizationStatus, to: reader)
}

Available Sensors

Load the Sensor Catalog to map each SRSensor to its sample type. Request only sensors approved for the study and recheck the selected sensor's availability and usage-detail key.

SRSensorReader

SRSensorReader is the central class for accessing sensor data. Each instance reads from a single sensor.

import SensorKit

// Create a reader for one sensor
let lightReader = SRSensorReader(sensor: .ambientLightSensor)
let keyboardReader = SRSensorReader(sensor: .keyboardMetrics)

// Assign delegate to receive callbacks
lightReader.delegate = self
keyboardReader.delegate = self

The reader communicates through SRSensorReaderDelegate. Load the Delegate Method Catalog when wiring the complete authorization, recording, device-fetch, and sample-fetch lifecycle.

Recording and Fetching Data

Start and Stop Recording

// Begin recording -- sensor stays active as long as any app has a stake
reader.startRecording()

// Stop recording -- framework deactivates the sensor when
// no app or system process is using it
reader.stopRecording()

Fetch Data

Build an SRFetchRequest with a time range and target device, then pass it to the reader:

let request = SRFetchRequest()
request.device = SRDevice.current
request.from = SRAbsoluteTime(CFAbsoluteTimeGetCurrent() - 86400 * 2)  // 2 days ago
request.to = SRAbsoluteTime.current()

reader.fetch(request)

Receive results through the delegate:

func sensorReader(
    _ reader: SRSensorReader,
    fetching request: SRFetchRequest,
    didFetchResult result: SRFetchResult<AnyObject>
) -> Bool {
    let timestamp = result.timestamp

    switch reader.sensor {
    case .ambientLightSensor:
        if let sample = result.sample as? SRAmbientLightSample {
            let lux = sample.lux
            let chromaticity = sample.chromaticity
            let placement = sample.placement
            processSample(lux: lux, chromaticity: chromaticity, at: timestamp)
        }
    case .keyboardMetrics:
        if let sample = result.sample as? SRKeyboardMetrics {
            let words = sample.totalWords
            let speed = sample.typingSpeed
            processKeyboard(words: words, speed: speed, at: timestamp)
        }
    case .deviceUsageReport:
        if let sample = result.sample as? SRDeviceUsageReport {
            let wakes = sample.totalScreenWakes
            let unlocks = sample.totalUnlocks
            processUsage(wakes: wakes, unlocks: unlocks, at: timestamp)
        }
    default:
        break
    }

    return true  // Return true to continue receiving results
}

func sensorReader(_ reader: SRSensorReader, didCompleteFetch request: SRFetchRequest) {
    print("Fetch complete for \(reader.sensor)")
}

func sensorReader(
    _ reader: SRSensorReader,
    fetching request: SRFetchRequest,
    failedWithError error: any Error
) {
    print("Fetch failed: \(error)")
}

Cast result.sample to the sample shape for the reader's sensor. Some streams return one object per result, while recorded motion, ECG, PPG, and ambient pressure streams can return arrays of recorded samples.

Data Holding Period

SensorKit imposes a 24-hour holding period on newly recorded data. Fetch requests whose time range overlaps this period return no results. Design data collection workflows around this delay.

SRDevice

SRDevice identifies the hardware source for sensor samples. Use it to distinguish data from iPhone versus Apple Watch.

// Get the current device
let currentDevice = SRDevice.current
print("Model: \(currentDevice.model)")
print("System: \(currentDevice.systemName) \(currentDevice.systemVersion)")

// Fetch all available devices for a sensor
reader.fetchDevices()

Handle fetched devices through the delegate:

func sensorReader(_ reader: SRSensorReader, didFetch devices: [SRDevice]) {
    for device in devices {
        let request = SRFetchRequest()
        request.device = device
        request.from = SRAbsoluteTime(CFAbsoluteTimeGetCurrent() - 86400)
        request.to = SRAbsoluteTime.current()
        reader.fetch(request)
    }
}

func sensorReader(_ reader: SRSensorReader, fetchDevicesDidFailWithError error: any Error) {
    print("Failed to fetch devices: \(error)")
}

SRDevice Properties

PropertyTypeDescription
modelStringUser-defined device name
nameStringFramework-defined device name
systemNameStringOS name (iOS, watchOS)
systemVersionStringOS version
productTypeStringHardware identifier
currentSRDeviceClass property for the running device

Common Mistakes

DON'T: Attempt to use SensorKit without the entitlement

Obtain Apple's study approval, the sensor-specific entitlement values, and a matching manual provisioning profile before constructing production readers.

DON'T: Expect immediate data access

Apply the Data Holding Period; a fetch overlapping the hold is not proof that recording failed.

DON'T: Forget to set the delegate before fetching

Assign the delegate before startRecording() or fetch(_:); results and failures arrive through delegate callbacks.

DON'T: Skip per-sensor Info.plist usage detail

Add the exact Info.plist Configuration usage-detail entry for every requested sensor.

DON'T: Ignore SRError codes

Distinguish at least .invalidEntitlement, .noAuthorization, .dataInaccessible, .fetchRequestInvalid, .promptDeclined, and unknown future codes. Load the Full Delegate Implementation for the complete switch and callback wiring.

Review Checklist

  • Apple-approved research study in place before development
  • com.apple.developer.sensorkit.reader.allow entitlement lists only needed sensors
  • Manual provisioning profile with explicit App ID and SensorKit capability
  • NSSensorKitUsageDescription in Info.plist with clear study purpose
  • NSSensorKitPrivacyPolicyURL in Info.plist with valid privacy policy URL
  • NSSensorKitUsageDetail entries for every requested sensor
  • Required key set appropriately for essential vs. optional sensors
  • Authorization requested before recording, status checked before fetching
  • Delegate assigned before calling startRecording() or fetch(_:)
  • Fetch request time ranges account for 24-hour data holding period
  • SRError codes handled in all failure delegate methods
  • fetchDevices() used to discover available devices before fetching
  • stopRecording() called when data collection is complete
  • sensorReader(_:fetching:didFetchResult:) returns true to continue or false to stop

References

发现问题?提交给管理员复核

评分:

评论 (0)

暂无评论,成为第一个评论者吧!